构建类似于VS选项对话框的选项对话框

时间:2012-12-04 15:51:50

标签: .net vb.net winforms user-interface windows-forms-designer

我已经阅读了this question,其中谈到了同样的事情,但我有一个关于设计的具体问题。如您所知,VS中的选项对话框是左侧的TreeView控件,右侧是控件的面板,其中包含当前TreeView控件选择的所有选项。基于上述问题中给出的建议,我决定为每个“面板”选项构建一个UserControl。当用户在TreeView中选择特定节点时,我正在尝试确定使所选面板可见并且隐藏所有其他面板的最佳方法。在我的事件处理程序中,当选择TreeView中的新节点时,请执行以下操作:

        If e.Node.Name.CompareTo("PanelAName") = 0 Then
            PanelA.Visible = True
            PanelA.Enabled = True

            PanelB.Visible = False
            PanelB.Enabled = False

        ElseIf e.Node.Name.CompareTo("PanelBName") = 0 Then
            PanelA.Visible = False
            PanelA.Enabled = False

            PanelB.Visible = True
            PanelB.Enabled = True

        End If

唯一的问题是只有示例代码中的两个面板,我将有15-25。虽然我当然可以这样做,但似乎需要更多的代码行。有关更好方法的任何建议吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用节点的Tag属性来保存关联面板的名称,然后尝试循环表单中的面板并将节点名称与面板名称进行比较:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
  foreach (Panel p in this.Controls.OfType<Panel>()) {
    if (p.Name == e.Node.Tag.ToString()) {
      p.Visible = true;
    } else {
      p.Visible = false;
    }
  }
}

您可以将每个面板的引用添加到节点的标记属性中:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
  foreach (Panel p in this.Controls.OfType<Panel>()) {
    p.Visible = e.Node.Tag.Equals(p);
  }
}

答案 1 :(得分:1)

如何将控件放在treenode的标签属性中,然后当选择treenode时,适当的控件就在您的指尖...

标记的类型为Object,因此它可以保存引用。显然,你需要施展。