如何在 C# 中创建树视图首选项对话框类型的界面?

Posted

技术标签:

【中文标题】如何在 C# 中创建树视图首选项对话框类型的界面?【英文标题】:How to create a tree-view preferences dialog type of interface in C#? 【发布时间】:2010-09-05 10:43:25 【问题描述】:

我正在编写一个基本上只是一个首选项对话框的应用程序,很像 Visual Studio 本身使用的树视图首选项对话框。该应用程序的功能只是将数据从串行设备传递到文件。它在将数据写入文件之前对数据执行了很多很多转换,因此应用程序的 GUI 只是指示这些转换应该是什么的所有设置。

设计/编码树视图首选项对话框的最佳方法是什么?我一直在做的方式是在左侧构建带有停靠树控件的主窗口。然后我一直在创建与树的每个节点相对应的容器控件。当一个节点被选中时,应用程序将该节点对应的容器控件置于最前面,将其移动到正确的位置,并在主窗口中将其最大化。这在设计时看起来非常非常笨拙。这基本上意味着我在设计期间在主窗口边缘之外有大量容器控件,我必须不断滚动主窗口才能使用它们。我不知道这是否完全符合我写这篇文章的方式,但也许我正在谈论的这个视觉效果会更有意义:

基本上,我必须使用这个巨大的表单,到处都是容器控件,然后进行大量运行时重新格式化以使其全部正常工作。这似乎是很多的额外工作。我这样做是完全愚蠢的吗?是否有一些我缺少的“明显”更简单的方法?

【问题讨论】:

【参考方案1】:

一种更简洁的方法是为每个“窗格”创建单独的表单,并在每个表单构造函数中设置

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

这样,这些表单中的每一个都可以在自己的设计器中布局,在运行时实例化一次或多次,然后像普通控件一样添加到空白区域。

也许主表单可以在一个面板中使用带有静态TreeViewSplitContainer,并在另一个面板中使用空间来添加这些表单。添加后,可以使用Hide/ShowBringToFront/SendToBack 方法进行翻阅。

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();

【讨论】:

【参考方案2】:

格雷格·赫尔曼写道:

为什么不在网格中选择节点时只显示/隐藏适当的容器?让容器在同一位置的大小都适当,并隐藏除默认值之外的所有容器,默认值将在加载时在网格中预先选择。

不幸的是,这就是我想要避免的。我正在寻找一种在设计时处理界面的简单方法,只需最少的重新格式化代码即可使其在运行时工作。

我喜欢 Duncan 的回答,因为这意味着每个节点的界面设计都可以完全分开。这意味着我不会在捕捉指南和其他设计时间优势上重叠。

【讨论】:

【参考方案3】:

我可能会基于继承 CustomControl 的基类创建几个面板类。然后这些控件将具有诸如保存/加载之类的方法和类似的东西。如果是这样,我可以单独设计每个面板。

我使用了一个在设计模式下处理多个页面的向导控件,因此可以在设计器中单击下一步并通过设计器一次设计所有页面。尽管在将代码连接到控件时这有几个缺点,但这可能意味着您可以通过构建一些设计器类来进行类似的设置。我自己从未在 VS 中编写过任何设计器类,所以我不能说如何或是否值得:-)

我有点好奇您打算如何处理向/从控件加载/保存值?如果你的所有页面都在一个大Form中,那么一个类中一定有很多代码?

另一种方法当然是在请求每个页面时生成 gui 代码,使用有关设置类型的信息。

【讨论】:

以上是关于如何在 C# 中创建树视图首选项对话框类型的界面?的主要内容,如果未能解决你的问题,请参考以下文章

EditPlus 编辑器如何自动补全啊??

在 PyQt 中实现首选项对话框窗口

怎么给word文档里的英文字母改为首字母大写

用adobe reader 打开一个pdf文档,点击了文档里链接到本文档的链接,如何回到上一个位置

怎样在文件夹选项中创建关联

在plsql中输出SQL语句