我有一个窗体,有几个组合框。 我需要完成的是让每个具有项目的组合框将其选定的索引设置为0.而不是手动按名称执行每个组合框,是否有一个按类型返回所有子项的函数。或者让所有的孩子和他们的类型与组合框元素的类型进行比较?
@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);
答案 0 :(得分:3)
我就是这样做的:
foreach (var comboBox in myForm.Controls.OfType<ComboBox>())
{
comboBox.SelectedIndex = 0;
}
如果组合框不是直接在表单上但在容器内(组框,面板等),那么使用它而不是myForm。
答案 1 :(得分:2)
您必须使用递归函数来检查每个控件及其子项..试试这个:
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);
}
}
}
答案 2 :(得分:1)
您可以枚举控件并使用Linq过滤它们:
foreach (var comboBox in yourForm.Controls.OfType<ComboBox>())
{
}
但是如果你在另一个控件中有控件(比如面板中的组合框),那么你将不得不制作一个递归版本。
答案 3 :(得分:0)
您可以通过以下方式迭代表单中的控件:
foreach(Control c in MyForm.Controls)
{
//Do something here
}
但请记住,其中一个控件可能是一个groupox或一个内部有控件的面板,所以你需要某种递归函数来返回表单中的所有控件,无论一个控件是否在其他控件内部,然后按类型过滤集合。
但我们祝你好运,Stackoverflow中的其他帖子可以解决这个问题:Get available controls from a form using C#
答案 4 :(得分:0)
您可以像这样遍历表单上的控件:
foreach (Control control in MyForm.Controls) {
// test control type
}
请注意,如果您嵌入控件(例如将其放在表格布局面板中),则无法找到您的控件。
相反,您需要递归调用方法来查找控件,每次都要检查您正在查看的控件has child controls
答案 5 :(得分:0)
当控件包含在组框中时,您可以执行此操作
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();
}
}
}
}