所以这是一个愚蠢的问题。我在一个我写的应用程序的选项对话框中添加了一堆文本框。它们被命名为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