C#Winforms。我上课了。它有一些公共成员变量。我想在两列的表中显示类的不同成员的值。第一列是成员名称,第二列是值。
注意:我没有这些的集合,只有一个,所以我不想要DataGridView。
理想情况下,我想要一个可以绑定我的类的控件,然后将第一列的显示文本更改为每个成员可读的内容。此外,成员的值将在程序执行期间更改,并且表应相应更新。
我没有看到方便的控制 - 或者我错过了什么?看起来很基本。
答案 0 :(得分:2)
您的最终结果将是一个表,其中表中的每一行都有两个单元格:成员名称和值。
值可以是任何类型的对象,显示的值必须是字符串。如果你想在其他类型中显示一些值,那么就是字符串,例如图片,颜色,象形文字等等,你需要从值到DisplayValue进行一些转换。
class DisplayValue
{
public string Description{get; set;}
public object Value {get; set;}
public string DisplayedValue {get {return this.Value.ToString();} }
}
所以你有一个某种类型的对象,并且你想要显示这个对象的一系列属性。:
MyType myObject = ...
IEnumerable<PropertyInfo> propertiesToDisplay = typeof<MyType>.GetProperties()
.Where(propertyInfo => propertyInfo.CanRead);
IEnumerable<DisplayValue> displayValues = propertiesToDisplay
.Select(property => new DisplayValue()
{
Description = property.Name,
Value = property.GetValue(myObject),
});
如果您不想显示所有属性,只显示具有特定名称的属性:
IEnumerable<string> propertyNames = new string[]
{
"Id", "FirstName", "MiddleName", "LastName",
"Street", "City", "PostCode",
};
IEnumerable<PropertyInfo> propertiesToDisplay = propertyNames
.Select(propertyName => typeof<Student>.GetProperty(propertyName));
要在DataGridView中显示它们,最简单的方法是使用设计器:
每当您准备好显示值时,例如表单加载时:
MyType objectToDisplay = ...
IEnumerable<PropertyInfo> propertiesToDisplay = ...
IEnumerable<DisplayValues> valuesToDisplay = propertiesToDisplay
.Select(property => new DisplayValue()
{
Description = property.Name,
Value = property.GetValue(myObject),
});
this.BindingSource1.DataSource = new BindingList<DisplayValue>(valuesToDisplay.ToList());
这就是它的全部内容。简单的祝贺!