从表单上的任何datagridview单击“保存”按钮,提交当前脏单元格

时间:2009-12-14 18:43:52

标签: c# .net vb.net winforms datagridview

我有一个包含多个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

2 个答案:

答案 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创建UpdateCommandSelectCommandDeleteCommand。如果您要“保存”更改,只需为与DataAdapter.Update(myDataSet, "TABLE NAME");相关联的DataAdapter致电DataGridView。我现在使用这种技术用于一个DGV,它工作正常。