我有一个问题,我正在尝试访问用户控件中的面板,当我以某种形式访问它时可以正常工作。
我以用户控件的形式访问了面板,并且该面板正常工作。下面是我使用的代码:
Form1 form = Application.OpenForms.OfType<Form1>().FirstOrDefault();
form.Panel1.Controls.Clear();
ManageControl user = new ManageControl();
form.Panel1.Controls.Add(user);
但是,当我尝试在用户控件中使用完全相同的概念时,它将不起作用。
它引发空错误:“对象引用未设置为对象的实例。”
下面是代码:
//this is in ManageControl.cs
public Panel Panel2
{
get { return panelmanage; }
}
//这在另一个userControl中。尝试访问panelImage
ManageControl form = Application.OpenForms.OfType<ManageControl>().FirstOrDefault();
form.Panel2.Controls.Clear();//it throws the error here
ReportControl user = new ReportControl();
form.Panel2.Controls.Add(user);
我做错了什么,因为我使用的是相同的概念。
先谢谢了。
*编辑
这是我的ManageControl.cs
public partial class ManageControl : UserControl
{
public ManageControl()
{
InitializeComponent();
}
public Panel Panel2
{
get { return panelmanage; }
}
这就是我尝试在BookingListControl中访问它的方式
public partial class BookingListControl : UserControl
{
ManageControl form = Application.OpenForms.OfType<ManageControl>().FirstOrDefault();
public BookingListControl()
{
InitializeComponent();
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
ManageControl form = Application.OpenForms.OfType<ManageControl>().FirstOrDefault();
ReportControl user = new ReportControl();
form.Panel2.Controls.Add(user);
}
最佳答案
ManageControl
是UserControl
而不是Form
。因此,当您寻找类型为ManageControl
的开放形式时,您一无所获(在此不会感到惊讶)。然后,我们调用FirstOrDefault
,它返回null(因为空集合中没有匹配的元素),并且下一行炸掉了。
这种方法从一开始就注定要失败,因为即使您有一大堆相互重叠的表格并且可以使它起作用(不好的主意),但是一旦您有两个ManageControl
对象并且需要访问第二个对象,它就会崩溃。
相反,首先问自己:“为什么我的UserControl对象需要互相访问?”。这是一个重要的问题,因为通常UserControl
是独立的。他们可能有方法将数据返还给其父代,仅此而已。它们当然不会与其他UserControl交互。
如果您确定确实需要这种依赖关系,则可以将父Form
对象传递给两个UserControl
,并在Form
上具有一个公共属性,该属性允许他们查看其他UserControl
。您可以从这里正常访问它(不需要任何OpenForms
废话)。坦白说,这是一种巨大的代码味道,听起来应该对整个设计进行研究,以了解在哪里可以删除依赖项。
为此,您需要在表单上显示ManageControl
:
public class ParentForm : Form
{
public ManageControl Manager { get { return manageControlInstance; } }
...
}
然后在您的子控件中访问它。最简单的方法是通过
Parent
属性,但是您也可以将其传递给构造函数或Init
函数。public class ChildControl : UserControl
{
private void SomeFunction()
{
(Parent as ParentForm).Manager.Panel2.Controls.Add(new ReportControl());
}
}
该代码非常丑陋,我不建议这样做(如果将
ChildControl
放入除ParentForm
之外的任何其他内容中也不安全)。话虽这么说,它会起作用。关于c# - 将面板添加到用户控件时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25494639/