0

コンテキスト: フォームの 1 つに TreeView があります。その TreeView の選択に応じて、パネルに UserControl をロードします。一方のパネルは読み取り専用ですが、もう一方のパネルでは、データベースに保存したデータをユーザーが変更/追加できます。ユーザーが TreeView (イベント BeforeSelect) で新しい選択を行い、2 番目のコントロール (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

選択がユーザーアクションなのか、ユーザーキャンセルなどの元に戻すアクションなのかを確認する必要があります。

それを修正する 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 に答える