0

DataGridView に「複数行」(ワードラップ) のテキスト ボックス列があります。それらを通常の TextBoxes として編集できるのは素晴らしいことです。つまり、下矢印キーを押したときに、キャレットをテキスト ボックス内で 1 行下に移動させたいのですが、次の行にジャンプさせたくありません。正常に動作します。同様に、Enter キーを押すと、テキスト ボックスのセル内に新しい行が作成されますが、代わりに編集が終了します

そうでなければ、いくつかのキープレス(またはキーダウン)の通常の動作をオーバーライドして、ユーザーがテキストボックスのセルを通常のテキストボックスのように編集し、矢印でその中を移動し、Enterで新しい行を作成できるようにします。

DataGridView でキーダウン イベントを操作しようとしましたが、うまくいきませんでした。

アイデアやコメントをありがとう。

4

1 に答える 1

2

この質問 hereは、それを解決する方法を示してくれました。コードは次のとおりです。

class MyDataGridView : DataGridView
{

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((keyData == Keys.Enter) && (this.EditingControl != null))
        {
            //new behaviour for Enter
            TextBox tb = (TextBox)EditingControl;
            int pos = tb.SelectionStart;
            tb.Text = tb.Text.Remove(pos, tb.SelectionLength);
            tb.Text = tb.Text.Insert(pos, Environment.NewLine);
            tb.SelectionStart = pos + Environment.NewLine.Length;
            tb.ScrollToCaret();
            //and do nothing else
            return true;
        }
        else if ((keyData == Keys.Up) && (this.EditingControl != null))
        {
            //programmatically move caret up
            //(look at related question to see how)
            return true;
        }
        else if ((keyData == Keys.Down) && (this.EditingControl != null))
        {
            //programmatically move caret down
            //(look at related question to see how)
            return true;
        }
        //for the rest of the keys, proceed as normal
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

したがって、これは DataGridView の単純な変更であり、機能します。するしかなかった

  • この新しいクラスを作成し、
  • DataGridView の代わりに MyDataGridView を使用するようにDesignerClass の 2 行を変更します (宣言と初期化)。

他のすべてが期待どおりに機能しました。

関連する質問:プログラムでキャレットを 1 行上下に移動する方法

于 2012-06-20T13:07:11.957 に答える