2017-07-11 25 views
2

DataGridViewの右クリックでコンテキストメニューを挿入します。私は、クリックされたセルの内容から派生した単一のメニュー項目と、データベースから検索されたサブメニュー内の可変数の項目を持っていたいと思います。ToolStripMenuItem ShowDropDown - イベントが発生しません。

これは、ContextMenuStrip OpeningイベントでToolStripMenuItemを構築することで行います。ほとんどの場合...

サブメニューを非表示にしてトップレベルメニューの1つの項目をクリックする必要がある場合はすべて問題ありませんが、ShowDropDownメソッドを呼び出してサブメニューを自動で表示すると、アイテムをクリックするとエキセントが起動しません。

は、ここで私は、問題を再現するために生成することができ、最も簡単なコードです - あなたはこれがある置けば私の「ダイナミック」メニューは

;-)明らかに静的であるので、私はDataGridViewの、データベースへのすべての参照を引き抜いてきましたフォームの定義を右クリックして、フォームのどこかを右クリックすると、動作しますが、望ましくない動作が表示されます。サブメニューをクリックし、ポップアップを表示します。チェックボックスにチェックを入れてもう一度右クリックすると、サブメニューが自動的に飛ぶようになりますが、アイテムをクリックするとaliasClickハンドラは起動しません。

どのような考えですか?この特定のアプリケーションでは、ShowDropDownの使用を避ける、完璧に処理可能な回避策をコーディングすることができますが、将来使用する必要がある場合にどうしたらいいか分かります。

public partial class Form1 : Form 
{ 
    private ContextMenuStrip cms; 
    private CheckBox chkAuto; 

    public Form1() 
    { 
     InitializeComponent(); 

     chkAuto = new CheckBox(); 
     Controls.Add(chkAuto); 

     cms = new ContextMenuStrip(); 
     cms.Opening += contextMenuStrip1_Opening; 

     this.MouseClick += Form1_MouseClick; 
    } 

    private void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
      cms.Show(Cursor.Position); 
    } 

    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
    { 
     cms.Items.Clear(); 
     ToolStripMenuItem tsmi = new ToolStripMenuItem("Title from datagridviewcell"); 
     tsmi.DropDownItems.Add(new ToolStripMenuItem("First item from database lookup", null, aliasClick)); 
     tsmi.DropDownItems.Add(new ToolStripMenuItem("Second item from database lookup", null, aliasClick)); 
     tsmi.DropDownItems.Add(new ToolStripMenuItem("Last item from database lookup", null, aliasClick)); 
     cms.Items.Add(tsmi); 
     if (chkAuto.Checked) 
      tsmi.ShowDropDown(); 
     e.Cancel = false; 
    } 
    private void aliasClick(object sender, EventArgs e) 
    { 
     ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; 
     MessageBox.Show(clickedItem.Text); 
    } 
} 

答えて

0

私はこれを証明するに取り掛かるするかどうかは全くわからないんだけど、私はtsmi.ShowDropDown()へのお電話は何とか座標がクリックハンドラによって適切に捕獲されていないために発生していると思われます。それをcms.Show(MousePosition)と交換すると動作します。

座標を見てから収集おそらく、いくつかの有用な情報...

var mi = new ToolStripMenuItem("First item from database lookup", null, aliasClick); 
tsmi.DropDownItems.Add(mi); 
var mi2 = new ToolStripMenuItem("Second item from database lookup", null, aliasClick); 
tsmi.DropDownItems.Add(mi2); 
var mi3 = new ToolStripMenuItem("Last item from database lookup", null, aliasClick); 
tsmi.DropDownItems.Add(mi3); 
cms.Items.Add(tsmi); 
if (chkAuto.Checked) 
    tsmi.ShowDropDown(); 
    //cms.Show(MousePosition); 
Debug.WriteLine(mi.Bounds.ToString()); 
+0

私は素早くいじくりを持っていたが、 'cms.Showは()'イベントハンドラを保つんが、そうでありません(私が知る限り)サブメニューが自動的に開きます。私はあなたが座標について正しいと思う - しかし、私はそれについて何をすべきかわかりません! – Dwauctioneer

+0

好奇心。私のテストアプリでは、メニューが期待通りに開きます。 – DonBoitnott

+0

トップレベルの項目にカーソルを合わせるかクリックすると開きますが、私にとってはそれ以外の場合は開きません。マウスを離れてcmsを開くと見つけやすいかもしれません: 'private void Form1_MouseClick(オブジェクト送信者、MouseEventArgs e) { if(e.Button == System.Windows.Forms.MouseButtons.Right)cms.Show(新しい点(Cursor.Position.X + 50、Cursor.Position.Y + 50)); } ' 私はVS Expressの無料版とVS Pro 2015の作業で自宅で試しました – Dwauctioneer

関連する問題