ObjectDisposedException - 控制声明,unabe访问控件

时间:2016-01-31 12:38:51

标签: c# switch-statement objectdisposedexception

我试图使一些代码更简洁,并且在我尝试动态定义控件时尝试抛出异常。无论我尝试哪种方式,a和b总是按照处理方式返回。我可以将案例分开,但这会使代码延长两倍。任何建议/意见将不胜感激。

foreach (string[] str in items)
            {
                Control box = new Control();
                CustomControlTypeA a = CustomControlTypeA();
                CustomControlTypeB b = new CustomControlTypeB();
                switch (str[4])
                {
                    case "0":
                        a.richTextBox1.Rtf = str[5];
                        box = a;
                        break;

                    case "1":
                        b.panel1.BackgroundImage = Image.FromFile(str[5]);
                        box = b;
                        break;
                }
                a.Dispose();
                b.Dispose();
                box.Location = new Point(x,y);
                box.Width = w;
                box.Height = h;
                panelBody.Controls.Add(box);
                box.BringToFront();
            } 

我也尝试在case语句中定义CustomControlTypeA,将box重新定义为CustomControlTypeA,甚至尝试像这样进行转换:

case "0":
    (CustomControlTypeA)box.richTextBox1.Rtf = str[5];
    break;

2 个答案:

答案 0 :(得分:0)

这是因为你有a.Dispose();& b.Dispose();。你正在向box分配其中一个,所以它也被处理掉了。

奇怪的是,你正在创建box作为新Control(你不需要这样做),但不会将其处理掉。

如果您要将控件添加到.Controls集合中,则根本不应将其置于此处。

此代码应该可以工作:

foreach (string[] str in items)
{
    Control box = null;
    switch (str[4])
    {
        case "0":
            CustomControlTypeA a = CustomControlTypeA();
            a.richTextBox1.Rtf = str[5];
            box = a;
            break;

        case "1":
            CustomControlTypeB b = new CustomControlTypeB();
            b.panel1.BackgroundImage = Image.FromFile(str[5]);
            box = b;
            break;
    }
    box.Location = new Point(x, y);
    box.Width = w;
    box.Height = h;
    panelBody.Controls.Add(box);
    box.BringToFront();
}

答案 1 :(得分:-1)

经过大量的反复试验,我现在发现一个方面问题可能在于我的自定义控件中的Rtf,尽管谁知道为什么会这样。如果使用richtextbox.Text而不是richtextbox.Rtf,则Enigmativity的方法有效。

编辑:修改文本以将解决方案归功于Enigmativity。我的代码中的拼写错误(将str [5]设置为空)或者我在此期间更改的其他随机代码正在加剧这个问题。