2014-01-13 76 views
1

如何設置onload從masterpage代碼只讀後面的所有TextBox?設置所有texbox只讀

我嘗試下面的代碼,但它不工作:

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (Control c in this.Controls) 
    { 
    if (c is TextBox) 
     ((TextBox)c).ReadOnly = true; 
    } 
} 

感謝的

+0

你錯過控制:'無效美孚(控制P){的foreach(在p.Controls控制c)如(c是文本框)((文本框)c)中.ReadOnly =真正; else foo(c);}'不是我真的推薦這個。比在'.Controls'中搜索更好地瞭解頁面上的內容。 – 2014-01-13 19:40:01

回答

1

嘗試:

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (TextBox textbox in this.Controls.OfType<TextBox>()) 
    { 
     textbox.ReadOnly = true; 
    } 
} 
+0

不行....... – amid

+0

嗯...使用這段代碼,我能夠得到它的工作。 – njenson

2

Ebyrob和我有同樣的想法,增加了一個空引用保護並檢查控制是否有孩子(減少呼叫)。

protected void Page_Load(object sender, EventArgs e) 
    { 
     SetReadonly(this); 
    } 
    private void SetReadonly(Control c) 
    { 
     if (c == null) 
     { 
      return; 
     } 
     foreach (Control item in c.Controls) 
     { 
      if (item.HasChildren) 
      { 
       SetReadonly(c); 
      } 
      else if (c is TextBox) 
      { 
       ((TextBox)c).ReadOnly = true; 
      } 

     } 
    } 
+0

HasChildren錯誤,沒有擴展... – amid

+0

@Amid,確保你有'使用System.Windows.Forms',Control.HasChildren自1.1 [link](http://msdn.microsoft .com/en-us/library/system.windows.forms.control.haschildren(v = vs.71).aspx)並且仍然在4.5的框架中。這個具體的例子在4.0中進行了測試。 – AWinkle

0

試試這個。我在對照測試這和正常工作

private void SetReadonly(Control c) 
    { 
     if (c == null) 
     { 
      return; 
     } 
     foreach (Control item in c.Controls) 
     { 

      if (item is TextBox) 
      { 
       ((TextBox)item).ReadOnly = true; 
      } 

      else if (item.HasControls()) 
      { 
       SetReadonly(item); 
      } 

     } 
    }