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
中犯了错误,但对我来说,这似乎非常直接…
假设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());
}
虽然它实际上是一个集合中的一个集合。。。等等。您需要搜索控件集合及其所有后代。
这个问题的答案有一个检索所有后代的方法。