Tru*_*ill 11 c# data-binding enums datagridview winforms
这是一个类似于如何将自定义枚举描述绑定到DataGrid的问题,但在我的情况下,我有多个属性.
public enum ExpectationResult
{
[Description("-")]
NoExpectation,
[Description("Passed")]
Pass,
[Description("FAILED")]
Fail
}
public class TestResult
{
public string TestDescription { get; set; }
public ExpectationResult RequiredExpectationResult { get; set; }
public ExpectationResult NonRequiredExpectationResult { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我将BindingList <TestResult>绑定到WinForms DataGridView(实际上是DevExpress.XtraGrid.GridControl,但通用解决方案将更广泛适用).我希望描述出现而不是枚举名称.我怎么能做到这一点?(class/enum/attributes没有约束;我可以随意更改它们.)
Mar*_*ell 10
A TypeConverter
通常会做这个工作; 这里有一些适用的代码DataGridView
- 只需添加代码来阅读描述(通过反射等 - 我现在只使用字符串前缀来显示自定义代码的工作原理).
请注意,您可能也想要覆盖ConvertFrom
.可以在类型或属性级别指定转换器(如果您只希望它应用于某些属性),并且如果枚举不在您的控制之下,也可以在运行时应用.
using System.ComponentModel;
using System.Windows.Forms;
[TypeConverter(typeof(ExpectationResultConverter))]
public enum ExpectationResult
{
[Description("-")]
NoExpectation,
[Description("Passed")]
Pass,
[Description("FAILED")]
Fail
}
class ExpectationResultConverter : EnumConverter
{
public ExpectationResultConverter()
: base(
typeof(ExpectationResult))
{ }
public override object ConvertTo(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value,
System.Type destinationType)
{
if (destinationType == typeof(string))
{
return "abc " + value.ToString(); // your code here
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
public class TestResult
{
public string TestDescription { get; set; }
public ExpectationResult RequiredExpectationResult { get; set; }
public ExpectationResult NonRequiredExpectationResult { get; set; }
static void Main()
{
BindingList<TestResult> list = new BindingList<TestResult>();
DataGridView grid = new DataGridView();
grid.DataSource = list;
Form form = new Form();
grid.Dock = DockStyle.Fill;
form.Controls.Add(grid);
Application.Run(form);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这有多大帮助,但我在Enum上使用了一个扩展方法,如下所示:
/// <summary>
/// Returns the value of the description attribute attached to an enum value.
/// </summary>
/// <param name="en"></param>
/// <returns>The text from the System.ComponentModel.DescriptionAttribute associated with the enumeration value.</returns>
/// <remarks>
/// To use this, create an enum and mark its members with a [Description("My Descr")] attribute.
/// Then when you call this extension method, you will receive "My Descr".
/// </remarks>
/// <example><code>
/// enum MyEnum {
/// [Description("Some Descriptive Text")]
/// EnumVal1,
///
/// [Description("Some More Descriptive Text")]
/// EnumVal2
/// }
///
/// static void Main(string[] args) {
/// Console.PrintLine( MyEnum.EnumVal1.GetDescription() );
/// }
/// </code>
///
/// This will result in the output "Some Descriptive Text".
/// </example>
public static string GetDescription(this Enum en)
{
var type = en.GetType();
var memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((DescriptionAttribute)attrs[0]).Description;
}
return en.ToString();
}
Run Code Online (Sandbox Code Playgroud)
您可以在对象上使用自定义属性getter来返回名称:
public class TestResult
{
public string TestDescription { get; set; }
public ExpectationResult RequiredExpectationResult { get; set; }
public ExpectationResult NonRequiredExpectationResult { get; set; }
/* *** added these new property getters *** */
public string RequiredExpectationResultDescr { get { return this.RequiredExpectationResult.GetDescription(); } }
public string NonRequiredExpectationResultDescr { get { return this.NonRequiredExpectationResult.GetDescription(); } }
}
Run Code Online (Sandbox Code Playgroud)
然后将网格绑定到"RequiredExpectationResultDescr"和"NonRequiredExpectationResultDescr"属性.
这可能有点过于复杂,但它是我提出的第一件事:)
归档时间: |
|
查看次数: |
9376 次 |
最近记录: |