简体   繁体   中英

getting System.ObjectDisposedException: Cannot access a disposed object.Modeless Dialogs in C#

I'd like to generate a modeless dialog box, whenever I close the box and want to open it again I am getting an error saying

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'TransactionHistoryDialog'.
   at System.Windows.Forms.Control.CreateHandle()

here is my code for creating the modeless dialogbox

public partial class TransactionHistoryDialog : Form
{
    private static TransactionHistoryDialog instance;

    private TransactionHistoryDialog()
    {
        InitializeComponent();
    }

    public static TransactionHistoryDialog CreateForm() 
    {
        if (instance == null) 
        {
            instance = new TransactionHistoryDialog();
        }

        return instance;
    }

    private void TransactionHistoryDialog_FormClosing(object sender, FormClosingEventArgs e)
    {
        instance = null;           
    }

    private void buttonClose_Click(object sender, EventArgs e)
    {
        instance = null; 

    }


    private void buttonTransactionHistoryClose_Click(object sender, EventArgs e)
    {
        this.Dispose();
    }


}

then in my main form whenever the transactionHistory button is clicked transaction dialog shows up : here is my code for event of clicking transaction button

 private void buttonTransferHistory_Click(object sender, EventArgs e)
    {
        TransactionHistoryDialog transactionHistory = TransactionHistoryDialog.CreateForm();
        transactionHistory.updateTextBox();
        transactionHistory.Show();     

    }

I have search a lot, but could not find where the problem is. can any one please give me some hints ?

Because closing the Window disposes it. You need to create a new one after it has closed, you cannot show the same Window after it has closed. If you want to show the same one don't close it and in a handler set Visibility to Hidden instead then add another method, eg UnHide(), set it back to Visible when wanting to show the same instance again.

I prefer just creating a new one:

TransactionHistoryDialog openTransactionHistoryDialog;
private void buttonTransferHistory_Click(object sender, EventArgs e)
{
    if(openTransactionHistoryDialog == null)
    {
        openTransactionHistoryDialog = new TransactionHistoryDialog();
        openTransactionHistoryDialog.updateTextBox();
        openTransactionHistoryDialog.Closed += OnTransactionHistoryDialogClosed;
    }
    openTransactionHistoryDialog.Show();
}

private void OnTransactionHistoryDialogClosed(object sender, EventArgs e)
{
    openTransactionHistoryDialog = null;
}

UPDATE: There is an "official" example of a modeless dialog box at the bottom of this page: http://msdn.microsoft.com/en-us/library/aa969773(v=vs.110).aspx .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM