当DataGridView中的数据发生变化时,如何在表单关闭时要求确认
本文关键字:表单 确认 DataGridView 数据 变化 | 更新日期: 2023-09-27 17:54:13
我有简单的Form1
和datagridview
,我已经启用了编辑和添加。
现在,当我点击关闭表单按钮,如果一些现有的单元格值被更改或新行已经添加,我想要打开对话框(例如,问我是否要保存更改或不),如果没有更改,只是执行简单的表单关闭。
我该怎么做呢?
好的,这是我到目前为止得到的。我正在尝试使用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_Click
和toolStripButton3_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;
}
}
}
如果你正在做一个数据源的数据绑定,那么你可以使用数据源来确定它是否在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;
}
}
}
}