0

上下文:我的一种形式有一个 TreeView。根据对该 TreeView 的选择,我在面板中加载了一个 UserControl。一个面板是只读的,但在另一个面板中,用户可以修改/添加我保存在数据库中的数据。如果用户尝试在 TreeView 中进行新选择(事件 BeforeSelect)并且他在第二个控件(mod/add)中并且他有未保存的数据,我想问他是否要在加载新控件之前保存。问题是,当显示消息框时,事件有点失去焦点并被循环调用(大约 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函数只包含一个消息框

4

2 回答 2

1

将 Close() 方法添加到您的UserControl,并将消息框代码放在那里。然后它可以调用自己的 Save() 方法:

    public void Close()
    {
        if (this.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)
            {
                this.Save();
            }
        }
    }

回到表单中,您可以执行以下操作:

    private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        if (_ctrlForm != null)
        {
            _ctrlForm.Close();
            _ctrlForm.Dispose();
            _ctrlForm = null;
        }
    }
于 2013-05-15T15:12:57.650 回答
1

您需要检查选择是用户操作还是用户取消的还原操作等。

修复它的一种方法是添加另一个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并记住在再次加载时重置second control

于 2013-05-15T15:10:12.340 回答