我有一个链接到数据库的表单,允许用户插入,更新和删除记录。我希望用户在单击返回主菜单时收到任何未保存的更改通知,并且可以选择是否保存它们。
我到目前为止的代码如下,但它无法识别这些更改。它直接回到主菜单。
private void btnBack_Click(object sender, EventArgs e)
{
frmMenu frmMainMenu = new frmMenu();
if (dsOrders.HasChanges())
{
if (DialogResult.Yes == MessageBox.Show("There are changes that have not been saved and will be lost. Would you like to save them before leaving this form?", "Unsaved Changes", MessageBoxButtons.YesNo))
{
dsOrders.AcceptChanges();
}
else
{
frmOrders.ActiveForm.Hide();
frmMainMenu.Show();
}
}
else
{
frmOrders.ActiveForm.Hide();
frmMainMenu.Show();
}
}
答案 0 :(得分:2)
我猜你正在使用DataBinding而dsOrders是一个数据集。
您可以尝试做的是通过在调用菜单之前设置断点来检查数据绑定是否正常工作(双向)。
然后,您可以编辑一些数据,并在触发断点时检查更改是否在数据集中。如果不是,则HasChanges方法将返回false,并且您将无法获得消息框。
另一种检查数据是否已更改为显示此消息的方法是在表单上所有控件的更改事件上附加事件处理程序。在此事件处理程序中,您可以将类似blnChanged的布尔值设置为true并检查其值而不是dsOrders.HasChanges
答案 1 :(得分:2)
一种方法是使用单个控件'Changed事件并设置脏位
例如
public bool Dirty { get; set; }
private void textBox1_TextChanged(object sender, EventArgs e)
{
Dirty = true;
}
然后
if (Dirty)
{
if (DialogResult.Yes == MessageBox.Show("There are changes that have not been saved and will be lost. Would you like to save them before leaving this form?", "Unsaved Changes", MessageBoxButtons.YesNo))
{
dsOrders.AcceptChanges();
}
else
{
frmOrders.ActiveForm.Hide();
frmMainMenu.Show();
}
}