1

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

这里是:

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

}

BaseForm frm应该采用MDIparentas 值的参数在哪里。我从另一个我实际得到的地方调用这个方法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

4 回答 4

1

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

尝试类似:

foreach (ToolStrip toolStrip in frm.Controls.OfType<ToolStrip>()) {
    foreach (ToolStripButton button
             in toolStrip.Controls.OfType<ToolStripButton>()) {               
        MessageBox.Show("Soles clicked " + f.Name);
    }
}
于 2013-02-08T14:01:39.033 回答
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());
     }
}
于 2013-02-08T14:05:59.163 回答
0

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

foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == form.GetType() 
            && frm != form)
        {
            frm.Close();
        }
    }
于 2013-02-08T14:00:19.417 回答
0

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

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

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

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

于 2013-02-08T14:03:19.430 回答