关于Marc Gravell的RowWrapperDescriptor,用于将System.Data.Rows绑定到PropertyGrid

时间:2010-02-13 06:12:47

标签: c# winforms propertygrid datarow

我遇到了 Marc Gravell elegant and witty solution来解决Matt发布的问题(标题为“ C#/winforms: how to best bind a propertygrid and a System.Data.DataRow ”),并使用过我的一个应用程序中的解决方案。

使用Marc代码的一些摘录:

    DataTable table = new DataTable();
    table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Foo", typeof(int));
    table.Columns.Add("Bar", typeof(string));
    table.Columns.Add("Audit", typeof(DateTime));

    table.Rows.Add(1, 14, "abc", DateTime.MinValue);
    DataRow row = table.Rows.Add(2,13,"def", DateTime.MinValue);
    table.Rows.Add(3, 24, "ghi", DateTime.MinValue);

    RowWrapper wrapper = new RowWrapper(row);
    wrapper.Exclude.Add("ID");
    wrapper.Exclude.Add("Bar");

我能够以某种方式使用DataGridView进行此操作; DataGridView使用表作为它的源,而DataGridView上的每一行上的每次单击都将被设置为propertyGrid1的SelectedObject(使用Marc的RowWrapper),并且它完美地工作。您可能会问为什么我这样做,这意味着同时使用DataGridView和PropertyGrid;事实上,业务需求和狭隘的管理政策。

无论如何,我现在又有了另一个困境;表中的一个列,比如说“Foo”(顺便说一下,它在PropertyGrid中显示为其中一个字段),应该是PropertyGrid中的某种下拉列表。我的意思是,“Foo”应该是一个组合框,其中包含从另一个DataTable派生的项目列表。另外,有没有办法为每个字段项包含某种描述?

可以这样做吗? Marc Gravell提到类似“注意你可以在这个区域做其他事情来使一些属性不可编辑(IsReadOnly),或者有不同的标题(DisplayName)或类别(类别) - 通过覆盖其他RowWrapperDescriptor中的成员。“作为他的帖子的结尾注释,我想知道是否有办法做到这一点。

非常感谢任何理论建议。非常感谢。

1 个答案:

答案 0 :(得分:0)

感谢Marc的回应......

就像这样;假设我们的业务需求具有以下DataTable设置:

DataTable table = new DataTable();

table.Columns.Add("ID", typeof(int));
table.Columns.Add("MedSequence", typeof(int));
table.Columns.Add("Prognosis", typeof(string));
table.Columns.Add("RBC", typeof(string));
table.Columns.Add("WBC", typeof(string));
table.Columns.Add("BP Normal", typeof(bool);
table.Columns.Add("Histology", typeof(string));

DataRow row = table.Rows.Add(559,6845,"Progressive decline","54–62pcnt","6.1 million/uL",true,"Haematoxylin");

我将dataGridView1的数据源设置为“table”,而在datagridview的每个cellcontentclick上,将propertyGrid1的SelectedObject设置为dataGridView中的“当前”选定行。从某种意义上说,要求是dataGridView1应该只显示2列:MedSequence和Prognosis,而DataTable表中的其余列对用户是不可见的。

但是,propertyGrid1应该将表中的所有列显示为属性。因此,预期的效果是DataGridView只是作为显示的手段(MedSequence和Prognosis列),而其他表值的编辑由propertyGrid1处理。

就像我在帖子中说的那样,使用你的RowWrapper类,它完美无缺。但是,对于其中一个表格列“Histology”,propertyGrid1应显示一个可编辑的下拉列表,其中包含以下列表:{“苏木精”,“曙红”,“甲苯胺蓝”,“周期酸 - 席夫染色” }。从本质上讲,管理层正在考虑将这个下拉列表填入由数据库查询的值(这可能是我们要做的),但基本上,我的问题是将propertyGrid1中的“组织学”字段变成一个drop-下面的清单。由于propertyGrid1使用的是从数据表的列派生的字段的包装器,因此我不知道该怎么做。

即使我将组织学的DataGridView列更改为下拉列表,它仍然无法工作,因为就像我说的那样,只会显示表中的2列(MedSequence和Prognosis),而所有其他列都可以编辑只能通过propertyGrid1,组织学是一种特殊情况,因为它必须在propertyGrid1中显示为下拉值列表。