我使用DataGridView控件通过XML序列化读取和写入XML文件。
我有一个问题,如下所述:
此后,不更新特定单元格的值。如果我故意将焦点移开(比如我点击同一网格上的另一个单元格),则更新该值。
有人可以为此提出任何解决方案吗?
答案 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事件中。