2012-10-15 21 views
1

如何給同一表單中的所有文本框賦予相同的屬性。給與所有文本框控件相同的屬性

 foreach (var textbox in this.Controls.OfType<TextBox>()) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 

上述代碼僅適用於文本框不是嵌套格式的情況。

在我的項目中,我有tabcontrol中的多個tabpages。所以我不能實現上面的代碼。但我可以實現下面的代碼:

 foreach (TextBox textbox in this.Controls.OfType<TabControl>().SelectMany(tc => tc.Controls.OfType<TabPage>().SelectMany(page => page.Controls.OfType<TextBox>()))) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 
     foreach (var textbox in this.tabCarInsurance.Controls.OfType<TextBox>()) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 
     foreach (var textbox in this.tabHomeLoans.Controls.OfType<TextBox>()) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 
     foreach (var textbox in this.tabRetirement.Controls.OfType<TextBox>()) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 

這裏我正在實施每個tabControl。這仍然不喜歡(因爲我有更多的標籤頁來照顧)。無論如何要減少上面的代碼。

我嘗試下面的代碼:(不工作

 foreach (var textbox in this.Controls.OfType<TabControl>().OfType<TextBox>()) 
     { 
      textbox.ContextMenu = new ContextMenu(); 
     } 

我得到了上面的代碼知識從我previous question

請幫忙
在此先感謝。

回答

3
private void SetProperty(Control ctr) 
    { 
     foreach(Control control in ctr.Controls) 
     { 
      if (control is TextBox) 
      { 
       control.ContextMenu = new ContextMenu();    
      } 
      else 
      { 
       if (control.HasChildren) 
       { 
        SetProperty(control); 
       }      
      } 
     } 
    } 
+0

謝謝你的迴應。它正在向'ctr'顯示紅色塗鴉。請解釋我是初學者在C#。 –

+0

@Anandkumar,你期待'TextBox'有孩子嗎?)) – horgh

+0

雅它現在沒有顯示任何塗鴉。在哪裏調用這個函數以及如何調用。請解釋。 –

0

嘗試:

private void CtxMenu(Control parent) 
{ 
    foreach (Control child in parent.Controls) 
    { 
     if (child is TextBox) 
     { 
      (child as TextBox).ContextMenu = new ContextMenu(); 
     } 
} 
1

只需使用遞歸遍歷所有控件的子集合:

void SetControl(ContextMenu menu, Control control) 
{ 
    if (control is TextBox) 
     control.ContextMenu = menu; 
    else 
    { 
     foreach (Control c in control.Controls) 
      SetControl(menu, c); 
    } 
} 

它會發現所有的文本框,並設置同一個上下文菜單中的所有其中。

你可以從窗體的OnLoad事件處理函數中調用它。雖然假設您已爲表單定義了yourContextMenu

private void Form1_Load(object sender, EventArgs e) 
    { 
     SetControl(yourContextMenu, this); 
    } 
1

如何擴展方法做到這一點,從您的tabcontrol容器調用...

public static class ControlExtensions 
{ 
    public static void SetContextMenuOnChildTextBoxes(this Control control) 
    { 
     if (control is TextBox) 
     { 
      control.ContextMenu = new ContextMenu(); 
     } 
     if (control.Controls != null) 
     { 
      foreach (Control controlChild in control.Controls) 
      { 
       controlChild.SetContextMenuOnChildTextBoxes(); 
      } 
     } 
    } 
} 

這可以放在代碼的一個公共區域,以便它可以從任何父母叫那就是想要這個功能。

相關問題