2012-12-04 93 views
1

我已經閱讀了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

回答

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

如何把在樹節點的標籤屬性的控件,然後選擇樹節點時,相應的控制權在你的指尖。 ..

標記是Object類型的,所以它可以容納一個引用。顯然你需要投。