ObjectDisposedException - 已声明控件,无法访问控件

ObjectDisposedException - Control declared, unabe to access control

我试图使一些代码更简洁,但当我尝试动态定义控件时抛出异常。无论我尝试哪种方式,a 和 b 总是 return 作为处置。我可以将案例分开,但这会使代码长两倍。任何 suggestion/comments 将不胜感激。

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;

这是因为您有 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();
}

经过多次试验和错误,我现在发现方面问题可能出在我的自定义控件中的 Rtf 中,但谁知道为什么会这样。如果使用 richtextbox.Text 而不是 richtextbox.Rtf,Enigmativity 的方法就会起作用。

编辑:修改文本以将解决方案归功于神秘性。我代码中其他地方的拼写错误(将 str[5] 设置为空)或我同时更改的其他一些随机代码加剧了问题。