C# 如何在事件处理程序中使用messagebox

C# 如何在事件处理程序中使用messagebox,c#,winforms,event-handling,messagebox,C#,Winforms,Event Handling,Messagebox,上下文:我的表单中有一个树视图。根据树视图的选择,我在窗格中加载UserControl。一个窗格是只读的,但在另一个窗格中,用户可以修改/添加我保存在数据库中的数据。如果用户尝试在TreeView(EventBeforeSelect)中进行新选择,并且他在第二个控件(mod/add)中,并且他有未保存的数据,我想询问他是否希望在加载新控件之前保存。问题是,当messagebox显示时,事件有点失去焦点,在循环中被调用(大约20次)。此外,无论用户点击什么消息框(是保存还是否仅加载新控件)都没有影

上下文:我的表单中有一个树视图。根据树视图的选择,我在窗格中加载UserControl。一个窗格是只读的,但在另一个窗格中,用户可以修改/添加我保存在数据库中的数据。如果用户尝试在TreeView(EventBeforeSelect)中进行新选择,并且他在第二个控件(mod/add)中,并且他有未保存的数据,我想询问他是否希望在加载新控件之前保存。问题是,当messagebox显示时,事件有点失去焦点,在循环中被调用(大约20次)。此外,无论用户点击什么消息框(是保存还是否仅加载新控件)都没有影响

所以我的问题是:是否有必要询问用户在事件处理程序中想要做什么

我希望我已经清楚了,对不起,英语不是我的第一语言

/编辑

这里是BeforeSelect和IsCtrlFormUnsave的代码

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;
        }
    }