0

我遇到了Marc Gravell对 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) 或类别 (Category) - 通过覆盖 RowWrapperDescriptor 中的其他成员. ”作为他帖子的结尾注释,我想知道有没有办法做到这一点。

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

4

1 回答 1

0

感谢您的回复马克...

就像这样; 假设我们的业务需求具有以下 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 类,它可以完美运行。但是,对于表列之一“组织学”,propertyGrid1 应显示一个可编辑的下拉列表,其中包含以下列表:{“苏木精”、“曙红”、“甲苯胺蓝”、“高碘酸-席夫染色” }。本质上,管理层正在考虑用从数据库中查询的值填充这个下拉列表(这可能是我们要做的),但基本上,我的问题是让 propertyGrid1 中的“组织学”字段成为一个下拉列表-下列表。由于 propertyGrid1 使用包装器来包装从数据表的列派生的字段,因此我不知道该怎么做。

即使我将组织学的 DataGridView 列更改为下拉列表,它也不会起作用,因为就像我说的那样,只会显示表格的 2 列( MedSequence 和 Prognosis ),而所有其他列只能通过propertyGrid1,Histology 是一个特例,因为它必须在 propertyGrid1 中显示为下拉值列表。

于 2010-02-15T01:18:23.037 回答