我有一个对象,用于保存模拟的输出数据。我想用该对象的公共属性填充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的原因是,我可以配置拖放功能,使我可以将数据参数(例如,地板温度)拖动到另一个控件(例如绘图或表格)上,以便可以显示数据。希望对您有所帮助。
最佳答案
对于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
关于c# - 如何使用类变量填充树形 View (Windows Forms),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17327447/