2017-08-03 4 views
0

コンテキストメニューのポップアップに問題があります。 私は、ユーザーがセルを右クリックしてコンテキストメニューを表示できるようにするdatagridviewを持っています。ユーザーは、連続または非連続セルを複数選択できます。右クリックしてコンテキストメニューを表示します。私はスタックのオーバーフローの質問を読んで、提案を試してみて、どれも私のために働いていません。コンテキストメニューは、選択したセルの近くには表示されません。右クリックが発生したDataGridviewセルの近くにコンテキストメニューが表示されない

私はdatagridview cellmouse downイベントの後ろにコーディングしていて、マウスの右ボタンをチェックしています。ここに私のコードは次のとおりです。

if (e.Button == MouseButtons.Right) 
{ 
    ContextMenu m = new ContextMenu(); 
    MenuItem mi = new MenuItem("Set Online"); 
    mi.Click += setOnlineItemCell_Click; 
    m.MenuItems.Add(mi); 

    MenuItem mi2 = new MenuItem("Set Offline"); 
    mi2.Click += setOfflineItemCell_Click; 
    m.MenuItems.Add(mi2); 

    m.Show(machineGrid, new Point(e.X, e.Y)); 
} 

それは(MSDNはあなたができると言うにもかかわらず)それを見つけることができません不平を言うと、私は、Showメソッドに1つだけのパラメータを渡すことはできません。

コンテキストメニューをセルの近くに表示するための助けがあれば、大歓迎です。

のC#、Visual Studioの2015年のプロフェッショナル、.NET 4.5.2

答えて

0

最後の「選択」のセルの隣に表示するには、コンテキストメニューを取得するには、なんとかです。しかし、それは非常にユーザーフレンドリーではありません。ほとんどの場合、ユーザが何かを「右クリック」すると、ユーザが「右クリック」したときにマウスの「ポインタ」がどこにあっても、コンテキストメニューが「下に」表示されることが期待されます。あなたが描写しているのは、マウスの "矢"の位置からコンテキストメニューを "離れて"動かすことです。私はほとんどのユーザーがこれを期待していないと確信しています。

あなたが投稿したものから推測しています...ユーザがグリッド内の複数のセルを選択した後、グリッド上のどこかで右クリックしたとします。これは、マウスの下にコンテキストメニューを表示し、選択したセルにメニューを移動しません。コンテキストメニューには、 "OffLine/OnLine"メニュー項目が表示されます。次に、ユーザーが「オンライン/オフライン」を選択した後、グリッド内の「選択された」セルをデータとして使用して、セルをオンラインまたはオフラインに設定します。これはあなたの質問から私が解読できる程度です。

以下は参考になるものです。ポストのコードの最後の行。

m.Show(machineGrid, new Point(e.X, e.Y)); 

上記の行は、UI座標を使用してコンテキストメニューをグリッドX、Y値に移動します。これは、どのセルが「選択」されているかとは関係がないように見えます。それでも、これは、ユーザが右クリックした場所の上のどこかでコンテキストメニューを移動させます...ユーザにコンテキストメニューを「追いかけ」させる。

最後に、このコンテキストメニューロジックを実行するために、「CellMouseDown」イベントの使用について質問します。 DataGridViewには独自の「ContextMenuStrip」があり、これを設定することができます。 DataGridView’sContextMenuStripを使用する方が簡単な方法かもしれません。以下は、という名前のDataGridViewContextMenuStripと設定した例です。

これらの項目は、上の行を追加し、メニューに表示する文字列、画像、最後にクリックすると呼び出すイベントを取ります。

ユーザーがコンテキストメニュー項目を選択したときに発生するイベントです。

private void setOffline_Click(object sender, EventArgs e) { 
    MessageBox.Show("SetOffLine"); 
} 
private void setOnline_Click(object sender, EventArgs e) { 
    MessageBox.Show("SetOnLine"); 
} 

希望します。

+0

私をまっすぐにしてくれてありがとう。なぜ私がそんなにばかげているのか分かりません。 –

+0

喜んで助けてください。群衆に参加する。ある日アイデアを実装した後、同じコードを調べて自分自身に言う... "WTFは私が思っていた!"そこに行って、やって! :-) がんばろう! – JohnG

関連する問題