我遇到了问题。我正在尝试访问用户控件中的某个面板。当我以某种形式访问它时,它就可以工作了。我做了这个。
我从一个用户控件的表单中访问了一个面板并且它工作了.Below是我使用的代码:
Form1 form = Application.OpenForms.OfType<Form1>().FirstOrDefault();
form.Panel1.Controls.Clear();
ManageControl user = new ManageControl();
form.Panel1.Controls.Add(user);
但是当我尝试在用户控件中使用相同的概念时,它不起作用。
它抛出一个空错误:&#34;对象引用未设置为对象的实例。&#34;
以下是代码:
//this is in ManageControl.cs
public Panel Panel2
{
get { return panelmanage; }
}
//这是另一个userControl.Trying来访问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);
}
答案 0 :(得分:1)
ManageControl
是UserControl
而不是Form
。因此,当您查找类型ManageControl
的开放表单时,您什么也得不到(这里没有意外)。然后,我们调用FirstOrDefault
它返回null(因为空集合中没有匹配的元素),并且你的下一行会爆炸。
这种方法从一开始就注定要失败,因为即使你有一大堆表格相互叠加而且可以让它工作(糟糕的主意),一旦你有它就会破坏两个 ManageControl
个对象,需要访问第二个。
相反,首先问问自己,“为什么我的UserControl对象需要相互访问?”。这是一个重要的问题,因为一般来说UserControl
是独立的。他们可能有方法将数据提供给他们的父母,但就是这样。他们当然不会与其他UserControl交互。
如果您确定确实需要此依赖关系,那么我会将父Form
对象传递给UserControl
并在{{1}上拥有公共属性允许他们看到其他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
以外的任何东西上也不安全。据说它会工作。
答案 1 :(得分:0)
假设NullReferenceException是基于访问&#34; Panel2&#34;财产,你的问题是&#34; panelmanage&#34;一片空白。是找到并填充&#34; form.Panel2&#34;的代码。在窗体或控件构造函数中?如果是这样,尝试重新构建它以在ManageControl完全初始化后运行 - 也许将其放入Loaded事件中。