如果从单元格中没有丢失选择,则不会保存DataGridView -Value

时间:2009-06-08 06:09:03

标签: .net datagridview

我使用DataGridView控件通过XML序列化读取和写入XML文件。

我有一个问题,如下所述:

  1. 我读取了一个XML文件,并使用反序列化对象填充DataGridView控件。
  2. 我更新了单元格上DataGridView的所有值。
  3. 我选择“文件另存为”选项,而不会失去对最后一个单元格的关注。
  4. 此后,不更新特定单元格的值。如果我故意将焦点移开(比如我点击同一网格上的另一个单元格),则更新该值。

    有人可以为此提出任何解决方案吗?

6 个答案:

答案 0 :(得分:16)

这是因为编辑的单元格值在被验证之前未提交给DataSource,这在单元格失去焦点时发生。如果要立即提交修改,可以处理CurrentCellDirtyStateChanged事件,并在处理程序中调用CommitEdit方法:

void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

答案 1 :(得分:16)

最好的方法(虽然快速和脏)是将currentCell值分配给Nothing

例如,在save方法中,执行:

dgvMyGrid.CurrentCell = Nothing

然后继续前进。

答案 2 :(得分:4)

如果我理解正确,单元格处于编辑模式,您是否尝试以编程方式停止编辑并将值传递给基础数据源?

我在我的一个应用程序中使用了一种“脏”方法:

if (dataGridView1.CurrentCell.IsInEditMode)    
{    
    int y = dataGridView1.CurrentCellAddress.Y;    
    int x = dataGridView1.CurrentCellAddress.X;    
    if (y > 0)      
        dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];    
    else    
        dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];    
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];    
}

该段代码首先检查当前单元格是否处于编辑模式。然后它以编程方式更改当前单元格(如果我们在第一行中,则更改为上一行或下一行)。之后,它将恢复当前的单元格选择。

您可以在“文件另存为”处理程序中调用此代码。

答案 3 :(得分:0)

您可以使用当前单元格的EditedFormattedValue属性获取尚未提交的单元格的值,如下所示

dataGridView1.CurrentCell.EditedFormattedValue

答案 4 :(得分:0)

我有同样的情况,我甚至使用加速键来保存按钮来保存网格值。当我点击保存按钮焦点从DGV丢失并因此提交了单元格值,但是当我使用加速键时,焦点不会从DGV中丢失,因此不会提交单元格值。

在看到Amit Karmakar出于好奇心的回答之后,我尝试了这个答案并且有效。为了找到更多细节,我进入了DGV的调试,发现它与commitedit完全相同,如果你在保存按钮点击中使用它,它会以某种方式不起作用。

当我们将DGV的CurrentCell设置为null时,在将其设置为null之前,DGV首先获取已编辑的值并将其推入单元格值,然后将CurrentCell REFERENCE设置为null。这并不意味着它将底层DGV单元设置为null。因此,这适用于上述问题。

注意:当您验证单元格的事件并且用户输入无效验证失败的数据时,此解决方案可能无法正常工作。在这种情况下,将当前单元格设置为null也会失败,因为它无法将值推送到单元格。

我提出了这个解释,因为我对Amit Karmakar的问题提出了一个问题,询问它是如何可行的。我认为这可能对其他人有所帮助,所以放弃了这个解释作为答案。

答案 5 :(得分:0)

好的,这是UGLY,但它可以从网格中获取最终更改,而不必移动到另一行:

With DataGridView1
    .DataSource = Nothing
    .DataSource = gridDataTable
    Dim changedFoo As DataTable = gridDataTable.GetChanges
End With

然而,我仍然最喜欢Amit Karmakar的答案。 我已将'DataGridView1.CurrentCell = Nothing'添加到DataGridView1 LostFocus事件中。