【问题标题】:About Marc Gravell's RowWrapperDescriptor for binding System.Data.Rows to PropertyGrid关于 Marc Gravell 用于将 System.Data.Rows 绑定到 PropertyGrid 的 RowWrapperDescriptor
【发布时间】:2010-02-13 06:12:46
【问题描述】:

我遇到了 Marc Gravellelegant 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;你想...? [此处填空...]。
  • “执行此操作的方法”完全如前所述;覆盖IsReadOnlyDisplayName 等。DataGridView 中没有“类别”。对于下拉列表,我怀疑您必须通过更改列的 DataGridView 属性来手动执行此操作(可能手动将列添加为下拉列);但如果没有关于什么是/不工作的更多信息,很难更具体。

标签: c# winforms propertygrid datarow


【解决方案1】:

感谢马克的回复...

是这样的;假设我们的业务需求具有以下 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 中显示为下拉值列表。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2017-03-31
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多