4

コントロールのTextBox列で、ユーザーが通常編集モードを終了するたびに(ユーザーが実際に値を変更したかどうかに関係なく、ユーザーがESCを押して編集モードをキャンセルした場合はそうではありません)、タスクを実行する必要がありますDataGridView

コントロール自体と編集コントロールのいくつかのイベントを試しましDataGridViewたが、どれも私が望むことを正確に実行しません。

DataGridView.CellValidatingおよびDataGridView.CellValidated

これらのイベントは、セルが編集モードでなかった場合でも、ユーザーが別のセルを選択するたびに発生します。イベントIsCurrentCellDirty内の物件を確認してみました。CellValidatingこれはほとんど私が必要としているものですがIsCurrentCellDirty、ユーザーが実際に値を変更したときにのみ設定されます。ただし、ユーザーが通常何も変更せずに編集モードを終了したときにも、タスクを実行する必要があります。これらのイベントは、ユーザーが編集モードをキャンセルしても発生しません。これは良いことです。

DataGridView.CellValueChanged

このイベントも頻繁に発生します(セルの値がプログラムで設定されている場合にも発生します)。

DataGridView.CellEndEdit

このイベントはほとんど私が望んでいるものです。ただし、ユーザーがESCを押して編集モードをキャンセルした場合にも発生します。CellEndEditイベント内で編集モードがキャンセルされたかどうかを確認する方法はありますか?

DataGridView.CellParsing

このイベントはほとんど私が望んでいるものです。ただし、ユーザーが何も変更せずに編集モードを終了しても起動されません。

ValidatingおよびValidated編集コントロールのイベント

イベント内でこれらのイベントに登録しDataGridView.EditingControlShowingました。それらは私が望むことをほぼ実行しますが、ユーザーがESCを押して編集モードをキャンセルしたときにも起動されます。これらのイベント内で編集モードがキャンセルされたかどうかを確認する方法はありますか?

登録できるイベントや、目的の動作を実現するために確認できるフラグに関するその他の提案はありますか?

4

2 に答える 2

4

PreviewKeyDownのイベントEditingControl内のEditingControlShowingイベントに登録することができますDataGridView。そこから、編集コントロール内でエスケープが押されたかどうかを検出し、CellEndEditイベントによって読み取られるフラグを設定することができます。

メソッド名から登録に必要なイベントを推測できます。escapePressedこれは、クラス内に、エスケープが押されていることのフラグであるという名前のブールフィールドがあることを前提としています。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.PreviewKeyDown -= Control_PreviewKeyDown; //avoid attaching multiple handlers in case control is cached
    e.Control.PreviewKeyDown += new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
}

void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        Console.WriteLine("escape pressed");
        escapePressed = true;
    }
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (!escapePressed)
    {
        Console.WriteLine("do your stuff"); //escape was not pressed.
    }
    else escapePressed = false; //reset the flag
}
于 2012-01-09T08:52:02.790 に答える
1

これが私の回避策です:

紹介する

private DataGridViewCell cellBeingEdited = null;

DataGridView.EditingControlShowing

cellBeingEdited = DataGridView.CurrentCell;

DataGridView.CellEndEdit

cellBeingEdited = null;

次にDataGridView.CellValidating、編集がキャンセルされたときに発生しないイベントを使用して、cellBeingEditedフィールドを確認できます。

if (DataGridView.CurrentCell != cellBeingEdited) return;
于 2012-01-09T08:54:25.933 に答える