【发布时间】:2010-02-13 06:12:46
【问题描述】:
我遇到了 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) 或类别 (Category) - 通过覆盖其他RowWrapperDescriptor 中的成员。”作为他帖子的结尾注释,我想知道有没有办法做到这一点。
非常感谢任何理论建议。非常感谢。
【问题讨论】:
-
退后一步可能是个好主意;你想要达到的效果是什么?所以:你有一个
DataTable;你想...? [此处填空...]。 -
“执行此操作的方法”完全如前所述;覆盖
IsReadOnly或DisplayName等。DataGridView中没有“类别”。对于下拉列表,我怀疑您必须通过更改列的DataGridView属性来手动执行此操作(可能手动将列添加为下拉列);但如果没有关于什么是/不工作的更多信息,很难更具体。
标签: c# winforms propertygrid datarow