none
DataGridViewを含むフォームでのカーソルの移動について RRS feed

  • 質問

  • 以下のようなフォーム(1個のTextBoxと1個のDataGridViewと1個のTextBox)があるときに、


    [(TextBox1)]

    [(DataGridViewCell11)][(DataGridViewCell12)][(DataGridViewCell13)] <-この行にはデータが入力されている
    [(DataGridViewCell21)][(DataGridViewCell22)][(DataGridViewCell23)] <-この行はデータ未入力の行(新規行)

    [(TextBox2)]
     

    Tabを順に押下していくと(TextBox1)->(DataGridViewCell11)->(DataGridViewCell12)->(DataGridViewCell13)->(DataGridViewCell21)->(DataGridViewCell22)->(DataGridViewCell23)->(TextBox2)->(TextBox1)->(DataGridViewCell13)・・・
    というようにカーソルが遷移すると思いますが、これを、2周目の(TextBox1)の次は(DataGridViewCell11)に遷移するようにはできないものでしょうか?

    要はキー入力時やControl.Focus()でDataGridViewにフォーカスが遷移したときには画面上の見た目の順番で遷移し、マウスでDataGridView(上のセル)をクリックしたときにはそのセルへフォーカスしたいのですがうまい方法が見つかりません。


     

    2006年9月26日 5:20

すべての返信

  • こういう感じでしょうか?

    private void dataGridView1_Leave(object sender, EventArgs e)
    {

        dataGridView1.CurrentCell = dataGridView1[0, 0];

        dataGridView1.CurrentCell.Selected = false;;

    }

    2006年9月26日 6:09
    モデレータ
  • レス、ありがとうございます。

     コリン星人 さんからの引用

    要はキー入力時やControl.Focus()でDataGridViewにフォーカスが遷移したときには画面上の見た目の順番で遷移し、マウスでDataGridView(上のセル)をクリックしたときにはそのセルへフォーカスしたいのですがうまい方法が見つかりません。

    で気持ちが伝わるかな?と思って省略してしまったのですが・・・
    1.TabとControl.Focus()では先頭のセルへフォーカスし、
    2.Shift+Tabでは最後のセルへフォーカスし、
    3.マウスクリックではクリックしたセルへフォーカスしたいのです。

    教えていただいたコードでは2.のときがうまくいかないように思うので、どうしようかと思案しているところです。

    2006年9月26日 6:50
  • なるほど、そういうことでしたか。KeyPreviewをtrueにして、フォームでKeyDownで拾おうと思うと、TABキーはそのままでは拾えないので、次のように泥臭くやるのが簡単じゃないでしょうか?

    bool backFlag = false;


    private void dataGridView1_Enter(object sender, EventArgs e)

    {

        if (this.backFlag)

        {

           DataGridView dgv = ((DataGridView)sender);

           dataGridView1.CurrentCell = dataGridView1[dgv.ColumnCount - 1, dgv.RowCount - 1];

        }

        else

         {

            dataGridView1.CurrentCell = dataGridView1[0, 0];

         }

    }

     

    private void textBox1_Leave(object sender, EventArgs e)

    {

          this.backFlag = false;

    }

     

    private void textBox2_Leave(object sender, EventArgs e)

    {

          this.backFlag = true;

    }

    2006年9月26日 8:50
    モデレータ
  • 教えていただいたコードでうまくいきました。
    DataGridViewを継承したカスタムコントロールを作成すること(たぶんこういうカーソルの動きは
    多いのではないかと思うのです)で
    うまくいかないかとも思い、思案していましたが、
    無理をせず、各フォームでオンコーディングしたほうが楽なようですね。

    ところで、教えていただいたコードで2点ほど新たな質問があるのですが、
    1.dataGridView1上でマウスクリックするとクリックしたセルへフォーカスされるのはなぜでしょうか?
      (それが期待した動作なのでそれでいいのですが、教えていただいたコードでは先頭のセルか
       最終セルのどちらかしかフォーカスされないような気がしたのですが、なぜかうまくいったので
       逆に不思議でした。)
    2.変数のdataGridView1とdgvを使い分けているのはなぜでしょうか?
      dataGridView1とsenderは同じものだと思っていたのですが何か違いがあるのでしょうか?

    2006年9月27日 0:37
  •  コリン星人 さんからの引用

    1.dataGridView1上でマウスクリックするとクリックしたセルへフォーカスされるのはなぜでしょうか?
      (それが期待した動作なのでそれでいいのですが、教えていただいたコードでは先頭のセルか
       最終セルのどちらかしかフォーカスされないような気がしたのですが、なぜかうまくいったので
       逆に不思議でした。)

    Enterイベントの後、DataGridViewがクリックされた場所をCurrentCellに設定しているからです。DataGridViewへは、WM_LBUTTONDOWNとWM_LBUTTONUPが送られているので、自分がクリックされたことがわかっています。
    CellEnterイベントを見ていると、Enterイベントで一度CurrentCellを最初か最後に設定した後に、クリックされた場所がCurrentCellになることがわかります。

     コリン星人 さんからの引用

    2.変数のdataGridView1とdgvを使い分けているのはなぜでしょうか?
      dataGridView1とsenderは同じものだと思っていたのですが何か違いがあるのでしょうか?

    すみません。全く私のミスです。コードをテストしているうちにちぐはぐになり、そのままアップしてしまいました。ごめんなさい。m(_ _)m
    コードが汎用的になりますので、dgvで統一するのが私の好みです。

    2006年9月27日 2:09
    モデレータ
  • わかりました。
    ありがとうございました。
    2006年9月27日 2:40