我有一个包含多个datagridviews的表单。保存时,整个数据集将被序列化为绑定到sql varbinary(max)的强类型属性。正常工作。
当然,当前的“脏”单元格不会像这里提到的那样保存:
DataGridView -Value does not gets saved if selection is not lost from a cell
我的问题是用户点击SAVE时可能来自20个datagridviews中的任何一个。
有没有办法,除了检查每个datagridview中的脏单元格以在保存之前提交任何脏单元格(在保存之前单击另一个文本框控件然后在保存之前调用该文本框的focus())没有)
我在考虑抓住离开网格的事件,但似乎基本问题是点击一个按钮(我认为我理解的原因)不会触发当前控件的lostfocus事件,它似乎不是点击处理程序args知道最后一个当前选择的控件是什么。
指导赞赏。
TIA
答案 0 :(得分:1)
将所有datagridviews连接到同一个Leave事件处理程序。 Leave事件在click事件之前处理。在离开事件中,捕获刚失去焦点的datagridview。单击保存按钮时,检查剩下的最后一个数据网格视图是否有任何未保存的数据...
示例:
DataGridView _lastDataGridView = null;
private void dataGridView_Leave(object sender, EventArgs e)
{
_lastDataGridView = sender as DataGridView;
}
private void saveButton_Click(object sender, EventArgs e)
{
if (_lastDataGridView != null)
{
// check if data needs saving...
}
}
编辑1: 至于你没有在点击事件之前收到离开事件,我没有看到这种行为。要重现我已经完成的工作,请使用DataGridView和按钮创建一个表单。将两个文本框列添加到DataGridView,按照描述连接事件,并查看执行sendButton_Click时是否设置了_lastDataGridView成员。这是我的结论。
编辑2: 在尝试我的datagridview后,我注意到数据总是被保存。所以我怀疑你有一些不同的设置。我打开了“VirtualMode”。这会导致您描述的行为相同。如果可能,请尝试关闭VirtualMode并查看数据是否按预期保存到DataGridView。否则,请尝试实施this MSDN article.
中列出的建议答案 1 :(得分:0)
为什么不使用DataGridView的CellEndEdit
事件来标记DGV脏的布尔标志?假设您使用的是SQL,则需要为每个DGV创建UpdateCommand
,SelectCommand
和DeleteCommand
。如果您要“保存”更改,只需为与DataAdapter.Update(myDataSet, "TABLE NAME");
相关联的DataAdapter
致电DataGridView
。我现在使用这种技术用于一个DGV,它工作正常。