5

OnKeyDownイベントをovverideする独自のdatagridviewコントロールを作成しました。

public partial class PMGrid : DataGridView
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true; //suppress ENTER
            //SendKeys.Send("{Tab}"); //Next column (or row)
            base.OnKeyDown(e);
        }
        else if (e.KeyCode == Keys.Tab)
        {
            base.OnKeyDown(e);
            this.BeginEdit(false);
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}

datagridviewをクリックしてEnterキーを押すと、行が変更されず、KeyUpイベントが発生するため、完全に機能します。しかし、Tabキーを押すと、次のセルが選択され、EditModeに変更されます。そして、このセルでEnterキーを押すと、KeyUpイベントは発生せず、KeyPressも発生しません。ユーザーが1つのセルから次のセルに移動して、このセルに何かを書き込むことができ、ユーザーがEnterキーを押すと、この値がデータベースに保存されるようにしようとしています。しかし、セルがEditModeの場合、そのユーザーがEnterキーを押したことを検出できません。

ありがとう

4

1 に答える 1

6

datagridviewのEditingControlShowingイベントでKeyPressまたはKeyUpイベントを呼び出す必要があります。このようなものが機能するはずです:

private void dtgrd1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    var txtEdit = (TextBox)e.Control;
    txtEdit.KeyPress += EditKeyPress; //where EditKeyPress is your keypress event
}


private void EditKeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true; //suppress ENTER
                //SendKeys.Send("{Tab}"); //Next column (or row)
                base.OnKeyDown(e);
            }
            else if (e.KeyCode == Keys.Tab)
            {
                base.OnKeyDown(e);
                this.BeginEdit(false);
            }
            else
            {
                base.OnKeyDown(e);
            }

}

このコードの実装中に疑問がある場合はお知らせください。

編集

Enterで次の行に移動しないようにするには、この解決された質問を確認してください:DataGridViewTextBoxColumnを編集してEnterKeyを押した後、次の行に移動しないようにするにはどうすればよいですか?

于 2011-12-16T17:55:42.123 に答える