所以这显然很简单,但我已经在这个话题上浪费了太多时间。 我有一个非常简单的(因为它应该在我看来)方法,该任务是迭代我父表单中的所有按钮。
这是:
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
中犯了错误,但对我来说似乎非常直接......
答案 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的答案有一个检索所有后代的方法。