Windows窗体-迭代所有MDIpparent';s的按钮不工作

本文关键字:按钮 工作 窗体 迭代 MDIpparent Windows | 更新日期: 2023-09-27 17:58:15

所以这显然很简单,但我已经在这个主题上浪费了太多时间。我有一个非常简单的方法(在我看来应该是这样),它的任务是遍历父窗体中的所有按钮

这是:

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中犯了错误,但对我来说,这似乎非常直接…

Windows窗体-迭代所有MDIpparent';s的按钮不工作

假设ToolStripButton是.net框架中的标准按钮,则不会执行foreach循环,因为表单的控件集合中没有ToolStripButton类型的按钮。

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

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

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

试试类似的东西:

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

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

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

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

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

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

这个问题的答案有一个检索所有后代的方法。