none
dataGridViewのCell に何か入力しているとき、KeyDownが走らないのはなぜですか? RRS feed

  • 質問

  • Cellが紺色になっていて、

    キーボードを押しても何も入力されない状態では、

    KeyDownは呼ばれるのですが、

     

    紺色がとれて、カーソルだけになり、

    キーボードを押すと、その内容が入力される状態では、

    KeyDownが呼ばれません。

     

    1列目にあるコードを入力してEnterが押されたら

    2列目にその詳細を表示する、ということをやりたいのです・・・

    2006年10月26日 8:56

すべての返信

  • セルが編集状態になっている時、そこにはDataGridViewTextBoxEditingControlが現れています。なので、こいつにKeyDownイベントハンドラを登録しなければダメです。
    基本的な流れは以下のようになります。 

            DataGridViewTextBoxEditingControl editingControl;

     

            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

            {

                editingControl = (DataGridViewTextBoxEditingControl)e.Control;

                editingControl.KeyDown += new KeyEventHandler(editingControl_KeyDown);

            }

     

            void editingControl_KeyDown(object sender, KeyEventArgs e)

            {

                //なんかの処理

            }

     

            private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)

            {

                editingControl.KeyPress -= new KeyEventHandler(editingControl_KeyDown);

            }

    2006年10月26日 9:33
    モデレータ
  • そのままコピーして動かしてみました。

    dataGridView1_EditingControlShowing

    editingControl_KeyDown

    dataGridView1_CellEndEdit

    の順で呼ばれるんですね。今までKeyDownの中で書いていたことを、
    editingControl_KeyDown の中に処理を書いて行こうと思います。

    けど、dataGridView1_CellEndEdit 内の
    「editingControl.KeyPress -= new KeyEventHandler(editingControl_KeyDown);」は

    System.Windows.Forms.KeyEventHandler を System.Windows.Forms.KeyPressEventHandler 変換できない
    というエラーが出てしまい、使えませんでした。

     

    2006年10月27日 1:21
  • 上のコードを、そのままコピーしました。
    そこでまた、疑問点が出てきたのですが

    void editingControl_KeyDown(object sender, KeyEventArgs e)

    このイベントは
    Cellに何か入力しているとき[1]やAngelなどのキーを押すたび呼ばれるのですが
    [Enter]キーを押したときは呼ばれませんでした。

    [Enter]キーが押されたとき呼ばれる方法、
    またはイベントはありますか?

    2006年10月27日 1:41
  •  さっち さんからの引用

    System.Windows.Forms.KeyEventHandler を System.Windows.Forms.KeyPressEventHandler 変換できない
    というエラーが出てしまい、使えませんでした。

    すみません。editingControl.KeyPressはeditingControl.KeyDownの間違いでした。(実際に動かしてない事がバレてしまう(^^;)

     さっち さんからの引用

    [Enter]キーが押されたとき呼ばれる方法、
    またはイベントはありますか?

    であれば、上で書いたことは全て忘れて下さい。すみません。
    変わりに以下のコードを使います。
    コメントにも書いていますが、DataGridViewの列を独自に作成した列とすげ替えますので、DataGridViewの「列の編集ダイアログ」で、myDataGRidViewTExtBoxColumnを選択して下さい。Enterキーを拾いたい列だけでかまいません。

        /// <summary>

        /// 独自の列

        /// DataGridViewの「列の編集ダイアログ」で、このmyDataGRidViewTExtBoxColumnを選択すること。

        /// </summary>

        public class myDataGridViewTextBoxColumn : DataGridViewTextBoxColumn

        {

            public myDataGridViewTextBoxColumn()

            {

                base.CellTemplate = new myDataGridViewTextBoxCell();

            }

        }

     

        /// <summary>

        /// 独自のセル

        /// </summary>

        public class myDataGridViewTextBoxCell : DataGridViewTextBoxCell

        {

            public override Type EditType

            {

                get

                {

                    return typeof(myDataGridViewTextBoxEditingControl);

                }

            }

     

            protected override void OnKeyDown(KeyEventArgs e, int rowIndex)

            {

                // 編集時じゃない時にEnterキーが押されたことを検出

                if ((e.KeyCode & Keys.Enter) == Keys.Enter)

                {

                    //何かの処理

                }

     

                base.OnKeyDown(e, rowIndex);

            }

     

        }

     

        /// <summary>

        /// 独自の編集時に表示されるテキストボックス

        /// </summary>

        public class myDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl

        {

            protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)

            {

                // 編集時にEnterキーが押されたことを検出

                if ((e.KeyData & Keys.KeyCode) == Keys.Enter)

                {

                    //何かの処理

                }

     

                base.OnPreviewKeyDown(e);

            }

        }

    2006年10月27日 3:23
    モデレータ
  •  trapemiya さんからの引用

            protected override void OnKeyDown(KeyEventArgs e, int rowIndex)

            {

                // 編集時じゃない時にEnterキーが押されたことを検出

                if ((e.KeyCode & Keys.Enter) == Keys.Enter)

                {

                    //何かの処理

                }

     

                base.OnKeyDown(e, rowIndex);

            }

      

     

    この「なんらかの処理」部分で

    指定の位置へ、フォーカスを飛ばすことはできませんか?

     

    2006年10月27日 8:23
  • 今の位置は、dataGridView1.CurrentCellでわかります。これを代えれば良いので、

    dataGridView1.CurrentCell = dataGridView1[x, y];

    のような感じで移動できると思います。

    2006年10月27日 10:27
    モデレータ