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] 设置为空)或我同时更改的其他一些随机代码加剧了问题。
我试图使一些代码更简洁,但当我尝试动态定义控件时抛出异常。无论我尝试哪种方式,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] 设置为空)或我同时更改的其他一些随机代码加剧了问题。