我的winform中有一个datagridview和一个组合框。 gridview数据根据组合框中选择的内容而变化。可以在网格中将数据插入和删除(通过检查组合框列)到数据库。如果用户想要添加/删除数据并忘记点击保存,我想提示用户是否要保存。如果已进行更改,我的保存功能将保存。
以下是我尝试过的内容:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var result = MessageBox.Show("Do you want to save your changes?", "Save", MessageBoxButtons.YesNo);
if (result == System.Windows.Forms.DialogResult.Yes)
{
Save(false);
}
}
但是,这样做会在表单加载时提示用户。 (因为组合框中有默认值)
private void comboBox1_SelectionChange(object sender, EventArgs e)
{
var result = MessageBox.Show("Do you want to save your changes?", "Save", MessageBoxButtons.YesNo);
if (result == System.Windows.Forms.DialogResult.Yes)
{
Save(false);
}
}
当我更改组合框中的值时,使用此事件会提示我,但不是保存在我想要离开的表单上,而是将网格数据保存在我前往的表单上并保留以前的格式网格数据不变。我想在我离开的网格上保存更改。
我是否需要以某种方式跟踪comboBox更改并保存前一个,如果是,如何?
答案 0 :(得分:0)
您可以使用布尔标志值来指示您的表单已经加载,并防止事件处理程序中的代码在此之前运行:
private bool _loaded = false;
我通常在HandleCreated
事件处理程序中翻转布尔标志。
void MainForm_HandleCreated(object sender, EventArgs e)
{
_loaded = true;
}
加载时将其连线:
private void MainForm_Load(object sender, EventArgs e)
{
HandleCreated += MainForm_HandleCreated;
}
然后您可以将组合框处理程序更改为:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if(_loaded)
{
var result = MessageBox.Show("Do you want to save your changes?", "Save", MessageBoxButtons.YesNo);
if (result == System.Windows.Forms.DialogResult.Yes)
{
Save(false);
}
}
}
我使用HandleCreated
事件处理程序而不是Load
事件处理程序本身来翻转标志的原因是因为你的组合框事件可能会在Load
事件后触发导致你的行为# 39; ve观察到,HandleCreated
事件只会在第一次显示表单时才会触发。