0

ContextMenuStripアプリケーションのすべてのワークスペース コントロールに共通のものがあります。これContextMenuStripには 4 つの項目 (「前に移動」、「後ろに移動」、「コントロールを削除」) が含まれます。

今、私はそれを 1 つのコントロールに拡張したいと考えています。このコントロールには がありDataGridView、選択した を削除する追加の項目が必要ですDataGridViewRow

これは私が試したコードです:

    private void extendContextMenuOfDataGridViewRow (DataGridViewRow row) {
        ContextMenuStrip ctx = new ContextMenuStrip();
        foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) {
            ctx.Items.Add(item);
        }
        ctx.Items.Add(new ToolStripSeparator());
        ToolStripMenuItem ctxDeleteRow = new ToolStripMenuItem("Delete row");
        ctxDeleteRow.Name = "ctxDeleteRow";
        ctxDeleteRow.Click += new EventHandler(ctxDeleteRow_Click);
        ctx.Items.Add(ctxDeleteRow);

        row.ContextMenuStrip = ctx;
    }

ループの最初の項目がデバッガーforeachに追加された後、ctx.Itemsメソッド全体が終了し、最初の項目が common にありませんContextMenuStrip

どうすればそれを正しく行うことができますか?

4

2 に答える 2

0

何らかのコントロールの機能を拡張したい場合は、次のいずれかを実行できます

a) 拡張メソッドを作成する

public void DoSomething(this MyExtendedControl mec, DataGridViewRow row)
{
}

b)必要に応じてオーバーライド/追加できる場合は、不十分なコントロールから継承する新しいクラスを作成します(または完全に新しいコントロールを作成します)。

あなたの特定のニーズに依存します、あなたの説明から理解できませんでした...

于 2012-06-11T10:51:34.637 に答える
0

私は長い間 WinForms を使用していませんが、同じRowオブジェクトを 2 つの異なる に同時に割り当てておくことができるStripでしょうか?

foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) {
    ctx.Items.Add(item);
}

行はその親と「会話」する必要があるため、これが設計上機能するはずがないことを真剣に疑っています。別のストリップに追加することで、親を再割り当てしているのではないかと心配しています。

代わりに、アイテムを共通メニューに追加しますが、そのVisibleプロパティはfalseです。
次に、メニューを開くイベントをキャッチし、ターゲットがDataGridViewRow.

于 2012-06-11T10:52:14.297 に答える