none
DataGridの最後の列を入力不可(フォーカスは当てはまる)に設定した場合、DataGridから次のコントロールへフォーカスが移動されない RRS feed

  • 質問

  • お世話になります。

    簡単な問題かもしれませんが、初心者なので質問させていただきます。

    C#のWindowsApplicationを作成において、

    DataGridの最後の列を入力不可(フォーカスは当てはまる)に設定した場合、

    フォーカスをDataGridの最終セルに移動してからまたTABキーを押下しても、

    DataGridの次のコントロールに移動されません。

    DataGridの最後の列を入力可に変更して、DataGridの最後のセルからTABキーを押下したら、

    フォーカスが次のコントロールにちゃんと移動されます。

    いろいろ調査してみましたが、力不足で解決できませんでした。

    原因と対策がご存知の方、ぜひご教授お願いいたします。

     

    2006年7月26日 3:05

すべての返信

  • どういう風に入力を不可にしたのか書かないと有効なレスはつかないと思います。

    とりあえず、DataGridView(DataGridじゃなくこっちですよね?)において
    以下のようにした場合は問題なさそうに思いました。

    dataGridView1.ReadOnly = true;
    dataGridView1.AllowUserToAddRows = false;

    2006年7月26日 4:57
  •  kimcheenabe さんからの引用

    DataGridの最後の列を入力不可(フォーカスは当てはまる)に設定した場合、

    フォーカスをDataGridの最終セルに移動してからまたTABキーを押下しても、

    DataGridの次のコントロールに移動されません。


    mars12さんが書かれているように、どのように入力不可にされたのかわからなかったのですが、こちらではDataGridColumnStyleでReadOnlyをtrueに入力不可にしてみましたが、再現しませんでした。

    2006年7月26日 6:26
    モデレータ
  • mars12 さん、trapemiya さん

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

    記述が足りなくて申し訳ございませんでした。

    入力不可設定はtrapemiyaさんのご提示通り、「DataGridColumnStyleでReadOnlyをtrueと設定」の方法でやりました。

    ただ、trapemiyaさんのところでは再現しませんでしたので、もう一回確認させていただきます。

    また、最終列の前列にDataTimePickerを埋め込んだ列を実装して、キー操作(Alt+↑↓によるDataTimepickerのカレンダー表示とか)を実現するために以下のソースを組み込みました(※1)。

    普通のDataGridで現象が起きない場合、以下のソースが原因になる可能性が大きいと思います。

    引き続き調査しますが、すでに原因が推定される方がいらっしゃいましたら、ぜひご教授お願いいたします。

    ------------------

      protected override bool ProcessKeyMessage(ref Message m) {
       // Keep all the keys for the DateTimePicker.
       return ProcessKeyEventArgs(ref m);
       //return true;
      }


      protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {

       const int WM_KEYDOWN = 0x100;
       const int WM_SYSTEMDOWN = 0x104;
        const int WM_SYSKEYDOWN = 0x104;
        const int VK_DOWN = 0x28; 

     
          if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSTEMDOWN) {

             if (keyData == (Keys.Alt | Keys.Down)) {

               SendMessage(this.Handle, WM_SYSKEYDOWN, VK_DOWN, 0);
          
             }
          }

           return base.ProcessCmdKey(ref msg, keyData);

      }
      

      [System.Runtime.InteropServices.DllImport("User32.dll",EntryPoint="SendMessageA")]
      public static extern int SendMessage(IntPtr hWnd, int nMsg, int wParam, int lParam);

    ------------------------------------

    ※1 全体ソースは下記のスレッドで参照できます。

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=521851&SiteID=7

     

     

     

    2006年7月26日 9:29
  • お世話になります。

    調べた結果、trapemiyaさんのご提示通り、、「DataGridColumnStyleでReadOnlyをtrueと設定」のやり方では再現しませんでした。

    原因は、

    最終列の前にDataTimePickerを埋め込んだ列があるから発生したのが判明しました。

    この列がない限り、最終列がReadOnlnになったとしても、Tabキーにより次のコントロールにちゃんと遷移します。

     

    回避策はまだ模索中ですが、結果がある次第報告させていただきます。

    また、解決方法がご存知の方、ぜひご教授お願いします。

    2006年7月27日 0:40