2009-09-23 43 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

相关问题