将面板添加到usercontrol时出错

时间:2014-08-25 21:27:39

标签: c# winforms panel

我遇到了问题。我正在尝试访问用户控件中的某个面板。当我以某种形式访问它时,它就可以工作了。我做了这个。

我从一个用户控件的表单中访问了一个面板并且它工作了.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);
        }

2 个答案:

答案 0 :(得分:1)

ManageControlUserControl而不是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事件中。