所以這是一個愚蠢的問題。我在一個我寫的應用程序的選項對話框中添加了一堆文本框。它們被命名爲textbox1 - textbox12。有沒有辦法以編程方式訪問名稱?我只想在for循環中迭代它們。現在我正逐一訪問每一個(不寒而慄!)。我知道這是錯誤的方式。什麼是正確的方式?什麼是簡單的方法?如何在Windows窗體應用程序中迭代控件?
感謝
所以這是一個愚蠢的問題。我在一個我寫的應用程序的選項對話框中添加了一堆文本框。它們被命名爲textbox1 - textbox12。有沒有辦法以編程方式訪問名稱?我只想在for循環中迭代它們。現在我正逐一訪問每一個(不寒而慄!)。我知道這是錯誤的方式。什麼是正確的方式?什麼是簡單的方法?如何在Windows窗體應用程序中迭代控件?
感謝
我個人更喜歡以編程方式創建控件,然後把它們放在一個收藏。即
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上通過編程方式來添加它們。當你有幾組不同的文本框時,你會發現這個縮放比例更好。
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
// your logic here
}
}
如果他們有不同的功能,那麼你可能需要的不僅僅是確定他們是正確的類型更多的檢查。當然,這裏假定你已經導入了System.Windows.Forms命名空間。
+1你搖滾。比我想象的簡單。 WOOT, – 2009-09-23 19:06:31
很高興幫助。我確定有一些非常酷的LINQ-y方法可以做到,但我還不是LINQ專業版。如果可行,我希望看到其他人貢獻一份... – 2009-09-23 19:10:31
你可以編寫一個更通用的函數。
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);
}
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>();
對於var文本框+1 = this.Controls.OfType
太棒了。 +1的OfType方法 – 2009-09-23 19:34:36
Hrm ...我想我需要改變我的代碼使用OfType! – Sterno 2009-09-23 19:38:17
我有通過中繼器增加了可變數量的複選框到一個頁面一個頁面,我需要對它們進行一些操作。我最終編寫了這種通用擴展方法,以便將來可以將它用於任何控件。如果您的複選框位於頁面上的某個其他控件的內部,則會通過子控件進行挖掘。
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);
基於上面的一些示例,這將更好地用Control.OfType()替換我的內部循環,但我不想更改此示例,直到有機會測試它爲止。 – Sterno 2009-09-23 19:39:53
這似乎是als通過使用遞歸返回嵌套控件(另一個控件像TabControl中的控件)的唯一答案。 – 2013-09-23 14:06:01
我知道這是我需要做的。這是我從一開始就應該做的。謝謝!!!! – 2009-09-24 18:10:15