2009-11-18 48 views
18

私のソリューションは実装されています(基本的なソリューション)、私は満足しています。MenuStripにToolStripMenuItemsを動的に追加する(C#/ Winforms)

「追加」メソッドを使用して新しいアイテムをToolStripItemCollectionに追加すると、いくつかのオーバーロードが発生します。意味のあるものは、文字列パラメータ、イメージパラメータ、およびEventHandlerパラメータです。

私のドロップダウンリストは、動的な履歴としてRunTimeで提供されるため、コンパイル時に空になることを意味します。つまり、デザイナーサーフェスを使用する標準的なルート(クリック時)ではイベントハンドラーを追加できません。私は上記の過負荷を余儀なくされています。

イメージは私には役に立たないものの、イベントハンドラを動的に追加することは、私が興味を持って助けが必要なことです。

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

あり、私を助けるために、他の過負荷がありませんので、私はイメージを使用する必要が...誰もがこの問題を回避し、完全にこのオーバーロードされたバージョンを満たすために、どのように私を見るために、任意のアイデアを得ましたメソッドを追加します。

TIA。

更新:私は現在のプロジェクトでこれをやり直しましたが、より滑らかなコードを使用していますが、原則は同じです。実行時に動的にイベントハンドラを追加してください。私は家に帰るときにこれをいくつかのサンプルコードで更新します。

答えて

30

私がやることは、ToolStripMenuItemsの配列を作成し、その配列に追加しているアイテムを挿入することです。私は、クリックイベントを処理するメソッドを1つ作成し、実行時に作成する各アイテムについて独自のものをチェックします。各ToolStripMenuItemNameまたはTagのプロパティを使用してみてください。次に、追加するメニューのある場所でAddRangeを使用します。私は何かが欠け

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

アム:

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 
} 
+0

感謝...これはpromsingに見えます)私は楽観的なままです.... – IbrarMumtaz

+0

'Add'メソッドは同じように動作します。配列を作成せずにforループを1つの項目に対して機能させる: 'ToolStripMenuItem item = new ToolStripMenuItem();'そしてforループ呼び出しの最後に 'myMenu.Items。Add(item); ' – jasonh

+0

Tyあなたの返信からいくつかの手がかりを取り、それをきれいに処理しました。 次の大きな章に移動する前に、私のアプリで最後にやるべきことは、履歴メニューを再構成して新しい項目を追加し、残りの部分を上に移動させる方法が考えられます。これは私がそれを試して、すべてが今のところ輝きのように見えるので、これは簡単な心遣いでなければなりません。 – IbrarMumtaz

1

の何が問題になっている:だからあなたのコードは次のようになりますか?

+0

ダニー・メイトは、比較的経験の浅いですが、JasonHのおかげで、私は以下を使用することができました。実際には何も間違っていませんでしたが、私は上記の解決策にポーズとして過負荷の1つを使用することにもっと熱心でした............................ ............................................. historyToolStripMenuItem.DropDownItems.Add (TreeDrives.SelectedNode.FullPath、null、新しいEventHandler(MenuItemClickHandler));これはまさに私が後にしたことです...そしてきれいに動作します – IbrarMumtaz

+0

FullPathプロパティを使用して、起動されたファイルに関連する意味のある名前を付けています。最後のイベントハンドラ。これは、私が苦労していた過負荷です。最近実行されたファイルをヒストリーメニューに追加し、メニューからファイルをショートカットとして再起動することを考えているのですか^^。 – IbrarMumtaz

0

私はPhilip Wallaceと同様の問題を抱えていました。 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

あなたは、単に画像のためにnullを渡すことができます私は追加の方法がここにいる誰かが= ....どのように私を見ることができれば仕事のための1つのように思えるその最初の過負荷試してみたいと思いalhough。

返信用
Menu.DropDownItems.Add(Text, null, EventHandler); 
関連する問題