DOBON.NETプログラミング道掲示板

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■33678 / inTopicNo.1)  エンターキーでのコントロール移動
  
□投稿者/ み 一般人(28回)-(2017/09/21(Thu) 17:06:59)
  • アイコン環境/言語:[Windows10 Vstudio2012 C#] 
    分類:[.NET] 

    以下のURLコードにより
    エンターキーによる(TABによる遷移)を実装しました。
    https://dobon.net/vb/dotnet/control/enterliketab.html

    通常のテキストボックスは正常に動作するのですが
    コンボボックスは2度ProcessDialogKeyが実行されて
    次の次のコントールに移動してしまいます。

    この回避方法があれば教えて下さい

    protected override bool ProcessDialogKey(Keys keyData)
    {
    switch (keyData)
    {
    case Keys.Enter:
    this.SelectNextControl(
    this.ActiveControl, true, true, true, true);
    break;
    }
    return true;
    }
マルチポストを報告
違反を報告
引用返信 削除キー/
■33681 / inTopicNo.2)  Re[1]: エンターキーでのコントロール移動
□投稿者/ 魔界の仮面弁士 大御所(1083回)-(2017/09/22(Fri) 10:27:56)
  • アイコンNo33678に返信(みさんの記事)
    > 以下のURLコードにより
    > エンターキーによる(TABによる遷移)を実装しました。

    サイトで紹介されているサンプルとは、微妙に異なっていますね。

    元のコードとは異なり、Tab キーによる標準遷移が殺されてしまっていますし、
    Shift キーを併用した逆送りも無くなって、使いにくくなっているように
    感じるのですが、あえてそうしているのでしょうか。


    > 通常のテキストボックスは正常に動作するのですが
    > コンボボックスは2度ProcessDialogKeyが実行されて
    > 次の次のコントールに移動してしまいます。

    元のコードと、今回提示頂いたコードの両方を試してみましたが、
    当方では再現しませんでした。
    他にコードを書いていたりはしないですよね?


    【Enter 時に、ProcessDialogKey が 2 度以上呼ばれたケース】
    ・該当現象を確認できず。


    【Enter 時に、ProcessDialogKey が 1 度だけ呼ばれたケース】
    ・DropDownStyle = DropDown (ドロップダウンしていない状態)の場合
    ・DropDownStyle = DropDownList (ドロップダウンしていない状態)の場合


    【Enter 時に、そもそも ProcessDialogKey が呼ばれなかったケース】
    ・DropDownStyle = Simple (テキスト部がアクティブ)の場合
    ・DropDownStyle = Simple (リスト部がアクティブ)の場合
    ・DropDownStyle = DropDown (ドロップダウンしている状態)の場合
    ・DropDownStyle = DropDownList (ドロップダウンしている状態)の場合
違反を報告
引用返信 削除キー/
■33682 / inTopicNo.3)  Re[2]: エンターキーでのコントロール移動
□投稿者/ み 一般人(29回)-(2017/09/28(Thu) 10:21:03)
  • アイコン返信ありがとうございます。
    以下が実装コードです。
    画面としてはテキストボックス、コンボボックスを複数置きます。
    機能としてファンクションキーも対応してますのでswitchになっています。
    コンボボックスにカーソルがある状態でリターンキーを押下すると
    次の次のコントロールに飛びます。

    protected override bool ProcessDialogKey(Keys keyData)
    {
    switch (keyData & Keys.KeyCode)
    {
    case Keys.Enter:
    this.MoveNextControl();
    break;

    }
    return base.ProcessDialogKey(keyData);
    }

    public void MoveNextControl(bool forward = true)
    {
    if (forward)
    {
    SendKeys.Send("{TAB}");
    }
    else
    {
    SendKeys.Send("+{TAB}");
    }
    }


違反を報告
引用返信 削除キー/
■33683 / inTopicNo.4)  Re[3]: エンターキーでのコントロール移動
□投稿者/ 魔界の仮面弁士 大御所(1084回)-(2017/09/28(Thu) 11:32:03)
  • アイコンNo33682に返信(みさんの記事)
    > 以下が実装コードです。

    …!?

    No33678 で提示頂いた ProcessDialogKey の実装と
    No33682 で提示頂いた ProcessDialogKey の実装が
    まったく別のコードになっているのようですが、
    これは一体どういうことなのでしょうか…。orz


    > SendKeys.Send("{TAB}");
    > SendKeys.Send("+{TAB}");

    この処理が余計ですね。
    ProcessDialogKey を抜ける前に、割り込みで SendKeys してはマズイです。


    下記のそれぞれを試してみて、目的の動作に近いものを探ってみてください。


    改修案1)SendKeys による送出を使わず、元の SelectNextControl 実装に戻す。
     void MoveNextControl(bool forward = true)
     {
       SelectNextControl(ActiveControl, forward, true, true, true);
     }


    改修案2)ProcessDialogKey のオーバーライドで Enter を Tab に置換する。
     case Keys.Enter:
      keyData = Keys.Tab | (keyData & Keys.Modifiers);
      break;

    改修案3)ProcessDialogKey のオーバーライドで Enter を握りつぶす。
     case Keys.Enter:
      this.MoveNextControl();
      return true;

    改修案4)ProcessDialogKey を抜けた後で呼ばれるよう、遅延呼び出しする。
     private void timer1_Tick(object sender, EventArgs e)
     {
      timer1.Stop();
      MoveNextControl(timer1.Tag as bool? ?? true);
     }
     protected override bool ProcessDialogKey(Keys keyData)
     {
      switch (keyData & Keys.KeyCode)
      {
       case Keys.Enter:
        timer1.Start();
        break;
      }
      return base.ProcessDialogKey(keyData);
     }



    改修案1は、最初の質問時( No33678 )のコードに近いものになります。
    改修案3(return true;)は、最初に提示頂いた URL でも紹介されています。
違反を報告
引用返信 削除キー/
■33684 / inTopicNo.5)  Re[4]: エンターキーでのコントロール移動
□投稿者/ み 一般人(30回)-(2017/09/29(Fri) 15:06:17)
  • アイコン返信ありがとうございます。
    コードはProcessDialogKeyを参照しました。

    改修案2のtabに置き換える改修案でいきます。
    コンボボックスでSendKeys.Send("{TAB}");でProcessDialogKeyがもう一度
    実行されてしまっていました。テキストボックスはそんなことならないのは
    不明です・・・

    話しは違いますがコンボボックスにデータをセットする時テキストチェンジなどが
    走り変更フラグなど制御等がむずかしいですね・・

解決済み!
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -