C#组合框下拉列表项目类型

C#组合框下拉列表项目类型,c#,winforms,combobox,drop-down-menu,oftype,C#,Winforms,Combobox,Drop Down Menu,Oftype,我有一个包含16个组合框的表单,每个组合框的DropDownStyle属性设置为DropDownList。我正在尝试设置窗体,以便每个控件显示其第一个预定义值: private void Form1_Load(object sender, EventArgs e) { foreach (ComboBox DropDown in this.Controls.OfType<ComboBox>()) DropDown.Selected

我有一个包含16个组合框的表单,每个组合框的
DropDownStyle
属性设置为
DropDownList
。我正在尝试设置窗体,以便每个控件显示其第一个预定义值:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (ComboBox DropDown in this.Controls.OfType<ComboBox>())
            DropDown.SelectedIndex = 0;
    }
private void Form1\u加载(对象发送方,事件参数e)
{
foreach(此.Controls.OfType()中的组合框下拉列表)
DropDown.SelectedIndex=0;
}

此代码不起作用,尽管单独分配每个项目会起作用。知道为什么吗?

您必须检测ComboBox的控件及其类型。。。 这意味着您必须处理嵌套循环来检测控件

foreach (Control MyCtrl in this.Controls)
{
    DoAllRichTextBoxes(MyCtrl);
}

void DoAllRichTextBoxes(Control control)
{
    ComboBox Cmb = control as ComboBox;
    TextBox TxtBx = control as TextBox;
    if (Cmb == null && TxtBx == null)
    {
        // deal with nested controls
        foreach (Control c in control.Controls) DoAllRichTextBoxes(c);
    }
    if (Cmb != null)
    {
        Cmb.GotFocus += new EventHandler(this.Tb_GotFocus);
        Cmb.LostFocus += new EventHandler(this.Tb_LostFocus);
        Cmb.KeyDown += new KeyEventHandler(this.VehComn_KeyDown);
        Cmb.SelectedValueChanged += new EventHandler(this.AllCombos_SelectedValueChanged);
    }
    if (TxtBx != null)
    {
        TxtBx.GotFocus += new EventHandler(this.Tb_GotFocus);
        TxtBx.LostFocus += new EventHandler(this.Tb_LostFocus);
        TxtBx.KeyPress += new KeyPressEventHandler(this.TbCmb_KeyPress);
        TxtBx.KeyDown += new KeyEventHandler(this.VehComn_KeyDown);
    }
}

您必须检测ComboBox的控件及其类型。。。 这意味着您必须处理嵌套循环来检测控件

foreach (Control MyCtrl in this.Controls)
{
    DoAllRichTextBoxes(MyCtrl);
}

void DoAllRichTextBoxes(Control control)
{
    ComboBox Cmb = control as ComboBox;
    TextBox TxtBx = control as TextBox;
    if (Cmb == null && TxtBx == null)
    {
        // deal with nested controls
        foreach (Control c in control.Controls) DoAllRichTextBoxes(c);
    }
    if (Cmb != null)
    {
        Cmb.GotFocus += new EventHandler(this.Tb_GotFocus);
        Cmb.LostFocus += new EventHandler(this.Tb_LostFocus);
        Cmb.KeyDown += new KeyEventHandler(this.VehComn_KeyDown);
        Cmb.SelectedValueChanged += new EventHandler(this.AllCombos_SelectedValueChanged);
    }
    if (TxtBx != null)
    {
        TxtBx.GotFocus += new EventHandler(this.Tb_GotFocus);
        TxtBx.LostFocus += new EventHandler(this.Tb_LostFocus);
        TxtBx.KeyPress += new KeyPressEventHandler(this.TbCmb_KeyPress);
        TxtBx.KeyDown += new KeyEventHandler(this.VehComn_KeyDown);
    }
}

我的WinForm体验有些生疏,但如果我没记错的话,
this.Controls
只会将这些控件直接带到主窗体下。如果您有任何子控件(如Groupbox),它们将位于该Groupbox的控件下。
控件


您可以显式迭代Groupbox的控件,也可以使用递归遍历表单的所有子控件,如您所见

我的WinForm体验有些生疏,但如果我没记错的话,
这个.Controls
只会将这些控件直接带到主窗体下。如果您有任何子控件(如Groupbox),它们将位于该Groupbox的控件下。
控件


您可以显式迭代Groupbox的控件,也可以使用递归遍历表单的所有子控件,如您所见

编译但不工作不幸的是,所有组合框仍显示为空:(编译但不工作不幸的是,所有组合框仍显示为空:(这很有趣。你确定
This.Controls.OfType
确实返回了组合框列表吗?试着调试一下-事实上,你得到了你期望的16个控件吗?现在我想起来了,实际上,这不是可以在设计时设置的东西吗?为什么你需要在
Form\u Load
中设置它?@avnershaar Kashtan似乎不是,我也不知道为什么…(我对C#没有太多经验。)“枚举没有产生任何结果”是我看到的消息。尝试用Catch/Try块包装代码。好吧,这是一个开始。我的WinForms有点生锈,但如果我没记错的话,
这个。控件
只会将这些控件直接带到主窗体下。如果您有任何子控件,如Groupbox,它们将位于该Groupbox的
控件
下。我明白了我的帖子似乎建议使用递归来获取所有子控件:这很有趣。你确定
This.Controls.OfType
确实返回了组合框列表吗?试着调试它-你实际上得到了你期望的16个控件吗?现在我想了想,实际上,这不是可以在设计时设置的东西吗?为什么o您需要将其设置为
加载形式
?@AvnerShahar Kashtan似乎不是这样,我不知道为什么…(我对C#没有太多经验),“枚举没有产生任何结果”是我看到的消息。尝试用Catch/Try块包装代码。好吧,这是一个开始。我的WinForms有点生锈,但如果我没记错的话,
这个。控件
只会将这些控件直接带到主窗体下。如果您有任何子控件,如Groupbox,它们将位于该Groupbox的
控件
下。我明白了我看到一些帖子似乎建议使用递归来获取所有子角色:`foreach(GroupBox OptGroup在此.Controls.OfType()中){foreach(ComboBox DropDown在OptGroup.Controls.OfType()中)DropDown.SelectedIndex=0;}`foreach(此.Controls.OfType()中的GroupBox-OptGroup){foreach(OptGroup.Controls.OfType()中的ComboBox下拉列表)下拉列表。SelectedIndex=0;}`