C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridViewで編集開始時の全角スペースが2個に?


(過去ログ 89 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■53092 / inTopicNo.1)  DataGridViewで編集開始時の全角スペースが2個に?
  
□投稿者/ chrometaro (1回)-(2010/09/02(Thu) 23:21:19)

分類:[C#] 

最近 DataGridView を使い始めたんですが、セルを選択して全角スペースを押して編集を開始するとなぜか
全角スペースが2つ入力されてしまう現象に遭遇しました。

その時は次のように DataGridView OnPreviewKeyDown をオーバライドして解決したんですが

        protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
        {
            // IMEの仮想キーだった場合グリッドを編集状態にする
            if (e.KeyValue == (int)ConsoleKey.Process)
            {
                BeginEdit(false);
            }

            base.OnPreviewKeyDown(e);
        }

分からないのが検索でこの現象が全然引っかからないことです???
もっと別の解決方法があってみなさん言うまでもないって感じなんだろうか(><)
日本語で入力することなんてあたりまえだろうし、自分の作り方が間違ってるだけ???
と思い質問させていただきました。

同じ現象に遭遇された方がいらっしゃればその時の対処方法など教えて頂きたいです。
どうぞよろしくお願いしますm(_ _)m

引用返信 編集キー/
■53140 / inTopicNo.2)  Re[1]: DataGridViewで編集開始時の全角スペースが2個に?
□投稿者/ すなふきぬ (37回)-(2010/09/03(Fri) 19:10:06)
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で対応する方法で良いと思います。

#図表モードに変更しました。

引用返信 編集キー/
■53141 / inTopicNo.3)  Re[2]: DataGridViewで編集開始時の全角スペースが2個に?
□投稿者/ なし (12回)-(2010/09/03(Fri) 20:40:54)
2010/09/03(Fri) 20:45:47 編集(投稿者)
2010/09/03(Fri) 20:44:10 編集(投稿者)

No53092 (chrometaro さん) に返信

VS2008とVS2010のどちらでも再現しますね。
検索しても出てこないのは、ほとんどの人が気づいていないからじゃないでしょうかね。

IMEがONの場合、初めに空白を入力すると空白が確定した状態で直接入力されますが、これが災いしているようです。
MS IMEを直接入力モードにする(変換モードを「無変換」にする=「般」を「無」)と「あ」などが直接入力できるようになりますが、その場合にも同じ現象が発生しました。

DataGridViewのコードには、編集モードでないときに入力が開始された場合にはEditingControlにそのウィンドウメッセージを転送するという処理があるのですが、IMEが有効なのに確定文字が直接入ってくる場合を想定できていないために、IMEがONの場合に走るコードに加え、IMEがOFFのときのコード(メッセージ)も処理されてしまうため、最初の入力値が2重になるようです。

キーワード
DataGridViewMethods.cs
WndProc WM_IME_STARTCOMPOSITION WM_IME_COMPOSITION
ProcessKeyEventArgs SendMessage WM_KEYDOWN WM_CHAR WM_IME_CHAR

それを踏まえたうえで良い対処を考えようとしたのですが、chrometaroさんのが簡単ですばらしいと思いました。

引用返信 編集キー/
■53209 / inTopicNo.4)  Re[2]: DataGridViewで編集開始時の全角スペースが2個に?
□投稿者/ chrometaro (2回)-(2010/09/07(Tue) 00:22:30)
No53140 (すなふきぬ さん) に返信
>
> んー、同じ現象が出ますね。これは単純にDataGridViewの仕様っぽいですね。
> 全角スペース以外の文字の場合は、漢字変換待ちの状態になっているので動作的には自然ですが、全角スペースの場合だと変換待ちになる前に確定になるためと思います。
>

ご返信ありがとうございます。

自分もご検証いただいたように EditingControlのイベントでキーのコードを見て
おかしな動きをしていることに気付きました。

>
> ・全角スペースを入力した場合
> OnPreviewKeyDown:ProcessKey
> Cell_KeyDown:ProcessKey
> Cell_KeyDown:ProcessKey
> | |
> | |
>
>
> と、こんな感じでした。全角スペースの場合は、Enterで確定する必要はないので半角文字と同じ動作をしているようです。
>
> 対応としては、chrometaroさんのされているようにOnPreviewKeyDownで対応する方法で良いと思います。
>

OnPreviewKeyDown のタイミングで対応する方法で良いと判断されたようで
間違っていないと言うことが分かり、少しほっとしました。
ありがとうございます。m(_ _)m
引用返信 編集キー/
■53211 / inTopicNo.5)  Re[3]: DataGridViewで編集開始時の全角スペースが2個に?
□投稿者/ chrometaro (3回)-(2010/09/07(Tue) 00:56:14)
No53141 (なし さん) に返信
> VS2008とVS2010のどちらでも再現しますね。
> 検索しても出てこないのは、ほとんどの人が気づいていないからじゃないでしょうかね。
> 
気づいていないですか、確かに周りの人に聞いた時もそのように言われは記憶が…
あまり気に止めるようなものではないのでしょうか?

> IMEがONの場合、初めに空白を入力すると空白が確定した状態で直接入力されますが、これが災いしているようです。
> MS IMEを直接入力モードにする(変換モードを「無変換」にする=「般」を「無」)と「あ」などが直接入力できるようになりますが、その場合にも同じ現象が発生しました。
> 
気づいていませんでした。こちらの場合、結構気持ち悪いですね(><)

> DataGridViewのコードには、編集モードでないときに入力が開始された場合にはEditingControlにそのウィンドウメッセージを転送するという処理があるのですが、IMEが有効なのに確定文字が直接入ってくる場合を想定できていないために、IMEがONの場合に走るコードに加え、IMEがOFFのときのコード(メッセージ)も処理されてしまうため、最初の入力値が2重になるようです。
> 
> キーワード
> DataGridViewMethods.cs
> WndProc WM_IME_STARTCOMPOSITION WM_IME_COMPOSITION
> ProcessKeyEventArgs SendMessage WM_KEYDOWN WM_CHAR WM_IME_CHAR
> 
> それを踏まえたうえで良い対処を考えようとしたのですが、chrometaroさんのが簡単ですばらしいと思いました。
> 
このタイミングで編集状態にしたら、IMEの仮想キーをごまかせるのでは?と思い
OnPreviewKeyDown で BeginEdit をしています。
コードを深く追ったわけではないので恐縮です。

この件は DataGridView の仕様、ほとんど気づかないようなものと考え納得しようと思います。
検証までしていただきお手数をおかけしました。
お二方ありがとうございました。m(_ _)m

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -