C#Winforms将单个对象表示为表

时间:2018-02-23 00:44:27

标签: c# winforms class display tabular

C#Winforms。我上课了。它有一些公共成员变量。我想在两列的表中显示类的不同成员的值。第一列是成员名称,第二列是值。

注意:我没有这些的集合,只有一个,所以我不想要DataGridView。

理想情况下,我想要一个可以绑定我的类的控件,然后将第一列的显示文本更改为每个成员可读的内容。此外,成员的值将在程序执行期间更改,并且表应相应更新。

我没有看到方便的控制 - 或者我错过了什么?看起来很基本。

1 个答案:

答案 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中显示它们,最简单的方法是使用设计器:

  • 添加BindingSource
  • BindingSource.DataSource = DisplayValue
  • 添加DataGridView
  • DataGridView.BindingSource = bindingSource1
  • 添加列:一个用于描述,一个用于DisplayedValue

每当您准备好显示值时,例如表单加载时:

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());

这就是它的全部内容。简单的祝贺!