1

我正在为 MDI 应用程序构建一种原型。我有一个名为 mainForm 的主窗体和一些其他子窗体,它们都是 childForm 类的所有实例。我的 childForm 类的这些实例都有一个基本的 MenuStrip,带有一些 form\close、print 等 toolStripMenuItems。

在单击时,如何确定 childForm 类的哪个实例持有激活的 toolStripMenuItem?

编辑:以下破折号评论

伪代码如下所示:

Form myNewForm = new Form()
MenuStrip myNewMenu = new MenuStrip()
...
myNewForm.Controls.Add(myNewMenu)
myNewForm.MainMenuStrip = myNewMenu
4

2 回答 2

1

对破折号表示敬意,这应该作为答案发布。

我将假设您在菜单项的单击事件中...

Control s = sender as Control;//the sender object from the click event
ChildForm activeForm = s.FindForm() as ChildForm;

这将给出您正在寻找的表单的特定实例。

或者,按钮单击事件应该从 ChildForm 类本身实现,这意味着在任何单击事件期间,您的“this”运算符实际上应该是被激活的 ChildForm 类的特定实例。

ChildForm activeForm = this;

这是一个完全不必要的任务,但确实说明了这一点。如果您的菜单条位于其他一些自定义用户控件容器上,则情况并非如此,在这种情况下,您将需要这样的东西。

ChildForm activeForm = this.ParentForm;

ParentForm 属性对于“ContainerControl”是唯一的,它被定义为可以包含其他控件的控件,并且它标识了显示容器的基本“表单”。

于 2012-05-21T17:49:30.020 回答
1

鉴于我的原始评论和您的更新,以下内容对我有用:

  Form newChildForm = new Form();
  newChildForm.Name = "ChildForm";
  MenuStrip newMenu = new MenuStrip();

  ToolStripItem newItem = newMenu.Items.Add("New Item");
  newItem.Click += new EventHandler(newItem_Click);

  newChildForm.Controls.Add(newMenu);
  newChildForm.MainMenuStrip = newMenu;

  newChildForm.Show();

然后,在事件处理程序中:

void newItem_Click(object sender, EventArgs e)
{
  ToolStripItem clickedItem = sender as ToolStripItem;

  MenuStrip parentMenu = clickedItem.Owner as MenuStrip;

  Form childForm = parentMenu.FindForm() as Form;
  //childForm.Parent is also "ChildForm";

}

你有什么不一样的吗?

于 2012-05-22T12:35:13.767 回答