gpt4 book ai didi

c# - 将面板添加到用户控件时出错 : Object reference not set to an instance of an object

转载 作者:行者123 更新时间:2023-11-30 17:46:49 24 4
gpt4 key购买 nike

我有一个问题。我正在尝试访问用户控件中的面板。当我以一种工作的形式访问它时。早些时候,我这样做了。

我从用户控件访问了一个表单中的面板并且它工作了。下面是我使用的代码:

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.Trying to access 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 是独立的。他们可能有方法将数据返回给他们的 parent ,但仅此而已。它们当然不会与其他 UserControl 交互。

如果您确定您确实需要这个依赖项,那么我会将父 Form 对象传递给两个 UserControl 并有一个公共(public)的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# - 将面板添加到用户控件时出错 : Object reference not set to an instance of an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com