none
グリッドのProcessDialogKey RRS feed

  • 質問

  • 環境:Visual Studio 2010

    グリッドのProcessDialogKeyをオーバーライドし、Enterを押したとき次の編集可能セル(ReadOnly = False)に移動する処理を行っています。

    しかし、セルの編集中状態の時にTabキーを押した場合のみ何のイベントも発生せず、ただ隣のセルに移動してしまいます。

    DataGridViewではonKeyDownも実装していますが編集中状態からのTabキーの場合はこれを補足しません。

    ProcessDialogKeyでTabキーを補足できないのはなぜでしょうか?以下整理します。

     ・セル選択&F2キー → 入力 → Tabキー (隣のセルになってしまい、イベント補足もできない)

     ・セル選択&F2キー → 入力 → Enterキー (ProcessDialogKeyが発生し、独自の編集可能セル移動処理を行う)

    2018年2月21日 1:40

回答

  • 編集中でない時はProcessDataGridViewKeyだった気がします。

    本題ですが、ホストしているEditingControlのPreviewKeyDownイベントでTabの挙動を変えてしまっている可能性が少し気になりました。(正直考えにくいですが)

    見当違いでしたらすみません。(余談ですが、「グリッド」でなく「DataGridView」と明記した方が回答は得られやすいと思います)

    • 回答としてマーク abc_123_ 2018年2月26日 1:14
    2018年2月21日 7:29

すべての返信

  • // うーん、うちだと編集中でない場合はTabでもEnterでもProcessDialogKeyは呼ばれないなぁ。

    とりあえず、問題を回避する方法として以下の2つが思いつきます。

    • ProcessDialogKeyの代わりにProcessCmdKeyをオーバーライドする
    • IsInputKeyをオーバーライドして、Tab/Enterの時にfalseを返すようにする
    2018年2月21日 2:17
  • どちらも試しましたがこちらの環境ではTabキー押下を補足できませんでした。
    2018年2月21日 7:16
  • 編集中でない時はProcessDataGridViewKeyだった気がします。

    本題ですが、ホストしているEditingControlのPreviewKeyDownイベントでTabの挙動を変えてしまっている可能性が少し気になりました。(正直考えにくいですが)

    見当違いでしたらすみません。(余談ですが、「グリッド」でなく「DataGridView」と明記した方が回答は得られやすいと思います)

    • 回答としてマーク abc_123_ 2018年2月26日 1:14
    2018年2月21日 7:29
  • ありがとうございます。解決することができました。

    なぜか以下のような捕捉の仕方でした。

    ProcessDialogKey → Enterキーほか

    ProcessDataGridViewKey → Tabキーほか

    "挙動を変えている"といった部分は正直技術的にわかりませんが大変助かりました。

    本来ここで回答としてマークすべきですが、まだ閲覧されていましたらもう一つ教えて頂けないでしょうか。

    Tabキーを押すとWindowsのエラー音(ピンッと言う感じ?)がなります。これを防止する策は何かないでしょうか。

    ネット検索でもあまり記事が出てこないためもしご存知でしたら教えてください。

    大元の質問は後付質問の解決の如何に関わらず近日中に「回答としてマーク」させて頂きます。

    お手数ですが、よろしくお願いします。


    • 編集済み abc_123_ 2018年2月23日 6:25
    2018年2月22日 11:52
  • 以下を試してみるといいかもしれません。

    単一行テキストボックスでEnterやEscapeキーを押した時にビープ音が鳴らないようにする
    https://dobon.net/vb/dotnet/control/tbsuppressbeep.html

    1行のテキストボックスでEnterするとエラー音が鳴る
    https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/cf26fd78-68aa-4013-8067-3fbedf6cdfb3/1enter?forum=csharpgeneralja

    2018年3月16日 5:34
  • 回答ありがとうございます。結果的には解決できませんでした。

    現在DateGridの入力イベントとして

    「KeyDown」「ProcessDialogKey」「ProcessDataGridViewKey」「OnCurrentCellChanged」

    を定義していますがそれぞれe.Handled = Trueを挿入しましたがBeep音が鳴りました。

    またリンク先の「KeyDown」→「KeyPress」でe.Handled = Trueを挿入するように対応していましたが、こちらも同じくBeep音が鳴りました。

    業務ロジック上、キー入力の様々なタイミングで処理をしているためイベントが多いですが、これらの関連性がよくないのでしょうか。。。

    2018年3月20日 5:19
  • 以下は、Windows 全体に関わる影響範囲となる対策ですが、いかがでしょうか?
    おそらくNGだと思うのと(アプリ内だけの影響にされたいと思われるのではないかと)、以下の理由から、新しく質問を立てられた方がいいのではないかと思いました。

    ・議題内容が変わった(キー遷移の話からビープ音の話に変わった)
    ・現象の内容が簡単ではないレベルと判断した(解決できない私が悪いのですが)
    ・解決済みのスレッド内なので有識者様が見られていない?


    ビープ音を無効にする
    http://prg.seesaa.net/article/84014999.html?reload=2008-10-17T13:08:54

    [Windows] Beep音を止める方法。
    http://heppoco-programer-life.dreamlog.jp/archives/1214591.html
    2018年3月20日 7:39
  • 回答ありがとうございます。

    もう少しプログラミングでできないか試行し、おっしゃる通り新しく質問を立ち上げたいと思います。

    いろいろとありがとうございました。

    2018年3月22日 2:57