c#循环窗口表单元素
本文关键字:元素 表单 窗口 循环 | 更新日期: 2023-09-27 18:17:44
我有一个窗口窗体,有一对组合框。我需要完成的是让每个有项目的组合框将其选定的索引设置为0。不是按名称手动执行每个组合框,而是有一个按类型返回所有子框的函数。或者获取所有子元素并将它们的类型与combobox元素的类型进行比较?
@noah,你的原始代码一开始不工作,但我所需要的只是提醒孩子们被称为控件(谢谢)。
我做了一个递归函数来设置所有的组合框,而不仅仅是主形式的直接后代:
private void recursiveSetComboBox(Control element)
{
foreach (Control a in element.Controls)
{
if (a.Controls.Count != 0)
recursiveSetComboBox(a);
else if (a.GetType().Name == "ComboBox")
{
ComboBox b = (ComboBox)a;
b.SelectedIndex = 0;
}
}
}
recursiveSetComboBox(this);
我是这样做的:
foreach (var comboBox in myForm.Controls.OfType<ComboBox>())
{
comboBox.SelectedIndex = 0;
}
如果组合框不是直接在表单上,而是在一个容器(组框,面板等)中,那么使用它来代替myForm。
您必须使用递归函数来检查每个控件及其子控件。试试这个:
public void CheckForComboBox(Control crl)
{
foreach (Control crl in this) {
if (crl is ComboBox && ((ComboBox)crl).Items.Count > 0) {
((ComboBox)crl).SelectedIndex = 1;
} else if (crl.Controls != null && crl.Controls.Count > 0) {
CheckForComboBox(crl);
}
}
}
您可以枚举控件并使用Linq:
对它们进行筛选。foreach (var comboBox in yourForm.Controls.OfType<ComboBox>())
{
}
但是如果你在另一个控件中有控件(比如面板中的组合框),那么你就必须创建一个递归版本
当控件包含在组框中时,您可以这样做
foreach (Control group in this.Controls) //Control combo in this.Controls)
{
if (group.GetType().Name == "GroupBox") //(con is ComboBox)
{
foreach (Control con in group.Controls)
{
if (con.GetType().Name == "ComboBox")
{
ComboBox combo = (ComboBox)con;
_dtStaff=new DataTable();
_dtStaff = _staff.getStaffList();
combo.DataSource = _dtStaff;
combo.DisplayMember = _dtStaff.Columns[1].ToString();
combo.ValueMember = _dtStaff.Columns[0].ToString();
}
}
}
}
您可以通过以下方式遍历表单中的控件:
foreach(Control c in MyForm.Controls)
{
//Do something here
}
但是请记住,其中一个控件可能是一个群痘或一个内部有控件的面板,因此您将需要某种递归函数来返回表单中的所有控件,无论一个控件是否在另一个控件中,然后按类型筛选集合。
但是我们运气不错,Stackoverflow的其他帖子解决了这个问题:使用c#
您可以像这样遍历表单上的控件:
foreach (Control control in MyForm.Controls) {
// test control type
}
注意,如果你嵌入一个控件(例如,把它放在一个表格布局面板),那么这个将不会找到你的控件。
相反,您需要递归地调用该方法来查找控件,并每次检查您正在查看的控件是否有子控件