我有一个问题,我正在尝试访问用户控件中的面板,当我以某种形式访问它时可以正常工作。

我以用户控件的形式访问了面板,并且该面板正常工作。下面是我使用的代码:

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);
        }

最佳答案

ManageControlUserControl而不是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/

10-15 23:45