タイトル | : Re: DataGridView上で右クリック |
記事No | : 12143 |
投稿日 | : 2024/02/14(Wed) 10:09 |
投稿者 | : 魔界の仮面弁士 |
> Visual Studio 2022 Windows11 でプログラムを作成しています。 ターゲット フレームワーク は何ですか?
> フォーム上にDaraGridViewを2つ配置し、ContextMenuを作成し .NET Framework 2.0 以降の ContextMenuStrip クラスではなく、 .NET Framework 1.0 以降の ContextMenu クラスを使っているのですね?
下位互換性のために ContextMenu も残されていますが、 通常は ContextMenuStrip を使う方が一般的かと思いますよ。
dgv1.ContextMenu = New ContextMenu() dgv2.ContextMenuStrip = New ContextMenuStrip() https://dobon.net/vb/dotnet/control/menuitempopup.html
> 右クリックでメニューを呼び出すようにしています。 コンテキストメニューの呼び出しは本来、マウスの右クリックだけでなく、 キーボード右下のアプリケーション キーでの呼び出しや Shift + F10 キーなど、 複数の呼び出し方法があるはずです。右クリック以外の操作時のメニューも確認してみてください。
> もう一方は右クリック時に選択状態がすべて解除され、メニューが表示されてしまいます。 新規プロジェクトで、DataGridView にサンプルデータを表示するだけの 単純なプロジェクトを作成し、それで再現しますか? (データベースの値では無く、固定値を読み込ませる形で良い) 再現するのであれば、そのコードを提示いただきたいです。
再現しないのであれば、元コードを解析しないと流石に分からないです。
プロパティの設定(TabIndex の入れ替えや、[手前に表示]の切り替えも含む)、 イベントの割り当て有無やその実装内容、データを読み込ませるイベント処理の実行タイミング等々、 何が要因なのかはソースを見ないと分かりません。 コードをできる限りコメントアウトしていくなどして、原因を探ってみてください。
当方で下記のコードで試してみた限りでは、選択状態が解除される事象は確認できていません。
'何もコントロールを貼っていない空のフォームの上に、検証用の DataGridView を貼ってみる Public Class Form1 Private WithEvents splitContainer1 As SplitContainer Private WithEvents dgv1 As DataGridView Private WithEvents dgv2 As DataGridView Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load splitContainer1 = New SplitContainer() With {.Dock = DockStyle.Fill, .Parent = Me, .Name = "splitContainer1"} dgv1 = New DataGridView() With {.Dock = DockStyle.Fill, .Parent = splitContainer1.Panel1, .Name = "dgv1"} dgv2 = New DataGridView() With {.Dock = DockStyle.Fill, .Parent = splitContainer1.Panel2, .Name = "dgv2"} splitContainer1.SplitterDistance = splitContainer1.Width \ 2
dgv1.AllowUserToAddRows = False dgv2.AllowUserToAddRows = False dgv1.RowCount = 100 dgv2.RowCount = 100 dgv1.ColumnCount = 10 dgv2.ColumnCount = 10 dgv1.SelectionMode = DataGridViewSelectionMode.CellSelect dgv2.SelectionMode = DataGridViewSelectionMode.CellSelect dgv1.TopLeftHeaderCell.Value = "dgv1" dgv2.TopLeftHeaderCell.Value = "dgv2" dgv1.SelectAll() dgv2.SelectAll()
'--- ContextMenu vs. ContextMenuStrip dgv1.ContextMenu = New ContextMenu() dgv2.ContextMenuStrip = New ContextMenuStrip() AddHandler dgv1.ContextMenu.MenuItems.Add("Test").Click, Sub() dgv1.TopLeftHeaderCell.Value = Now.ToString("HH:mm:ss.fff") AddHandler dgv2.ContextMenuStrip.Items.Add("Test").Click, Sub() dgv2.TopLeftHeaderCell.Value = Now.ToString("HH:mm:ss.fff") AddHandler dgv1.MouseUp, Sub(dgv, p) If MouseButtons.Right.HasFlag(p.Button) Then dgv1.ContextMenu.Show(dgv1, p.Location) AddHandler dgv1.KeyUp, Sub(dgv, p) If p.KeyCode = Keys.Apps Then dgv1.ContextMenu.Show(dgv1, New Point(dgv1.Width \ 2, dgv1.Height \ 2)) AddHandler dgv1.KeyUp, Sub(dgv, p) If p.KeyCode = Keys.F10 AndAlso p.Shift Then dgv1.ContextMenu.Show(dgv1, New Point(dgv1.Width \ 2, dgv1.Height \ 2)) End Sub End Class
|