0

データベース テーブルから値を取得して FormLoad で項目が生成される toolstripmenu ドロップダウン項目のコードをどのように記述できますか?

プログラムを実行する前に、存在しないこのアイテムの OnClick メソッドを作成するにはどうすればよいですか?

4

1 に答える 1

0

コントロールは他のオブジェクトと同じです。ユーザー インターフェイスを指定するために wysiwyg デザイナーを使用することに慣れているだけです。

だから、このようなもの:

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 つの文字列型の列を持つデータ行のテーブルをフェッチしたことを前提としています。名前はツール ストリップ アイテム ラベルとして使用され、アイテムをクリックするとヘルプ テキストが表示されます。

これを使用して、名前が A で始まる行を表すメニューを次のように作成できます。

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

これは、GetMenuDataSet が前述の 2 つの列を持つテーブルを含む DataSet を返すこと、および設計時に「menu」という名前のルート メニュー (ContextMenuStrip など) をフォームに配置したこと (または、それがこのコードが実行される時間)。

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

于 2013-01-10T10:01:44.453 に答える