【问题标题】:C# Combobox dropdownlist item typeC# Combobox 下拉列表项类型
【发布时间】:2012-05-15 03:53:38
【问题描述】:

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

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (ComboBox DropDown in this.Controls.OfType<ComboBox>())
            DropDown.SelectedIndex = 0;
    }

此代码不起作用,尽管单独分配每个项目可以。任何想法为什么?

【问题讨论】:

  • 这很有趣。您确定 this.Controls.OfType&lt;ComboBox&gt; 实际上返回组合框列表吗?尝试调试它 - 事实上,您是否获得了您期望的 16 个控件?
  • 现在想想,其实这不是可以在设计时设置的吗?为什么需要在Form_Load 中设置?
  • @AvnerShahar-Kashtan 似乎不是,我不知道为什么......(我对 C# 的经验并不过分。)“枚举没有结果”是我的消息见。
  • 尝试使用 Catch/Try 块包装代码。
  • 好的,这是一个开始。我的 WinForm 有点生疏,但如果我没记错的话,this.Controls 只会在主窗体下直接为您带来那些控件。如果您有任何子控件,例如 Groupbox,它们将位于该 groupbox 的.Controls 下。我看到一些 SO 帖子似乎建议使用递归来获取所有子控件:stackoverflow.com/questions/3419159/…

标签: c# winforms combobox drop-down-menu oftype


【解决方案1】:

我的 WinForm 体验有点生疏,但如果我没记错的话,this.Controls 只会给你带来那些直接在主 Form 下的控件。如果您有任何子控件,例如 Groupbox,它们将位于该 groupbox 的 .Controls 下。

您可以显式地迭代 Groupbox 的控件,也可以使用递归来遍历表单的所有子控件,就像您可以看到 here 一样。

【讨论】:

  • ` foreach (GroupBox OptGroup in this.Controls.OfType()) { foreach (ComboBox DropDown in OptGroup.Controls.OfType()) DropDown.SelectedIndex = 0; }`
【解决方案2】:

您必须检测 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);
    }
}

【讨论】:

  • 编译但不幸的是没有工作,所有组合框仍然显示为空白:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多