首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectDisposedException同时显示表单

ObjectDisposedException同时显示表单
EN

Stack Overflow用户
提问于 2015-01-26 11:58:54
回答 1查看 1.2K关注 0票数 1

当我需要显示一张表单时,我总是得到一个ObjectDisposedExpection。你们知道怎么做吗?在NotitiesForm.Show()的前文中,我得到了错误ObjectDisposedExpection。我正在用VisualStudioUltimal2012 C#编程。

代码语言:javascript
复制
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;
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 03:30:25

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

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

正确的方法是设计一个实际的Form子类,该子类已经包含所需的RichTextBox实例。然后,您不必一直将一个新实例添加到您创建的Form的每个新实例中。

否则,您需要创建一个新的RichTextBox实例,以便与您创建的每个新的Form实例一起使用,例如,在您拥有NotitiesForm = new Form();语句的同一个地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28149698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档