C# 如何在数据绑定期间自定义数据网格视图中的数据格式
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2117210/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to custom format data in datagridview during databinding
提问by Clack
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 I need to take first 5 letters from the CompanyName when databinding happens.
我正在寻找一种格式化 DataGridViewTextBoxColumn 的方法,以便在数据绑定期间格式化要绑定的值。例如,我有一个 CompanyName 属性,当数据绑定发生时,我需要从 CompanyName 中获取前 5 个字母。
I could hook on different DataGridView events (e.g. RowsAdded) and loop through all the rows and do the trick, but I'd like to find more sophisticated way to do this. Since I have decided to use databinding, looping through data and modifying it is a bit against the databinding concept.
我可以挂钩不同的 DataGridView 事件(例如 RowsAdded)并遍历所有行并执行此操作,但我想找到更复杂的方法来执行此操作。由于我已经决定使用数据绑定,循环遍历数据并修改它有点违反数据绑定概念。
What I'm after, is how to do the same as below, but add custom formatting logic:
我所追求的是如何执行与下面相同的操作,但添加自定义格式逻辑:
dataGridView1.Columns[colSomeDate.Index].DataPropertyName = "SomeDate";
colSomeDate.DefaultCellStyle.Format = "yyyy";
I think I should implement IFormatProvider, but I don't quite understand how I should implement it.
我想我应该实现 IFormatProvider,但我不太明白我应该如何实现它。
dataGridView1.Columns[companyName.Index].DataPropertyName = "CompanyName";
companyName.DefaultCellStyle.FormatProvider = new ShortText(); // ShortText should implement IFormatProvider
回答by leppie
Add a property to your class that does the substringing for you, and bind to that.
向您的类添加一个为您执行子串的属性,并绑定到该属性。
回答by Joshua
You could always call a custom format function like so from your aspx page:
您始终可以从 aspx 页面调用自定义格式函数,如下所示:
<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());}
回答by Trond
I don't know about the IFormatProvider, but can the DataGridViews CellFormatting-event help you?
我不知道 IFormatProvider,但是 DataGridViews CellFormatting-event 可以帮助您吗?
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
http://msdn.microsoft.com/en-us/library/z1cc356h.aspx?ppud=4
回答by AMissico
This is a code snippet I use for an example of implementing IFormattable
and ICustomFormatter
.
这是我用于实现IFormattable
和的示例的代码片段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
回答by cozykozy
I generally use ValueConverters for this sort of behavior.
我通常将 ValueConverters 用于这种行为。
something like:
就像是:
<DataGridTextColumn Binding={Binding CompanyName, Converter={StaticResource CompanyNameShortenerConverter}} />
In the control/page's resources node, you'll need to add something like:
在控件/页面的资源节点中,您需要添加如下内容:
<local:CompanyNameConverter x:Key="CompanyNameShortenerConverter" />
CompanyNameShortenerConverter should implement IValueConverter, and you can add the logic to "shorten" the company names passed in in the "Convert" method.
CompanyNameShortenerConverter 应该实现 IValueConverter,您可以添加逻辑以“缩短”在“Convert”方法中传入的公司名称。
This keeps the formatting/UI logic separate from the business logic (i.e. no need to add a "helper property" that shortens the name).
这使格式化/UI 逻辑与业务逻辑分离(即无需添加缩短名称的“辅助属性”)。
回答by Johann Strydom
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.
听起来 IFormatProvider 正是您所需要的。然后,您可以为不同视图所需的不同格式定义不同的代码。
From Codeproject.
来自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.
}
回答by nemesisfixx
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;
}