2017-08-20 205 views
-1

大家好這裏我儘量讓方法,可以在表單上循環,並從只讀=真正的轉換任何文本框enter image description here被只讀=假,但它不工作只讀屬性

public static void unread only(Form frm) 
    { 
     foreach (Control item in frm.Controls) 
     { 
      if (item is TextBox) 
      { 
       // item.ReadOnly = false; 
      } 
     }    

    } 
+3

_「它不工作」 _ - 甚至不是接近,其中一個具體足夠問題陳述。請修復您的問題,以便更清楚。提供一個好的[mcve],可以可靠地再現你遇到的任何問題,並且精確詳細地描述這個問題。解釋你具體遇到什麼困難。 –

+0

試試這個:'(item as TextBox).ReadOnly = false;' – ja72

回答

0

主要是您的問題是您沒有將控制權轉換爲TextBox,以便您有權訪問要設置的屬性。

foreach (Control item in frm.Controls) { 
    if (item is TextBox) { 
     var textBox = item as TextBox; 
     textBox.ReadOnly = false; 
    } 
} 

也就是說,控件可以包含子控件,因此您需要抓取整個窗體以查找嵌入的文本框。

這將檢查形式及其文本框控件並將它們設置爲只讀

public static void SetReadOnly(Control frm) { 
    var controls = new Queue<Control>(); 
    controls.Enqueue(frm); 
    while (controls.Count > 0) { 
     var control = controls.Dequeue(); 
     if (control is TextBox) { 
      var txtBox = control as TextBox; 
      txtBox.ReadOnly = true; 
     } 
     if (control.HasChildren) { 
      foreach (var child in control.Controls.OfType<Control>()) { 
       controls.Enqueue(child); 
      } 
     } 
    } 
} 

代碼是非常自我解釋,但你應該通過流走明白它在做什麼。

+1

遞歸解決方案比明確更容易閱讀和理解隊列。 –

+0

只是提供其他選項。 – Nkosi

0

您需要是遞歸的。表單控件可以包含其他控件。

+0

所以我做了如果只循環在文本框,當我鍵入item.readonly = false我得到erroe –

1

在您的代碼中,編譯器認爲您找到的對象是Control,並且不知道它是什麼類型的控件。你需要告訴它,它是什麼樣的控制,你可以通過它強制轉換爲文本做到這一點:

((TextBox)item).ReadOnly = false; 

不過,也有這樣做的更好的方法。您的代碼只會查看頂級控件,並且如果您的表單上有容器控件,它將不會遞歸搜索這些以查找其他文本框。遞歸方法做,這是如下:

public static IEnumerable<T> GetControlsOfType<T>(Control root) 
where T : Control 
{ 
var t = root as T; 
if (t != null) 
    yield return t; 

var container = root as ContainerControl; 
if (container != null) 
    foreach (Control c in container.Controls) 
     foreach (var i in GetControlsOfType<T>(c)) 
      yield return i; 
} 

這是一些代碼,我從here了。它允許你做這樣的事情:

foreach (var textBox in GetControlsOfType<TextBox>(theForm)) 
{ 
    textBox.ReadOnly = false; 
}