【问题标题】:How to populate a Tree View with class variables (Windows Forms)如何使用类变量填充树视图(Windows 窗体)
【发布时间】:2013-06-26 18:11:00
【问题描述】:

我有一个用于保存模拟输出数据的对象。我想用这个对象的公共属性填充 TreeView,但是因为我觉得我可能会从这个对象中添加或删除成员,所以以某种方式“绑定”对象是有意义的,这样 TreeView 逻辑不需要使用对象的属性手动更新。

例如,假设我有一个名为Temperature 的类,如下所示:

public class Temperature
{
  public double Wall { get; set; }
  public double Floor { get; set; }

  public Temperature()
  {
    Wall = 0d;
    Floor = 0d;
  }
}

所以我希望 TreeView 有一个名为 Temperature 的根节点,然后是名为 Wall 和 Floor 的子节点。我目前的理解是对其进行硬编码,例如:

TreeNode tnTemperatureParent = treeViewData.Nodes.Add("Temperature");
tnTemperatureParent.Nodes.Add("Wall");
tnTemperatureParent.Nodes.Add("Floor");

现在,假设我必须将名为 Ceiling 的公共属性添加到 Temperature 类。我必须转到我的 TreeView 逻辑并添加一行以包含 Ceiling 的子节点。

对于小型数据集和原始数据类型,这一切似乎都很好,但我在这里需要更高程度的控制。我希望用来填充 TreeView 的对象最终将包含更多信息,例如我想用来绘制的列表。我正在查看大约 50 多个输出变量,可能会在完成之前决定我们需要更多或更少。

所以,总而言之,我想我在这里有两个问题:

A) 使用对象的公共属性填充 TreeView 的最佳方法是什么?
B) 我应该将数据存储为 TreeNodes 的一部分(例如,使用 Tag 属性)还是应该让树结构并行引用该对象?

编辑:我在整个面向对象范式方面还很陌生(从程序程序员开始),所以有时我很难进行可视化。这里有一些额外的信息可能有助于理解我的前进方向。

在我编写的模拟过程中,我将时间步长数量保存在“输出数据”类中。该类分为子类(例如温度、压力),每个子类都有一些参数(例如上例中的墙壁、地板、天花板)。我想将它们转储到 TreeView 的原因是我可以配置拖放功能,允许我将数据参数(例如地板温度)拖到另一个控件(例如绘图或表格)上,这样可以呈现数据。我希望这会有所帮助。

【问题讨论】:

标签: c# winforms data-binding treeview


【解决方案1】:

对于 Windows 窗体中的这种行为,我建议您使用 PropertyGrid control


(来源:microsoft.com

(来源:Getting the Most Out of the .NET Framework PropertyGrid Control

您只需将SelectedObject 属性设置为您的自定义对象,PropertyGrid 将自动发现您的类的属性。它还支持分层对象和编辑。某些类型(例如颜色)具有内置编辑器(如上所示)。

TreeView 不太适合这种自动绑定...尽管您可以编写自己的代码来使用reflection 为您执行绑定。

我自己没有尝试过,但我相信 PropertyGrid 对 Drag'n'Drop 的支持有所欠缺,这篇帖子证明了这一点:
C# PropertyGrid drag drop

【讨论】:

  • 我对使用 PropertyGrid 的担忧是实际财产的曝光。我不想将 TreeView 用作编辑器,而只是作为最终用户可用于绘图和制表的属性的摘要。每个属性实际上都是一个数值列表。
  • @Arclight - 在这种情况下,您需要使用反射(因为您绑定到类的结构而不是实例的值)。
  • 所以听起来好像我的目标是创建一个使用反射获取对象的方法,将其属性名称转换为 TreeNodes,然后通过标签将属性对象附加到节点(或 N4TKD 链接帖子中列出的其他两种方法之一)
  • @Arclight - 这可能是正确的。不幸的是,没有简单的解决方案——这实际上是一个相当复杂的要求。 (考虑stringint 类型也有属性,所以你需要过滤掉你的“基本类型”)
  • 其实我之前写过一些反射,目的是过滤掉特定的类型。由于最低级别的子节点都是相同的基本类型,因此循环遍历类并提取我需要的信息应该不会太难。当我得到一个工作版本时,我会在这里发布它作为反馈的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多