2012-05-05 27 views
0

データベーステーブルから値を取るFormLoadでアイテムが生成されるツールストリップメニューdropdownitemのコードを書くにはどうすればよいですか?動的に生成されたツールストリップメニュー項目を処理する方法

プログラムを実行する前に存在しないこのアイテムに対して、どのようにしてOnClickメソッドを記述できますか?

+1

これはかなり不明です。あなたは確かにdbaseテーブルからツールストリップ項目を作成することはできますが、これはあまり効果がありません。実際の肉は、ユーザが項目をクリックしたときに実行される*コード*です。そのコードはどこですか? –

+0

あなたはイベントで何をしたいですか?アイテムの名前をクリックするだけで十分ですか(この場合、クリックされたイベントで名前を渡したり読むことができます)か、名前がアイテムと同じであれば呼び出されるクラス/関数を作成しますか? (この場合、「遅延結合」と呼ばれるものが必要です) – weberik

答えて

0

コントロールは他のオブジェクトとまったく同じです。私たちは、単にユーザーインターフェースを指定するためのデザイナを使用するのに慣れています。

したがって、このような何か:

void AddMenuItems(ToolStripItemCollection itemCollection, DataView view) 
{ 
    foreach (DataRowView rowView in view) 
     itemCollection.Add(MakeMenuItem(rowView.Row)); 
} 

ToolStripItem MakeMenuItem(DataRow row) 
{ 
    var item = new ToolStripMenuItem((string)row["Name"]); 
    item.Tag = row; 
    item.Click += new EventHandler(MenuItem_Click); 
    return item; 
} 

void MenuItem_Click(object sender, EventArgs e) 
{ 
    var row = ((ToolStripItem)sender).Tag as DataRow; 
    MessageBox.Show((string)row["HelpText"]); 
} 

あなたが(例えば、いくつかの種類のエンティティ)項目データのためのDataRow以外のものを使用したい、そしておそらく完全に異なるロジック項目を作成するには、これが示すことパターン:他のオブジェクトを作成するのと同じようにアイテムを作成し、フォームにすでにルートされているメニューに追加します(ルートを動的に作成することもできますが、データを持つアイテムをクリックし、クリックハンドラのタグからデータを取得します。

これは、NameとHelpTextの2つの文字列型列を持つdatarowsのテーブルをフェッチしたことを前提としています。名前はツールストリップのアイテムラベルとして使用され、アイテムをクリックするとヘルプテキストが表示されます。あなたは名前がこのような何かやっAで始まる行を表すメニュー作成するためにこれを使用することができ

var view = GetMenuDataSet().Tables[0].DefaultView; 
view.RowFilter = "Name LIKE 'A%'"; 
menu.Items.Clear(); 
AddMenuItems(menu.Items, view); 

をこれはGetMenuDataSetは、前述の二つの列を持つテーブルを含むDataSetを返すことを前提とし、デザイン時にフォーム上に "menu"という名前のルートメニュー(例えばContextMenuStrip)を配置したことを確認してください(または、このコードが実行された時点で作成されていることを確認してください)。

階層構造を構築するには、AddMenuItemsを呼び出して、ルートメニューの「Items」の代わりにアイテムのDropDownItemsコレクションを渡すことができます。どちらもToolStripItemCollection型です。

関連する問題