1

MDI アプリケーションの一種のプロトタイプを作成しています。mainForm と呼ばれるメイン フォームと、他のいくつかの子フォームがあり、すべて childForm クラスのインスタンスです。私の childForm クラスのこれらのインスタンスには、すべての基本的な MenuStrip があり、いくつかの form\close、print などの toolStripMenuItems があります。

クリック時に、アクティブ化された toolStripMenuItem を保持している childForm クラスのインスタンスを特定するにはどうすればよいですか?

編集:次のダッシュコメント

擬似コードは次のようになります。

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

2 に答える 2

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 に答える
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 に答える