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和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 回答