当DataGridView中的数据发生变化时,如何在表单关闭时要求确认

本文关键字:表单 确认 DataGridView 数据 变化 | 更新日期: 2023-09-27 17:54:13

我有简单的Form1datagridview,我已经启用了编辑和添加。

现在,当我点击关闭表单按钮,如果一些现有的单元格值被更改或新行已经添加,我想要打开对话框(例如,问我是否要保存更改或不),如果没有更改,只是执行简单的表单关闭。

我该怎么做呢?

好的,这是我到目前为止得到的。我正在尝试使用CSLA框架,我已经创建了根可编辑集合public class PDVCollection : BusinessBindingListBase<PDVCollection, PDV>和可编辑的子public class PDV : BusinessBase<PDV>Form1的代码是

  public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public PDVCollection s;
    private void Form1_Load(object sender, EventArgs e)
    {
        bindingSource1.DataSource = PDVCollection.GetAll();
    }
    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        s = (PDVCollection)bindingSource1.DataSource;
        s = s.Save();
        bindingSource1.DataSource = s;

    }

    private void toolStripButton3_Click(object sender, EventArgs e)
    {

        if (dataGridView1.CurrentCell.RowIndex > -1)
        {
            PDV sel = (PDV)dataGridView1.CurrentRow.DataBoundItem;
            s = (PDVCollection)bindingSource1.DataSource;
            s.Remove(sel);
            s = s.Save();
        }
    }

我想从toolStripButton1_ClicktoolStripButton3_Click中削减s = s.Save();,如果有什么改变/添加/删除,我执行关闭事件

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (//some code to implement)
        {
            DialogResult dialogResult = MessageBox.Show("Do you want to save changes", "Message", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                s = (PDVCollection)bindingSource1.DataSource;
                s = s.Save();
            }
            else if (dialogResult == DialogResult.No)
            {
                this.DialogResult = DialogResult.OK;
            }
        }
    }

当DataGridView中的数据发生变化时,如何在表单关闭时要求确认

如果你正在做一个数据源的数据绑定,那么你可以使用数据源来确定它是否在FormClosing或FormClosed事件中被更改。实际的实现将取决于您正在使用的数据源的类型。

如果您没有指定数据源,那么默认情况下可以在DataGrid的Rows集合中访问数据。这个集合类没有默认的"changed"标志,但是它有一个可以连接的CollectionChanged事件。

在表单的构造器中,你可以输入

DataGrid1。

然后在你的Rows_CollectionChanged你可以设置一个标志,数据已经改变,需要保存。显然,提供更多的细节需要更多地了解数据网格和数据源的细节。

根据下面的评论,你可能需要更多的标志,这取决于你如何定义"改变"。如果你需要知道一个字段被改变了,然后又变回原来的值,那么就像下面的评论者说的那样,一个简单的标志是做不到的,你可能需要存储原始数据的影子副本。

也就是说,如果你需要处理非常复杂的撤销场景,你将需要为此设计数据源,这是一个完全不同的主题。

编辑:如果你使用CSLA对象作为数据源,那么在对象上应该有一个IsDirty标志。因此,只需在FormClosed事件上迭代数据源中的项,并检查每个对象的IsDirty标志。

您需要创建标志变量,并初始设置为false

 bool isAnythingChange = false;

并在新行添加或值更改事件中将此变量设置为true。对于示例,我如下所示

 void txt_Change(object sender, EventArgs e)
 {
      isAnythingChange = true;
 }

和当你处理表单关闭事件点检查isAnythingChange。如果值为true,则要求确认,否则不进行确认就关闭表单。

编辑:正如你在问题中所维护的那样,更新后的代码可能是这样的。

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (isAnythingChange)
        {
            DialogResult dialogResult = MessageBox.Show("Do you want to save changes", "Message", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                s = (PDVCollection)bindingSource1.DataSource;
                s = s.Save();
            }
            else if (dialogResult == DialogResult.No)
            {
                this.DialogResult = DialogResult.OK;
            }
        }
    }

好的,这是最终的工作解决方案,如果有人正在寻找它。

public Form1()
    {
        InitializeComponent();
    }

    public PDVCollection s;
    private void Form1_Load(object sender, EventArgs e)
    {
        bindingSource1.DataSource = PDVCollection.GetAll();
        s = (StopaPDVCollection)bindingSource1.DataSource;
    }

    private void toolStripButton1_Click(object sender, EventArgs e)
        s = s.Save();
        bindingSource1.DataSource = s;

    }

    private void toolStripButton3_Click(object sender, EventArgs e)
    {

        if (dataGridView1.CurrentCell.RowIndex > -1)
        {
            PDV sel = (PDV)dataGridView1.CurrentRow.DataBoundItem;
            s.Remove(sel);
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (s.IsDirty)
        {
            DialogResult dialogResult = MessageBox.Show("Do you want to save changes", "Message", "Poruka", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                s = (PDVCollection)bindingSource1.DataSource;
                s = s.Save();
                bindingSource1.DataSource = s;
            }
            else if (dialogResult == DialogResult.No)
            {
                this.DialogResult = DialogResult.OK;
            }
        }
    }
}