2010/09/03(Fri) 19:10:39 編集(投稿者)
■No53092 (chrometaro さん) に返信
> 最近 DataGridView を使い始めたんですが、セルを選択して全角スペースを押して編集を開始するとなぜか
> 全角スペースが2つ入力されてしまう現象に遭遇しました。
>
> 分からないのが検索でこの現象が全然引っかからないことです???
> もっと別の解決方法があってみなさん言うまでもないって感じなんだろうか(><)
> 日本語で入力することなんてあたりまえだろうし、自分の作り方が間違ってるだけ???
> と思い質問させていただきました。
>
> 同じ現象に遭遇された方がいらっしゃればその時の対処方法など教えて頂きたいです。
> どうぞよろしくお願いしますm(_ _)m
んー、同じ現象が出ますね。これは単純にDataGridViewの仕様っぽいですね。
全角スペース以外の文字の場合は、漢字変換待ちの状態になっているので動作的には自然ですが、全角スペースの場合だと変換待ちになる前に確定になるためと思います。
とりあえず検証してみたこと。
DataGridViewを継承して、OnPreviewKeyDownをハンドル。
protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
{
Console.WriteLine("OnPreviewKeyDown:" + e.KeyCode);
base.OnPreviewKeyDown(e);
}
継承したコントロールのインスタンスのEditingControlShowingイベントでセルのKeyDownとKeyPressをトレース。
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl ctr = dataGridView1.EditingControl as DataGridViewTextBoxEditingControl;
ctr.KeyDown -= new KeyEventHandler(ctr_KeyDown);
ctr.KeyDown += new KeyEventHandler(ctr_KeyDown);
ctr.KeyPress -= new KeyPressEventHandler(ctr_KeyPress);
ctr.KeyPress += new KeyPressEventHandler(ctr_KeyPress);
}
void ctr_KeyPress(object sender, KeyPressEventArgs e)
{
Console.WriteLine("|" + e.KeyChar + "|");
}
void ctr_KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("Cell_KeyDown:" + e.KeyCode);
}
【結果】
・aを入力した場合
OnPreviewKeyDown:A
Cell_KeyDown:A
|a|
・半角スペースを入力した場合
OnPreviewKeyDown:Space
Cell_KeyDown:Space
| |
・ひらがなで「あ」と入力した場合
OnPreviewKeyDown:ProcessKey
Cell_KeyDown:ProcessKey
そのあとEnterで確定した場合
Cell_KeyDown:ProcessKey
|あ|
|あ|
・全角スペースを入力した場合
OnPreviewKeyDown:ProcessKey
Cell_KeyDown:ProcessKey
Cell_KeyDown:ProcessKey
| |
| |
と、こんな感じでした。全角スペースの場合は、Enterで確定する必要はないので半角文字と同じ動作をしているようです。
対応としては、chrometaroさんのされているようにOnPreviewKeyDownで対応する方法で良いと思います。
#図表モードに変更しました。