C# 父窗体类用法

C# 父窗体类用法,c#,winforms,C#,Winforms,我只是想知道为什么我不能使用Forms.ParentForm类从子窗体向ParentForm成员赋值。 比如: 谢谢你的推荐 ParentForm返回一个没有“database”属性的表单对象。 只需将返回值强制转换为特定类型 MyFormType parent = (MyFormType)ParentForm; parent.database.Remove(this.userAuth.Key); parent.database.Add(this.userAuth.Key, newValue);

我只是想知道为什么我不能使用Forms.ParentForm类从子窗体向ParentForm成员赋值。 比如:


谢谢你的推荐

ParentForm返回一个没有“database”属性的表单对象。 只需将返回值强制转换为特定类型

MyFormType parent = (MyFormType)ParentForm;
parent.database.Remove(this.userAuth.Key);
parent.database.Add(this.userAuth.Key, newValue);

您可以像这样使用
Forms.ParentForm
,只要您(1)将
数据库
设置为内部(如果表单位于同一项目中)或
公共
,以及(2)将
ParentForm
转换为其实际类型即可

但是你不应该这样做。如果您这样做,您就是将表单紧密耦合到特定的父表单。这将使编写测试变得更加困难,并且如果您需要表单属于不同的父级(例如,在其他地方重复使用它),那么以后更改代码将变得更加困难。更好的方法是通过构造函数将对
数据库的引用
注入表单。

只是
表单的类型
。。。如果不先将特定父窗体强制转换为该类型,则无法从该窗体访问任何内容

假设可以访问
数据库
,并且您的父窗体名为“YourParentForm”:

可选地,您可以考虑通过实例化子窗体,例如通过构造函数将数据库实例传递给子代,而不是.< /P>

private SomeDatabaseType database;

public YourChildForm(SomeDatabaseType database)
{
    this.database = database;
}

正如Grant所说,这是可行的,但是直接从子窗体访问父窗体的变量并不是最方便的方法。如果您需要访问子窗体中的数据库,则应将数据库实例传递给子窗体。在同一个主题中,出现了一个新的问题,因为新的表单根本没有打开。我使用的代码是:
childForm=newchildform(userData);Activate()来自父窗体。但是构建错误消失了,所以谢谢@格兰特·温尼,没关系!我想隐藏旧表单,而新表单是打开的。
((YourParentForm)ParentForm).database.Remove(this.userAuth.Key);
private SomeDatabaseType database;

public YourChildForm(SomeDatabaseType database)
{
    this.database = database;
}