質問者
DataGridViewを含むフォームでのカーソルの移動について

質問
-
以下のようなフォーム(1個のTextBoxと1個のDataGridViewと1個のTextBox)があるときに、
[(TextBox1)][(DataGridViewCell11)][(DataGridViewCell12)][(DataGridViewCell13)] <-この行にはデータが入力されている
[(DataGridViewCell21)][(DataGridViewCell22)][(DataGridViewCell23)] <-この行はデータ未入力の行(新規行)[(TextBox2)]
Tabを順に押下していくと(TextBox1)->(DataGridViewCell11)->(DataGridViewCell12)->(DataGridViewCell13)->(DataGridViewCell21)->(DataGridViewCell22)->(DataGridViewCell23)->(TextBox2)->(TextBox1)->(DataGridViewCell13)・・・
というようにカーソルが遷移すると思いますが、これを、2周目の(TextBox1)の次は(DataGridViewCell11)に遷移するようにはできないものでしょうか?要はキー入力時やControl.Focus()でDataGridViewにフォーカスが遷移したときには画面上の見た目の順番で遷移し、マウスでDataGridView(上のセル)をクリックしたときにはそのセルへフォーカスしたいのですがうまい方法が見つかりません。
すべての返信
-
レス、ありがとうございます。
コリン星人 さんからの引用
要はキー入力時やControl.Focus()でDataGridViewにフォーカスが遷移したときには画面上の見た目の順番で遷移し、マウスでDataGridView(上のセル)をクリックしたときにはそのセルへフォーカスしたいのですがうまい方法が見つかりません。で気持ちが伝わるかな?と思って省略してしまったのですが・・・
1.TabとControl.Focus()では先頭のセルへフォーカスし、
2.Shift+Tabでは最後のセルへフォーカスし、
3.マウスクリックではクリックしたセルへフォーカスしたいのです。教えていただいたコードでは2.のときがうまくいかないように思うので、どうしようかと思案しているところです。
-
なるほど、そういうことでしたか。KeyPreviewをtrueにして、フォームでKeyDownで拾おうと思うと、TABキーはそのままでは拾えないので、次のように泥臭くやるのが簡単じゃないでしょうか?
bool backFlag = false;
private void dataGridView1_Enter(object sender, EventArgs e)
{
if (this.backFlag)
{
DataGridView dgv = ((DataGridView)sender);
dataGridView1.CurrentCell = dataGridView1[dgv.ColumnCount - 1, dgv.RowCount - 1];
}
else
{
dataGridView1.CurrentCell = dataGridView1[0, 0];
}
}
private void textBox1_Leave(object sender, EventArgs e)
{
this.backFlag = false;
}
private void textBox2_Leave(object sender, EventArgs e)
{
this.backFlag = true;
}
-
教えていただいたコードでうまくいきました。
DataGridViewを継承したカスタムコントロールを作成すること(たぶんこういうカーソルの動きは
多いのではないかと思うのです)でうまくいかないかとも思い、思案していましたが、
無理をせず、各フォームでオンコーディングしたほうが楽なようですね。ところで、教えていただいたコードで2点ほど新たな質問があるのですが、
1.dataGridView1上でマウスクリックするとクリックしたセルへフォーカスされるのはなぜでしょうか?
(それが期待した動作なのでそれでいいのですが、教えていただいたコードでは先頭のセルか
最終セルのどちらかしかフォーカスされないような気がしたのですが、なぜかうまくいったので
逆に不思議でした。)
2.変数のdataGridView1とdgvを使い分けているのはなぜでしょうか?
dataGridView1とsenderは同じものだと思っていたのですが何か違いがあるのでしょうか? -
コリン星人 さんからの引用
1.dataGridView1上でマウスクリックするとクリックしたセルへフォーカスされるのはなぜでしょうか?
(それが期待した動作なのでそれでいいのですが、教えていただいたコードでは先頭のセルか
最終セルのどちらかしかフォーカスされないような気がしたのですが、なぜかうまくいったので
逆に不思議でした。)
Enterイベントの後、DataGridViewがクリックされた場所をCurrentCellに設定しているからです。DataGridViewへは、WM_LBUTTONDOWNとWM_LBUTTONUPが送られているので、自分がクリックされたことがわかっています。
CellEnterイベントを見ていると、Enterイベントで一度CurrentCellを最初か最後に設定した後に、クリックされた場所がCurrentCellになることがわかります。コリン星人 さんからの引用
2.変数のdataGridView1とdgvを使い分けているのはなぜでしょうか?
dataGridView1とsenderは同じものだと思っていたのですが何か違いがあるのでしょうか?
すみません。全く私のミスです。コードをテストしているうちにちぐはぐになり、そのままアップしてしまいました。ごめんなさい。m(_ _)m
コードが汎用的になりますので、dgvで統一するのが私の好みです。