Windows窗体 - 迭代所有MDIparent的按钮的方法不起作用

时间:2013-02-08 13:57:21

标签: c# winforms visual-studio-2010

所以这显然很简单,但我已经在这个话题上浪费了太多时间。 我有一个非常简单的(因为它应该在我看来)方法,该任务是迭代我父表单中的所有按钮。

这是:

public void SetForeColor(BaseForm frm, Form f)
{
    foreach (ToolStripButton button in frm.Controls.OfType<ToolStripButton>())
    {               
            MessageBox.Show("Soles clicked"+" "+f.Name.ToString());
    }

}

BaseForm frm是应将MDIparent作为值的参数。我从另一个实际上得到MDIparent

的方法中调用此方法
 protected void LoadForm<T>(ToolStripButton formButton, string buttonText) where T : Form
        {
            MainForm frm = this.MdiParent as MainForm;
            if (frm == null) frm = this as MainForm;
            T sendTo;
....
            SetForeColor(frm, sendTo);

但我没有得到任何回应。 LoadForm<T>函数工作正常,所以我的建议是我在foreach中犯了错误,但对我来说似乎非常直接......

4 个答案:

答案 0 :(得分:1)

您的按钮可能不是表单的直接子项,但包含在ToolStrip组件中,该组件本身就是表单的子项。

尝试类似:

foreach (ToolStrip toolStrip in frm.Controls.OfType<ToolStrip>()) {
    foreach (ToolStripButton button
             in toolStrip.Controls.OfType<ToolStripButton>()) {               
        MessageBox.Show("Soles clicked " + f.Name);
    }
}

答案 1 :(得分:1)

假设ToolStripButton是.net框架中的标准按钮,则foreach循环将不会执行,因为窗体的控件集合中不会出现ToolStripButton类型的按钮。

ToolStripButtons必须由MenuStrip,ToolStrip或StatusStrip作为父级,因此您需要迭代任何工具条的控件:

foreach (var strip in frm.Controls.OfType<ToolStrip>())
{
     foreach (var item in strip.Items)
     {
          MessageBox.Show("Soles clicked " + f.Name.ToString());
     }
}

答案 2 :(得分:0)

您需要检查表单是否也是同一类型:

foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == form.GetType() 
            && frm != form)
        {
            frm.Close();
        }
    }

答案 3 :(得分:0)

您的foreach语句仅搜索控件集合的顶层。

foreach (ToolStripButton button in frm.Controls.OfType<ToolStripButton>()) {               
    MessageBox.Show("Soles clicked"+" "+f.Name.ToString());
}

虽然它实际上是集合中集合的集合......等等。您需要搜索控件集合及其所有后代。

this question的答案有一个检索所有后代的方法。