3

我有一个用于保存模拟输出数据的对象。我想用这个对象的公共属性填充 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 的原因是我可以配置拖放功能,允许我将数据参数(例如地板温度)拖到另一个控件(例如绘图或表格)上,这样可以呈现数据。我希望这会有所帮助。

4

1 回答 1

1

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

PropertyGrid 控件的示例
(来源:microsoft.com

(来源:充分利用 .NET Framework PropertyGrid 控件

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

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

我自己没有尝试过,但我相信 PropertyGrid 对 Drag'n'Drop 的支持缺乏,正如这篇文章所证明的那样:
C# PropertyGrid drag drop

于 2013-06-26T18:45:00.030 回答