C# 如何在事件处理程序中使用messagebox
上下文:我的表单中有一个树视图。根据树视图的选择,我在窗格中加载UserControl。一个窗格是只读的,但在另一个窗格中,用户可以修改/添加我保存在数据库中的数据。如果用户尝试在TreeView(EventBeforeSelect)中进行新选择,并且他在第二个控件(mod/add)中,并且他有未保存的数据,我想询问他是否希望在加载新控件之前保存。问题是,当messagebox显示时,事件有点失去焦点,在循环中被调用(大约20次)。此外,无论用户点击什么消息框(是保存还是否仅加载新控件)都没有影响 所以我的问题是:是否有必要询问用户在事件处理程序中想要做什么 我希望我已经清楚了,对不起,英语不是我的第一语言 /编辑 这里是BeforeSelect和IsCtrlFormUnsave的代码C# 如何在事件处理程序中使用messagebox,c#,winforms,event-handling,messagebox,C#,Winforms,Event Handling,Messagebox,上下文:我的表单中有一个树视图。根据树视图的选择,我在窗格中加载UserControl。一个窗格是只读的,但在另一个窗格中,用户可以修改/添加我保存在数据库中的数据。如果用户尝试在TreeView(EventBeforeSelect)中进行新选择,并且他在第二个控件(mod/add)中,并且他有未保存的数据,我想询问他是否希望在加载新控件之前保存。问题是,当messagebox显示时,事件有点失去焦点,在循环中被调用(大约20次)。此外,无论用户点击什么消息框(是保存还是否仅加载新控件)都没有影
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (IsCtrlFormUnsave())
{
e.Cancel = true;
//Invoke(new Action(AvertirUser)); //this is in case the save action didn't worked
}
}
private bool IsCtrlFormUnsave()
{
if (_ctrlForm != null && _ctrlForm.unsavedChange)
{
DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?",
"Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.Yes)
if (!_ctrlForm.Save())
return true;
_ctrlForm = null;
}
return false;
}
函数AvertirUser仅包含一个消息框您需要检查选择是用户操作还是用户取消等的还原操作 一种修复方法是添加另一个
bool
值:
bool IsChecked=false;
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (!IsChecked && IsCtrlFormUnsave()) //Check if it's already confirmed with the user
{
e.Cancel = true;
}
}
private bool IsCtrlFormUnsave()
{
IsChecked=true; //set it to true to jump out of the loop
if (_ctrlForm != null && _ctrlForm.unsavedChange)
{
DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?",
"Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.Yes)
if (!_ctrlForm.Save())
return true;
_ctrlForm = null;
}
return false;
}
再次加载第二个控件时,请记住重置IsChecked=false
。向用户控件添加Close()方法,并将messagebox代码放在那里。然后它可以调用自己的Save()方法:
回到表单中,您可以执行以下操作:
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (_ctrlForm != null)
{
_ctrlForm.Close();
_ctrlForm.Dispose();
_ctrlForm = null;
}
}
你能张贴一些例子代码来帮助我们理解你在说什么吗?@ JesseCarter,你应该考虑考虑一个不同的事件来获得你想要的效果。也许在你允许一个新的TreeViewItem成为一个新的浏览器之前,你就已经开始关注它了selected@JesseCarter用户控件没有焦点。我正在尝试休假活动。我想我可以通过这种方式让它正常工作。当你在BeforeSelect事件处理程序中快速转移焦点时,TreeView会变得非常暴躁。它正在尝试选择节点,但您不允许。只有在AfterSelect中显示消息框才安全。
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (_ctrlForm != null)
{
_ctrlForm.Close();
_ctrlForm.Dispose();
_ctrlForm = null;
}
}