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

问题描述:

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

 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。尽管我仍然可以像这样做,但似乎还需要更多的代码行。任何建议在更好的方式?

+1

使用策略模式。 – MoonKnight

+1

循环遍历容器中的所有控件(面板),如果名称不匹配,则使它们不可见? – davisoa

您可以尝试利用节点的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); 
    } 
} 

如何把在树节点的标签属性的控件,然后选择树节点时,相应的控制权在你的指尖。 ..

标记是Object类型的,所以它可以容纳一个引用。显然你需要投。