如何在数据绑定期间自定义datagridview中的数据格式

我正在寻找一种格式化DataGridViewTextBoxColumn的方法,以便在数据绑定期间格式化数据绑定的值。 例如,我有一个CompanyName属性,当数据绑定发生时,我需要从CompanyName获取前5个字母。

我可以挂钩不同的DataGridView事件(例如RowsAdded)并循环遍历所有行并执行操作,但我想找到更复杂的方法来执行此操作。 由于我已决定使用数据绑定,因此循环数据并对其进行修改有点违背了数据绑定概念。

我所追求的是如何做到如下,但添加自定义格式逻辑:

dataGridView1.Columns[colSomeDate.Index].DataPropertyName = "SomeDate"; colSomeDate.DefaultCellStyle.Format = "yyyy"; 

我想我应该实现IFormatProvider,但我不太明白我应该如何实现它。

 dataGridView1.Columns[companyName.Index].DataPropertyName = "CompanyName"; companyName.DefaultCellStyle.FormatProvider = new ShortText(); // ShortText should implement IFormatProvider 

我不知道IFormatProvider,但DataGridViews CellFormatting事件可以帮助你吗?

 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

向您的类中添加一个属性,为您执行子串,并绑定到该属性。

这是我为了让我的工作而做的

 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; } } 

这是我然后放入我的单元格格式处理程序

 //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; } 

听起来像IFormatProvider正是您所需要的。 然后,您可以为不同视图的不同格式定义不同的代码。

来自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. } 

这是我用于实现IFormattableICustomFormatter的示例的代码片段。

 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 

你总是可以从你的aspx页面调用这样的自定义格式函数:

        

然后在该页面的代码后面:

 protected string GetImagePath(object abbr){ return string.Format("{0}{1}.gif", Constants.URLs.PLATFORM_LOGOS, abbr.ToString());} 

我通常使用ValueConverters来实现这种行为。

就像是:

  

在control / page的resources节点中,您需要添加以下内容:

  

CompanyNameShortenerConverter应该实现IValueConverter,您可以添加逻辑以“缩短”在“转换”方法中传入的公司名称。

这使格式/ UI逻辑与业务逻辑分离(即不需要添加缩短名称的“辅助属性”)。