2013-10-30 41 views
4

我們怎樣才能改變所有文本框的只讀屬性在WinForm的是真的假我正在使用此代碼嘗試,但這個提示我對象空引用錯誤...如何更改winform中文本框的readonly屬性false?

private void TextBoxesReadOnlyTrue(Control.ControlCollection cc) 
    { 
     foreach (Control ctrl in cc) 
     { 
      TextBox tb = ctrl as TextBox; 
      if (tb.ReadOnly) 
      { 
       tb.ReadOnly = false; 
      } 

     } 
    } 

回答

6

這是因爲不是所有的cc中的控件是TextBoxes。所以當你嘗試將它們轉換爲TextBox時,該變量爲空。當一個變量爲空時,你不能訪問該變量的任何屬性,否則你會得到一個錯誤。所以任何時候一個變量可以爲空,你必須首先測試它是否爲空。

這裏的修改,如果命令你將要用來解決您的問題:

if (tb != null && tb.ReadOnly) { tb.ReadOnly = false; } 

所以我appologize,我忽略了你的文本框可以包含在其他容器控件。是的,這意味着您需要執行以下兩項操作之一:1:您可以將文本框移到GroupBox外部。哈哈。我只是在開玩笑。是的,那可以解決這個問題,但是你遇到了更糟糕的問題。正確的方法是遞歸調用您的方法,爲每個控件在其Controls屬性中具有控件。每個控件都有這個屬性,但它看起來在非容器控件中是空的(但不爲空)。 (我今天瞭解到,每一個控件還具有以下屬性Controls,所以我已經更新了我的代碼,以反映這一點。) 因此,對於這個真正的解決辦法,我建議一些與此類似:

private void TextBoxesReadOnlyTrue(Control.ControlCollection cc) 
{ 
    foreach (Control ctrl in cc) 
    { 
     TextBox tb = ctrl as TextBox; 
     if (tb != null && tb.ReadOnly) 
     { tb.ReadOnly = false; continue; } 

     if (ctrl.Controls != null && ctrl.Controls.Count > 0) 
     { TextBoxesReadOnlyTrue(ctrl.Controls); } 
     // this recursively calls this same method for every control ... 
     // that is a container control that contains more controls, ... 
     // such as GroupBoxes, Panels, etc. 
    } 
} 
+0

沒有工作,那麼現在是怎麼過的!不會提示錯誤。是由於文本框放在組框中? – buddy

+0

@buddy,是的,在GroupBox中的TextBoxes是一個額外的複雜,這會導致我原來的答案缺乏。我的錯。我已經更新了我的答案,給你2個選項來解決這個新問題。你真正需要做的就是添加兩行代碼。 :) –

2

首先你想使用這樣的功能:

Recursive get controls

那麼你就以下

private IEnumerable<T> GetControls<T>(Control.ControlCollection ctrls) 
{ 
    foreach (object ctrl in ctrls) 
    { 
     foreach (var item in GetControls<T>(((Control)ctrl).Controls)) 
     { 
      yield return item;  
     } 
     if (ctrl is T) 
      yield return (T)ctrl; 

    } 
} 

foreach(var txtbox in GetControls<TextBox>(form.Controls) 
{ 
    txtbox.ReadOnly = false; 
} 
+0

斯蒂格,我也喜歡你的答案。這對一些人來說很複雜,但對於那些瞭解這些代碼的人來說,這非常有用。所以我感謝你的(非常)好的解決方案,我也贊成你。我還給出了一個更簡單的C#解決方案,對於那些想要簡單的方法而不會使其複雜化的人來說更容易遵循。在這種情況下,我看不出有什麼需要在yield中使用這個懶加載,但我希望有時候這個解決方案會比我給出的替代簡單解決方案更好。但對他自己的(或她自己的)。快樂的編碼! –

相關問題