How to custom format data in datagridview during databinding

前端 未结 7 766
忘掉有多难
忘掉有多难 2020-12-16 14:21

I\'m looking for a way to format DataGridViewTextBoxColumn so that the value to be databinded is formatted during databinding. For example I have a CompanyName property and

相关标签:
7条回答
  • 2020-12-16 14:59

    This is a code snippet I use for an example of implementing IFormattable and ICustomFormatter.

    Implements IFormattable
    Implements ICustomFormatter
    
    Public Function Format(ByVal formatExpression As String, ByVal arg As Object, ByVal formatProvider As System.IFormatProvider) As String Implements System.ICustomFormatter.Format
        'type is currently ignored
        '   if type is international then "USPS" should result in international address
        '   if type is international then "US" should result in international address
        '   and so on
        '
    
        '.NET Framework Class Library
        'IFormattable Interface
        'Remarks - A class that implements IFormattable must support the "G" (general) formatting code. Besides the "G" code, the class can define the list of formatting codes that it supports.
    
        'is G and g the same?
        '   yes for numeric
        '   no for date/time
    
        'Standard Numeric Format Strings
        '   G or g - both are the same
        'Standard DateTime Format Strings
        '   g - General date/time pattern (short time)
        '   G - General date/time pattern (long time)
    
    
        If Len(formatExpression) = 0 Then
            Return String.Format("{0}", arg)
        End If
    
        'usps - standardized
        'us - address less country
        'international - all address lines
    
        If formatExpression.Equals("g") Then
            'general formatting code
            '   as per documentation
            Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.StandardUS)
    
        ElseIf formatExpression.Equals("G") Then
            'general formatting code
            '   as per documentation
            Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.Standardized)
    
        ElseIf formatExpression.ToUpper.Equals("USPS") Then
            Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.Standardized)
    
        ElseIf formatExpression.ToUpper.Equals("US") Then
            Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.StandardUS)
    
        ElseIf formatExpression.ToUpper.Equals("INTERNATIONAL") Then
            Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.International)
    
        Else
            Return MyBase.ToString()
    
        End If
    
    End Function
    
    Public Overloads Function ToString(ByVal format As String, ByVal formatProvider As System.IFormatProvider) As String Implements System.IFormattable.ToString
        Return Me.Format(format, Nothing, formatProvider)
    End Function
    
    0 讨论(0)
  • 2020-12-16 15:01

    Here is what I did to get mine to work

    public class MyFormatProvider : IFormatProvider, ICustomFormatter  
    {  
       public object GetFormat(Type formatType)  
       {  
         if (formatType == typeof(ICustomFormatter))  
            return this;  
         else  
            return null;  
       }  
    
       public string Format(string format, object arg, IFormatProvider formatProvider)  
       {  
         // Check whether this is an appropriate callback               
         if (!this.Equals(formatProvider))  
            return null;  
    
         //if argument/ value is null we return empty string  
         if (arg == null)  
            return null;  
    
         string resultString = arg.ToString();  
    
         //transform resultString any way you want (could do operations based on given format parameter)  
    
         //return the resultant string  
         return resultString;  
       }  
    }  
    

    This is what i then put in my cell formatting handler

    //In your datagridview, handle the cell formatting event in required cell as  
    if (e.ColumnIndex == dgvPayments.Columns["amount"].Index)  
    {  
      e.Value = String.Format(new MyFormatProvider (), "{0:U}", e.Value);  
      e.FormattingApplied = true;  
    }  
    
    0 讨论(0)
  • 2020-12-16 15:02

    Add a property to your class that does the substringing for you, and bind to that.

    0 讨论(0)
  • 2020-12-16 15:04

    You could always call a custom format function like so from your aspx page:

    <asp:GridView ID="gvPlatforms" runat="server" AutoGenerateColumns="false"
              GridLines="None">
    <Columns>
        <asp:TemplateField HeaderText="Icon">
            <ItemTemplate>
                <asp:Image ID="imgPlatformLogo" runat="server" ImageUrl='<%#GetImagePath(Eval("Abbr")) %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    

    And then in your code behind for that page:

    protected string GetImagePath(object abbr){
    return string.Format("{0}{1}.gif", Constants.URLs.PLATFORM_LOGOS, abbr.ToString());}
    
    0 讨论(0)
  • 2020-12-16 15:09

    I don't know about the IFormatProvider, but can the DataGridViews CellFormatting-event help you?

    private void dataGridView1_CellFormatting(object sender,
        DataGridViewCellFormattingEventArgs e)
    {
        if (e.ColumnIndex == 0)
        {
            e.Value = e.Value.ToString().Substring(0, 5); // apply formating here
            e.FormattingApplied = true;
        }
    }
    

    http://msdn.microsoft.com/en-us/library/z1cc356h.aspx?ppud=4

    0 讨论(0)
  • 2020-12-16 15:13

    It sounds like IFormatProvider is exactly what you need. Then you can define different codes for the different formats you want for the different views.

    From Codeproject.

    public override string ToString()
    {
        return ToString("g", null); // Always support "g" as default format.
    }
    
    public string ToString(string format)
    {
      return ToString(format, null);
    }
    
    public string ToString(IFormatProvider formatProvider)
    {
      return ToString(null, formatProvider);
    }
    
    public string ToString(string format, IFormatProvider formatProvider)
    {
      if (format == null) format = "g"; // Set default format, which is always "g".
      // Continue formatting by checking format specifiers and options.
    }
    
    0 讨论(0)
提交回复
热议问题