web-dev-qa-db-ja.com

ToolStripMenuItemsをMenuStripに動的に追加する(C#/ Winforms)

私のソリューションを実装しました(基本的なソリューション)と私は満足しています。

問題は、 'Add'メソッドを使用してToolStripItemCollectionに新しい項目を追加すると、いくつかのオーバーロードが発生することです。意味のあるオーバーロードは、文字列パラメーター、画像パラメーター、およびEventHandlerパラメーターです。

私のドロップダウンリストは、RunTimeで動的履歴として機能するため、コンパイル時に空になります。つまり、デザイナーサーフェイス(クリック時)を使用する標準のルートでは、イベントハンドラーを追加できません。上記のオーバーロードを使わざるを得ません。

私のイメージは役に立ちませんが、イベントハンドラーを動的に追加することに興味があり、助けが必要です。

URL: http://msdn.Microsoft.com/en-us/library/bxdt0s8t.aspx

私を助けるための他のオーバーロードはないので、私は画像を使用する必要があります...誰かがこれを回避するためのアイデアを得て、このオーバーロードされたバージョンのaddメソッドを完全に満足させる方法を示します。

TIA。

更新:これを現在のプロジェクトで再度実行しましたが、より洗練されたコードを使用していますが、原理は同じで、実行時にイベントハンドラーを動的に追加します。家に帰ったら、サンプルコードでこれを更新します。

19
IbrarMumtaz

私が行う方法は、ToolStripMenuItemsの配列を作成し、追加する項目をその配列に追加することです。クリックイベントを処理するためのメソッドを1つ作成し、実行時に作成する各項目について固有のものをチェックするようにします。各NameTagまたはToolStripMenuItemプロパティを使用してみてください。次に、追加するメニューのその場でAddRangeを使用します。したがって、コードは次のようになります。

private void BuildMenuItems()
{
    ToolStripMenuItem[] items = new ToolStripMenuItem[2]; // You would obviously calculate this value at runtime
    for (int i = 0; i < items.Length; i++)
    {
        items[i] = new ToolStripMenuItem();
        items[i].Name = "dynamicItem" + i.ToString();
        items[i].Tag = "specialDataHere";
        items[i].Text = "Visible Menu Text Here";    
        items[i].Click += new EventHandler(MenuItemClickHandler);
    }

    myMenu.DropDownItems.AddRange(items);
}

private void MenuItemClickHandler(object sender, EventArgs e)
{
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
    // Take some action based on the data in clickedItem
}
33
jasonh

何が問題になっていますか:

ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);

何か不足していますか?

1
Philip Wallace

画像にnullを渡すだけです。

Menu.DropDownItems.Add(Text, null, EventHandler);
0
John

フィリップウォレスと同じような問題がありました。 ToolStripItemとToolStripMenuItemの違いに注意することが重要です。 ToolStripMenuItemのDropDownItemsにToolStripItemsを追加すると、それらが表示され、すべてのプロパティが正しく設定され、コードでアクセスできますが、テキストは表示されません。 ToolStripMenuItemに切り替えると、これが解決しました。

元の質問に関しては、空のコンストラクターを使用して、必要なフィールドを設定しています。 (私は.net 4.0のvb.netにいて、MustInheritタグがあるのでNew ToolStripMenuItem()を呼び出せないので、次のクラスを作成しました:

Public Class DynamicToolStripMenuItem
    Inherits ToolStripMenuItem

    Public Sub New(value As Integer, text As String, handler As System.EventHandler)
        MyBase.New()
        Me.Text = text
        Me.Visible = True
        Me.Tag = value
        AddHandler Me.Click, handler
    End Sub
End Class
0
QuickDanger