前提・実現したいこと
windowsのformアプリをはじめて作成しています。
そのなかでdataGridViewで取得したセルのrowIndexの値を取得して、
contextMenuStripで使いたいのですが、それができません。
よろしくおねがいします。
発生している問題・エラーメッセージ
エラーメッセージはありません。
予期しない動きの原因がわかりました。
dataGridView1_CellClick関数を通っていないことが原因でした。
該当のソースコード
C#
1//前略 2namespace cs_launcher_1 3{ 4 public partial class murrelet : Form 5 { 6 private DataTable dataTable = new DataTable(); 7 int row; 8 9 public murrelet() 10 { 11 InitializeComponent(); 12 13 } 14 15 private void murrelet_Load(object sender, EventArgs e) 16 { 17 this.Text = "murrelet"; 18 using (SQLiteConnection con = new SQLiteConnection("Data Source = test.db")) 19 using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM games", con)) 20 { 21 adapter.Fill(dataTable); 22 con.Close(); 23 } 24 } 25 26 void dataGridView1_CellClick(object sender, DataGridViewCellMouseEventArgs e) 27 { 28 string title; 29 string brand; 30 // if (e.ColumnIndex != -1 && e.RowIndex != -1 && e.Button == System.Windows.Forms.MouseButtons.Right) 31 if (e.Button == System.Windows.Forms.MouseButtons.Right) 32 { 33 row = e.RowIndex; 34 //テスト 35 Console.WriteLine(row); 36 } 37 } 38 39//中略 40 41 private void タイトルToolStripMenuItem_Click(object sender, EventArgs e) 42 { 43 string title = (string)dataTable.Rows[row][1]; 44 Clipboard.SetText(title); 45 } 46 } 47}
C#
1//Form1.Designer.cs 2 3//dataGridView1の部分 4 this.dataGridView1.AllowUserToAddRows = false; 5 this.dataGridView1.AllowUserToDeleteRows = false; 6 this.dataGridView1.AllowUserToResizeRows = false; 7 this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 8 this.dataGridView1.ContextMenuStrip = this.contextMenuStrip1; 9 //追加部分 10 this.dataGridView1.Location = new System.Drawing.Point(0, 27); 11 this.dataGridView1.MultiSelect = false; 12 this.dataGridView1.Name = "dataGridView1"; 13 this.dataGridView1.ReadOnly = true; 14 this.dataGridView1.RowTemplate.Height = 21; 15 this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 16 this.dataGridView1.Size = new System.Drawing.Size(802, 401); 17 this.dataGridView1.TabIndex = 0; 18 this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick); 19 this.dataGridView1.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView1_CellClick); 20 21//contextMenuStrip1の部分 22this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 23 this.編集ToolStripMenuItem, 24 this.開くToolStripMenuItem, 25 this.コピーToolStripMenuItem, 26 this.削除ToolStripMenuItem, 27 this.設定ToolStripMenuItem1}); 28 this.contextMenuStrip1.Name = "contextMenuStrip1"; 29 this.contextMenuStrip1.Size = new System.Drawing.Size(126, 114);
試したこと
追記
dataGridView1_CellClick関数内での変数の代入処理の下に
"this.toolStripStatusLabel1.Text = "通った";"と追記しました。
すると表示されていなかったので、関数を通っていないことが原因でした。
dataGridView1_CellClickをどのイベントに対して割り当てていますか。
イベントハンドラがイベントにアタッチされていない。
→CellMouseClickに割り当てられていました。
イベントの選び方が不適切かどうかはわかりませんでした。
イベントが発生していない→左クリックだと発生しています。右クリックで発生しません。
左クリックでは関数を通っているので右クリックだと関数よりcontextMenuStripが優先されているのでしょうか。
補足情報(FW/ツールのバージョンなど)
Windows 10 Home 20H2
VisualStudioVersion = 16.0.31624.102
C#
.NET framework 4.7.2
回答2件
あなたの回答
tips
プレビュー