我的代码可以动态加载(和破坏)用户控件的不同类型的用户控件,并根据需要将其加载到表单上。用户控件使用其父属性的属性将某些值加载到文本框和复选框等控件中。问题在于:
activeControl = new userControl1(params...);
我的构造函数显然将尝试使用尚不存在的加载字段(它们属于父表格),因为直到创建UserControl1之后才添加到父级。
我尝试使用用户控件的partenChanged事件解决此问题,以便等待直到将其父的设置为直到加载字段。这里的问题是当我销毁usercontrol1并创建一个usercontrol2时,父会更改并试图从null Parentform加载字段(我最初遇到的确切问题。
有没有首选解决这个问题的方法?显然,我可以添加
之类的东西if(this.ParentForm == null) { return; }
到附表事件或类似的事物。但这既不优雅也不安全。我是忽略了一些事件还是首选的方法?
虽然检查null
参考并相应地转移代码并不一定不好(例如,不尝试引用缺失的对象),但这里更好的方法是将您的UserControl
类解分配。父母。
也就是说,这些UserControl
类根本不应该对其父型类型有任何认识。否则是否定OOP的主要好处之一:代码重复使用。有了您当前的设计,即使您可以在不崩溃的情况下使用它,也无法使用这些UserControl
对象,除非在此特定父级类型的上下文中。
您今天可能会认为这没关系,您永远都不想在任何其他情况下使用它们。但是未来很难预测。例如,您可以决定要在父表上进行变体,该形式仍应使用这些相同的UserControl
对象。
您应该做的是通过公共属性公开UserControl
状态,然后允许父母在必要时初始化这些状态。
这是一个非常简单的示例(我正在省略设计师创建的代码&Hellip;我认为您可以从字段中推断出我的意思是什么):
partial class UserControl1 : UserControl
{
/* ... */
public bool IsMyFlagChecked
{
get { return checkBox1.Checked; }
set { checkBox1.Checked = value; }
}
/* ... */
}
partial class ParentForm : Form
{
/* ... */
private void SomeMethodThatAddsUserControl1()
{
UserControl1 uc1 = new UserControl1;
uc1.IsMyFlagChecked =
this.SomeParentFormPropertyUserControl1UsedToReferenceDirectly;
// other initialization for uc1...
Controls.Add(uc1);
}
/* ... */
}
(请注意,如果没有一个好的, minimal ,完整代码示例说明您的问题,我无法提供比上面更详细的代码示例。似乎无法解决您的问题,请编辑它,以提供更多的详细信息,包括更好的代码示例)。