質問者
DataGridの最後の列を入力不可(フォーカスは当てはまる)に設定した場合、DataGridから次のコントロールへフォーカスが移動されない

質問
-
お世話になります。
簡単な問題かもしれませんが、初心者なので質問させていただきます。
C#のWindowsApplicationを作成において、
DataGridの最後の列を入力不可(フォーカスは当てはまる)に設定した場合、
フォーカスをDataGridの最終セルに移動してからまたTABキーを押下しても、
DataGridの次のコントロールに移動されません。
DataGridの最後の列を入力可に変更して、DataGridの最後のセルからTABキーを押下したら、
フォーカスが次のコントロールにちゃんと移動されます。
いろいろ調査してみましたが、力不足で解決できませんでした。
原因と対策がご存知の方、ぜひご教授お願いいたします。
すべての返信
-
mars12 さん、trapemiya さん
ご返信ありがとうございました。
記述が足りなくて申し訳ございませんでした。
入力不可設定はtrapemiyaさんのご提示通り、「DataGridColumnStyleでReadOnlyをtrueと設定」の方法でやりました。
ただ、trapemiyaさんのところでは再現しませんでしたので、もう一回確認させていただきます。
また、最終列の前列にDataTimePickerを埋め込んだ列を実装して、キー操作(Alt+↑↓によるDataTimepickerのカレンダー表示とか)を実現するために以下のソースを組み込みました(※1)。
普通のDataGridで現象が起きない場合、以下のソースが原因になる可能性が大きいと思います。
引き続き調査しますが、すでに原因が推定される方がいらっしゃいましたら、ぜひご教授お願いいたします。
------------------
protected override bool ProcessKeyMessage(ref Message m) {
// Keep all the keys for the DateTimePicker.
return ProcessKeyEventArgs(ref m);
//return true;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {const int WM_KEYDOWN = 0x100;
const int WM_SYSTEMDOWN = 0x104;
const int WM_SYSKEYDOWN = 0x104;
const int VK_DOWN = 0x28;
if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSTEMDOWN) {if (keyData == (Keys.Alt | Keys.Down)) {
SendMessage(this.Handle, WM_SYSKEYDOWN, VK_DOWN, 0);
}
}return base.ProcessCmdKey(ref msg, keyData);
}
[System.Runtime.InteropServices.DllImport("User32.dll",EntryPoint="SendMessageA")]
public static extern int SendMessage(IntPtr hWnd, int nMsg, int wParam, int lParam);------------------------------------
※1 全体ソースは下記のスレッドで参照できます。
<http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=521851&SiteID=7>