DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridの同じセルをクリックしたときMouseDownイベントが発生しない

環境/言語:[Win2000 C# NET Frameworkのバージョン(1.1.4322 SP1)]
分類:[.NET]

初めまして。いつも参考にさせていただいております。
.NET Tips「DataGridの指定された座標位置の情報を取得する」を参照し、DataGrid上のMouseDownイベントとHitTestメソッドにより、セルの情報を取得しようとしています。具体的には、あるセルをクリックするたびにセル内の文字を切り替えるという処理をしたいのですが、同じセルを続けてクリックすると、2回目以降MouseDownイベントそのものが発生せず、思ったような処理ができません。参照セル位置をイベントの最後で他のセルに切り替えたりしてみたのですがうまく行きませんでした。これはDataGridの仕様なのでしょうか。お知恵をお貸しください。
■No8031に返信(たっちゃんさんの記事)
> .NET Tips「DataGridの指定された座標位置の情報を取得する」を参照し、
> DataGrid上のMouseDownイベントとHitTestメソッドにより、セルの情報を
> 取得しようとしています。
> 同じセルを続けてクリックすると、2回目以降MouseDownイベントそのものが
> 発生せず、思ったような処理ができません。

最初にセルをクリックした時点で、カーソルがそのセルに入ってませんか?
カーソルがセルの中にある場合、MouseDownイベントはDataGridの内部の
DataGridTextBox上で発生し、DataGridには送られないようです。
DataGridTextBoxのMouseDownイベントに必要な処理を関連づけてあげる
必要があると思います。

#DataGird内のすべてのDataGridTextBoxに対してイベントの関連づけが
 必要だから、ちょっと面倒かな。
小野@どっとねっとふぁんさん、アドバイスありがとうございました。
DataGridTextBoxのイベントになっていたのですね。
そこで、以下のように、DataGridTextBoxColumnのインスタンスに対してMouseDownのイベントを発生させ、DataGrid自体のMouseDownのイベントと併用で思ったような処理ができました。

 DataGridTextBoxColumn style = new DataGridTextBoxColumn();
 style.TextBox.MouseDown += new System.Windows.Forms.MouseEventHandler
(this.dataGridTextBox_MouseDown);

>DataGird内のすべてのDataGridTextBoxに対してイベントの関連づけが
>必要だから、ちょっと面倒かな。

今回は1列だけでよかったので、これで十分でした。また、セル位置の取得はどぼんさんのTipsにあった、

 //マウスポインタのスクリーン座標をクライアント座標に変換
 Point p = DataGrid1.PointToClient(Cursor.Position);
 //座標位置の情報を取得
 System.Windows.Forms.DataGrid.HitTestInfo hti;
 hti = DataGrid1.HitTest(p);
を、テキストの取得は、
 System.Windows.Forms.DataGridTextBox dgtb = (
System.Windows.Forms.DataGridTextBox)sender;
 string tes = dgtb.Text;
で行いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板