1

当我需要显示一个表单时,我不断得到一个 ObjectDisposedExpection。你们可能知道该怎么做吗?在 NotitiesForm.Show() 的 foreach 中,我收到错误 ObjectDisposedExpection。我在 Visual Studio Ultimate 2012 C# 中编程。

RichTextBox NotitiesTB = new RichTextBox();
private Form NotitiesForm;

/// <summary>
/// 
/// </summary>
/// <param name="label"></param>
/// 
public void NotitiesLatenZien()
{
    if (filename != null)
    {                
        BRTSignal signal = new BRTSignal(filename);
        BRTEventRepository Notities = new BRTEventRepository(signal);

        List<IBRTNote> note = Notities.ReadNotes();

        BRTEventService TijdNotities = new BRTEventService(signal);
        TijdNotities.MakeNoteTimesRelativeToTrack(note, 1);

        //TextBox NotitiesTB = new TextBox();
        //NotitiesTB.Name = "Notities";

        if (NotitiesForm == null)
        {
            NotitiesForm = new Form();
        }              

        NotitiesForm.Height = 600;
        NotitiesForm.Width = 1000;
        NotitiesForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
        NotitiesForm.MaximizeBox = false;
        NotitiesForm.Disposed +=NotitiesForm_Disposed;

        NotitiesForm.Text = "Notities";

        NotitiesTB.Multiline = true;
        NotitiesTB.Height = 600;
        NotitiesTB.Width = 980;
        NotitiesTB.ReadOnly = true;

        NotitiesTB.Clear();

        //NotitiesTB.Click += NotitiesTB_Click;

        //NotitiesTB.SelectionStart = Convert.ToInt32(referenceLineSelectedPage);

        NotitiesTB.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Both;

        NotitiesTB.Name = "Notities";

        NotitiesForm.Controls.Add(NotitiesTB);

        foreach (IBRTNote notes in Notities.ReadNotes())
        {
            //string test = Convert.ToString((notes.Time));
            //textBox1.Text = String.Concat(textBox1.Text, string.Concat(Environment.NewLine, notes.Text));
            if (NotitiesTB.Text == "")
            {
                NotitiesTB.Text += new BRTToDotNET.RTDateTime((long)notes.Time).ToDotNet().ToString() + "     " + notes.Text;
            }
            else
            {
                NotitiesTB.Text += "\r\n" + new BRTToDotNET.RTDateTime((long)notes.Time).ToDotNet().ToString() + "     " + notes.Text;
            }
            //MessageBox.Show("\r\n" + notes.Text);
            NotitiesForm.Show();
            NotitiesForm.BringToFront();
        }
    }
    else
    {
        MessageBox.Show("Er blijkt een .sig file te missen. Controleer of u een .sig file heeft ingeladen.");
    }
}

private void NotitiesForm_Disposed(object sender, EventArgs e)
{
    NotitiesForm = null;
} 
4

1 回答 1

1

您发布的代码似乎“足够好”。也就是说,在NotitiesForm释放对象时设置变量,如果它为空,则创建一个新变量。只要所有这些代码在主 UI 线程中执行,那部分就可以了。

但请注意,在处置 aForm时,所有控件Form都会被处置。因此,您的NotitiesTB控件将在您第一次NotitiesForm关闭时被处置。然后将该控件添加到Form您创建的下一个实例中,当它显示时,您会收到异常,因为您试图显示一个Form包含已释放控件的控件。

正确的做法是设计一个已经包含您想要的实例的实际Form子类。然后,您不必继续向您创建的每个新实例添加新实例。 RichTextBox Form

除此之外,您需要创建一个新RichTextBox实例以与您创建的每个新实例一起使用,例如,在您拥有该语句Form的同一位置。NotitiesForm = new Form();

于 2015-01-27T03:30:25.587 回答