質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5629閲覧

DataGridViewのセルをクリックした際にセルの場所が取得できない

motmot

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2021/02/16 11:36

前提・実現したいこと

C#の勉強を始めました。

WindowsFormでDataGridViewでクリックしたセルの位置を取得したいです。
調べてみて以下のコードを書いてみましたがうまくいきません。

C#

1private void GridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 2 { 3 // メソッドの引数senderから対象となるDataGridViewオブジェクトを取得します。 4 var dataGridView = (DataGridView)sender; 5 // マウスがクリックされた座標(e.X, e.Y)から、DaataGridViewのHitTestメソッドでDataGridViewの位置情報を保持するHitTestInfoオブジェクトを取得します。 6 DataGridView.HitTestInfo hitTestInfo = dataGridView.HitTest(e.X, e.Y); 7 8 int clickX = hitTestInfo.RowIndex; 9 int clickY = hitTestInfo.ColumnIndex; 10 }

発生している問題・エラーメッセージ

DataGridView内のどこのセルをクリックしてみてもhitTestInfoの中に

ColumnIndex:-1 ColumnX:0 RowIndex:-1 RowY:0 Type:TopLeftHeader

という値が入ってしまい、思ったように値が取得できません。
どうしてこうなってしまうかわかる方がいたら教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

WindowsForm

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/16 12:41

DataGridView.CellClick イベントではいかがですか?
motmot

2021/02/16 12:45

>SurferOnWwwさん ご回答ありがとうございます。 DataGridViewCellEventArgsではdataGridView.HitTest(e.X, e.Y)のe.Xとe.Yが取得できないみたいです。
退会済みユーザー

退会済みユーザー

2021/02/16 14:26

どのセルがクリックされたかが分かればいいと思っていたんですが違ったようですね。失礼しました。
guest

回答1

0

ベストアンサー

イベントを間違ってませんか?

CellMouseDownだとクリックされたセルの左上隅(0,0)を起点とした座標がe.X, e.Yに入っていると思われます。
HitTestは対象データグリッドビューの左上隅を起点とした座標で列番号・行番号を返すはずです。

なのでCellMouseDownでの座標をHitTestに渡すと正しくない座標を渡していることになります

なので掲示されたソースだとCellMouseDownではなくMouseDownイベントを使用すると正しくセル情報が取得できます。

投稿2021/02/17 01:03

編集2021/02/17 01:05
dekaaki

総合スコア292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

setoppu

2021/02/17 01:17 編集

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { DataGridView Target = (DataGridView)sender; DataGridView.HitTestInfo HitInfo = null; Rectangle CellRect = Target.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); System.Diagnostics.Debug.WriteLine(string.Format("CellMouseDown:e.X={0}/e.Y={1} CellRectangle={2}", e.X, e.Y, CellRect)); HitInfo = Target.HitTest(e.X, e.Y); System.Diagnostics.Debug.WriteLine(string.Format(" ArgsPos={0},{1}/{2}", e.X, e.Y, HitInfo.ToString())); HitInfo = Target.HitTest(CellRect.Left + e.X, CellRect.Top + e.Y); System.Diagnostics.Debug.WriteLine(string.Format(" ControlPos={0},{1}/{2}", CellRect.Left + e.X, CellRect.Top + e.Y, HitInfo.ToString())); } private void dataGridView1_MouseDown(object sender, MouseEventArgs e) { DataGridView Target = (DataGridView)sender; DataGridView.HitTestInfo HitInfo = null; System.Diagnostics.Debug.WriteLine(string.Format("MouseDown:e.X={0}/e.Y={1}", e.X, e.Y)); HitInfo = Target.HitTest(e.X, e.Y); System.Diagnostics.Debug.WriteLine(string.Format(" ArgsPos={0},{1}/{2}", e.X, e.Y, HitInfo.ToString())); HitInfo = Target.HitTest(Target.Left + e.X, Target.Top + e.Y); System.Diagnostics.Debug.WriteLine(string.Format(" ClientPos={0},{1}/{2}", Target.Left + e.X, Target.Top + e.Y, HitInfo.ToString())); } ということで、dekaakiさんの指摘が正しいかと。 TY0014さんが回答しているColumnIndexとRowIndexで足りると思いますが、どうなんでしょう? 列ヘッダや行ヘッダをクリックした場合などには注意が必要ですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問