2009-09-23 231 views
1

所以這是一個愚蠢的問題。我在一個我寫的應用程序的選項對話框中添加了一堆文本框。它們被命名爲textbox1 - textbox12。有沒有辦法以編程方式訪問名稱?我只想在for循環中迭代它們。現在我正逐一訪問每一個(不寒而慄!)。我知道這是錯誤的方式。什麼是正確的方式?什麼是簡單的方法?如何在Windows窗體應用程序中迭代控件?

感謝

回答

2

我個人更喜歡以編程方式創建控件,然後把它們放在一個收藏。即

IList<TextBox> textBoxes = new List<TextBox>(); 

… 

    for (int i = 0; i < 12; i += 1) 
    { 
     TextBox textBox = new TextBox(); 
     textBox.Position = new Point(FormMargin, FormMargin + (i * (textBox.Height + TextBoxPadding))); 
     this.Controls.Add(textBox); 
     this.textBoxes.Add(textBox); 
    } 

然後,你可以在textBoxes上通過編程方式來添加它們。當你有幾組不同的文本框時,你會發現這個縮放比例更好。

+0

我知道這是我需要做的。這是我從一開始就應該做的。謝謝!!!! – 2009-09-24 18:10:15

8
foreach (Control c in this.Controls) 
{ 
    if (c is TextBox) 
    { 
     // your logic here 
    } 
} 

如果他們有不同的功能,那麼你可能需要的不僅僅是確定他們是正確的類型更多的檢查。當然,這裏假定你已經導入了System.Windows.Forms命名空間。

+0

+1你搖滾。比我想象的簡單。 WOOT, – 2009-09-23 19:06:31

+2

很高興幫助。我確定有一些非常酷的LINQ-y方法可以做到,但我還不是LINQ專業版。如果可行,我希望看到其他人貢獻一份... – 2009-09-23 19:10:31

2

你可以編寫一個更通用的函數。

IEnumerable<T> GetChildren<T>(Control owner) 
{ 
    foreach (Control c in owner.Controls) 
    { 
     if (c is T) 
     { 
      yield return c as T; 
     } 
    } 
} 

使用這種方式:

foreach (TextBox tb in GetChildren<TextBox>(optionsControl)) 
{ 
    System.Diagnostics.Trace.WriteLine(tb.Name); 
} 
7

Controls集合,您可以通過名稱訪問的項目,所以你可以這樣做:

var textboxes = Enumerable.Range(1, 12).Select(i => String.Format("textbox{0}", i)).Select(name => (TextBox)this.Controls[name]); 

這將避免列舉每控制集合,儘管是脆弱的,因爲它取決於所使用的命名約定。

或者你可以只使用OfType查詢方法:

var textboxes = this.Controls.OfType<TextBox>(); 
+0

對於var文本框+1 = this.Controls.OfType ();'...這就是我正在談論的尋找自己。 :) – 2009-09-23 19:32:03

+0

太棒了。 +1的OfType方法 – 2009-09-23 19:34:36

+0

Hrm ...我想我需要改變我的代碼使用OfType! – Sterno 2009-09-23 19:38:17

2

我有通過中繼器增加了可變數量的複選框到一個頁面一個頁面,我需要對它們進行一些操作。我最終編寫了這種通用擴展方法,以便將來可以將它用於任何控件。如果您的複選框位於頁面上的某個其他控件的內部,則會通過子控件進行挖掘。

public static List<TChildType> FindChildrenOfType<TChildType>(this Control currentControl) 
    where TChildType : Control 
{ 
    var childList = new List<TChildType>(); 
    foreach (Control childControl in currentControl.Controls) 
    { 
     if (childControl is TChildType) 
     { 
      childList.Add((TChildType)childControl); 
     } 

     childList.AddRange(childControl.FindChildrenOfType<TChildType>()); 

    } 
    return childList; 
} 

在頁面時,它已經習慣這樣的:

var checkedCheckboxes = _myRepeater.FindChildrenOfType<CheckBox>().FindAll(c => c.Checked); 
+0

基於上面的一些示例,這將更好地用Control.OfType()替換我的內部循環,但我不想更改此示例,直到有機會測試它爲止。 – Sterno 2009-09-23 19:39:53

+0

這似乎是als通過使用遞歸返回嵌套控件(另一個控件像TabControl中的控件)的唯一答案。 – 2013-09-23 14:06:01

相關問題