0

私は持っています。新しい行を挿入するには、私が処理します。databound DataGridViewDefaultValuesNeeded

割り当てられた値を含む新しい行が表示されます。ここまでは正常に動作します。

この時点では、行はまだ基になる にアタッチされていませんDataTable大丈夫です

新しい行を受け入れる唯一の方法は、任意のセルを編集モードに設定し
、値を変更してエディターを閉じることです。
これで、新しい行が に追加されますDataTable

私の問題は、最小限のユーザー入力で行を追加したいということです。 ユーザーが値が適切であると判断した場合、一部のセル値を変更せずに (およびそれらを元の値に戻すことなく)
確認できるはずです。

これを達成する方法はありますか?たとえば、enterを押してコマンドをトラップし、セルの値が変更された場合と同じように強制
しますか?DataGridView

dgv_KeyDown()私はすでに成功せずに値を変更しようとしました。
助言がありますか?

private void dgv_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        if (dgv.CurrentCell != null && dgv.CurrentCell.OwningRow.DataBoundItem == null)
        {
            //ToDo: Accept the new row

            e.Handled = true;
        }
    }
}
4

2 に答える 2

1

解決策を見つけました。
セルの状態をダーティに設定し、編集モードに入る必要があります。そうしないと、別の行を選択したときに内部状態が破損します

private void dgv_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        if (dgv.CurrentCell != null && dgv.CurrentCell.OwningRow.DataBoundItem == null)
        {
            dgv.NotifyCurrentCellDirty(true);
            dgv.BeginEdit(true);
            e.Handled = true;
        }
    }
}
于 2013-01-28T10:03:51.167 に答える
0

私の提案は、 CellValidating Event t とRowValidating Eventを使用してこのタスクを達成できるということです。

    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty) //or IsCurrentRowDirty
        {
            if (e.ColumnIndex == 1)
            {
                if (MessageBox.Show("You're about to change the value. Do you want to continue?\n\nPress ESC to cancel change.",
                                    "Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information) != System.Windows.Forms.DialogResult.OK)
                {
                    e.Cancel = true;
                }
            }
        }
    }
于 2013-01-23T15:31:57.000 に答える