質問者
dataGridViewのCell に何か入力しているとき、KeyDownが走らないのはなぜですか?

質問
すべての返信
-
セルが編集状態になっている時、そこにはDataGridViewTextBoxEditingControlが現れています。なので、こいつにKeyDownイベントハンドラを登録しなければダメです。
基本的な流れは以下のようになります。DataGridViewTextBoxEditingControl editingControl;
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
editingControl = (DataGridViewTextBoxEditingControl)e.Control;
editingControl.KeyDown += new KeyEventHandler(editingControl_KeyDown);
}
void editingControl_KeyDown(object sender, KeyEventArgs e)
{
//なんかの処理
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
editingControl.KeyPress -= new KeyEventHandler(editingControl_KeyDown);
}
-
そのままコピーして動かしてみました。
dataGridView1_EditingControlShowing
↓
editingControl_KeyDown
↓
dataGridView1_CellEndEditの順で呼ばれるんですね。今までKeyDownの中で書いていたことを、
editingControl_KeyDown の中に処理を書いて行こうと思います。けど、dataGridView1_CellEndEdit 内の
「editingControl.KeyPress -= new KeyEventHandler(editingControl_KeyDown);」はSystem.Windows.Forms.KeyEventHandler を System.Windows.Forms.KeyPressEventHandler 変換できない
というエラーが出てしまい、使えませんでした。 -
さっち さんからの引用
System.Windows.Forms.KeyEventHandler を System.Windows.Forms.KeyPressEventHandler 変換できない
というエラーが出てしまい、使えませんでした。
すみません。editingControl.KeyPressはeditingControl.KeyDownの間違いでした。(実際に動かしてない事がバレてしまう(^^;)さっち さんからの引用
[Enter]キーが押されたとき呼ばれる方法、
またはイベントはありますか?
であれば、上で書いたことは全て忘れて下さい。すみません。
変わりに以下のコードを使います。
コメントにも書いていますが、DataGridViewの列を独自に作成した列とすげ替えますので、DataGridViewの「列の編集ダイアログ」で、myDataGRidViewTExtBoxColumnを選択して下さい。Enterキーを拾いたい列だけでかまいません。/// <summary>
/// 独自の列
/// DataGridViewの「列の編集ダイアログ」で、このmyDataGRidViewTExtBoxColumnを選択すること。
/// </summary>
public class myDataGridViewTextBoxColumn : DataGridViewTextBoxColumn
{
public myDataGridViewTextBoxColumn()
{
base.CellTemplate = new myDataGridViewTextBoxCell();
}
}
/// <summary>
/// 独自のセル
/// </summary>
public class myDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
public override Type EditType
{
get
{
return typeof(myDataGridViewTextBoxEditingControl);
}
}
protected override void OnKeyDown(KeyEventArgs e, int rowIndex)
{
// 編集時じゃない時にEnterキーが押されたことを検出
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
//何かの処理
}
base.OnKeyDown(e, rowIndex);
}
}
/// <summary>
/// 独自の編集時に表示されるテキストボックス
/// </summary>
public class myDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
{
// 編集時にEnterキーが押されたことを検出
if ((e.KeyData & Keys.KeyCode) == Keys.Enter)
{
//何かの処理
}
base.OnPreviewKeyDown(e);
}
}