編集3:RowTemplate.ContextMenuStrip
は正常なプログラマが使用するように設計されていないことが明らかになりました。以下に説明するすべての問題に加えて、各行に対して生成されたコンテキストメニューは、元のクローンですが、まではのみです。コンテキストメニューに表示されるではなく、サブメニューにはが表示されます。そして明らかにそれはまたmemory leakを引き起こします。物語のモラル:RowTemplate.ContextMenuStrip
をこれまで使用しないでください。C#DataGridViewRowのContextMenuStrip:SourceControlに相当するものは何ですか?
だから私は、ユーザーが右DataGridView
内の空白部分をクリックしたときに、私は、ユーザーが右DataGridView
の任意の行をクリックしたときに、コンテキストメニューを表示するには、「正しい」方法を考え出したと思ったが、ありません:
はDataGridView
のRowTemplate
のContextMenuStrip
プロパティを設定することで、私は簡単にDataGridView
の行のそれぞれにコンテキストメニューを添付することができます。しかし、コンテキストメニューを表示するとき、私はを知る必要があります。行が右クリックされています。通常、コンテキストメニューがどこから来るのかを知る方法は、ContextMenuStrip.SourceControl
プロパティを使用していますが、この場合は、DataGridViewRow
はコントロールではないため、DataGridView
が返されます。だから、どの行が右クリックされているかをどのように知ることができますか?
編集:この方法で行にコンテキストメニューを割り当てると、実際には各行にクローンの同じContextMenuStrip
が割り当てられていることがわかりました。つまり、それぞれのContextMenuStrip
のTag
プロパティを対応するDataGridViewRow
に設定することができます。しかし、これが非効率的であるかどうか、これが他の目に見えない問題を引き起こすかどうかはわかりません。
編集2:私はSourceControl
プロパティはnullを返し思ったが、それは間違っていた - 私は、元ContextMenuStrip
のSourceControl
プロパティをチェックして、開いたContextMenuStrip
は単にのクローンです。
編集3:質問の先頭を参照してください。
右クリックした行は必ずしも選択された行ではありません。 –
ユーザーが最初にそれを選択しなかったのではありません。 [このコード](https://stackoverflow.com/a/27702246/17034)をオフにして、右クリックで行を選択し、CMSを表示することを検討してください。 –