Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET(C#)中,如何从子WinForm引用一个WinForm中的变量?_C#_Winforms - Fatal编程技术网

在.NET(C#)中,如何从子WinForm引用一个WinForm中的变量?

在.NET(C#)中,如何从子WinForm引用一个WinForm中的变量?,c#,winforms,C#,Winforms,给定WinForm1中某个类的公共实例化,我尝试打开WinForm2并引发DB parms do查询,查询结果将用于填充WinForm1中的类实例。但是,我不知道如何从WinForm2访问WinForm1中的类实例 WinForm1中的类实例编码为私有成员/公共属性: private theClass _classInstance; public theClass ClassInstance {get; set;} 我将WinForm2作为一种模式表单调用 WinForm2 wf2 = new

给定WinForm1中某个类的公共实例化,我尝试打开WinForm2并引发DB parms do查询,查询结果将用于填充WinForm1中的类实例。但是,我不知道如何从WinForm2访问WinForm1中的类实例

WinForm1中的类实例编码为私有成员/公共属性:

private theClass _classInstance;
public theClass ClassInstance {get; set;}
我将WinForm2作为一种模式表单调用

WinForm2 wf2 = new WinForm2();
wf2.ShowDialog(this);

在wf2中,是否有方法引用ClassInstance(修改其值)?

您可以在构造函数中传递对父窗体的引用,或者作为子窗体的属性传递引用,或者将引用保存在
静态
字段中

class WinForm2 : Form {
     WinForm1 parentForm;
     public WinForm2(WinForm1 parentForm) {
         this.parentForm = parentForm;
         // ....
     }

     // Use `parentForm.ClassInstance` here.
}


WinForm2 wf2 = new WinForm2(this);
wf2.ShowDialog(this);

顺便说一句,当您声明一个像您指定的那样的自动属性时,您不应该手动创建一个备份字段。编译器会为您解决这个问题。

您可以在构造函数中传递对父窗体的引用,或者作为子窗体的属性传递引用,或者将引用保存在
静态
字段中

class WinForm2 : Form {
     WinForm1 parentForm;
     public WinForm2(WinForm1 parentForm) {
         this.parentForm = parentForm;
         // ....
     }

     // Use `parentForm.ClassInstance` here.
}


WinForm2 wf2 = new WinForm2(this);
wf2.ShowDialog(this);

顺便说一句,当您声明一个像您指定的那样的自动属性时,您不应该手动创建一个备份字段。编译器会为您处理这些问题。

您可以在WinForm2上创建一个构造函数,该构造函数在实例化时接受WinForm1

public partial class WinForm2 : Form
{
    public WinForm2()
    {
        InitializeComponent();
    }

    Form parentForm
    internal WinForm2(Form parent)
        : this()
    {
        parentForm = parent
    }
}

您可以在WinForm2上创建一个构造函数,该构造函数在实例化时接受WinForm1

public partial class WinForm2 : Form
{
    public WinForm2()
    {
        InitializeComponent();
    }

    Form parentForm
    internal WinForm2(Form parent)
        : this()
    {
        parentForm = parent
    }
}
在WinForm2中(改进以避免Mehrdad指出的可能的运行时故障):

Owner属性返回在WinForm2中传递给ShowDialog(IWin32Window窗口)

的表单(改进以避免Mehrdad指出的可能的运行时故障):


Owner属性返回传递给ShowDialog(iwin32窗口)的表单

heh。您可以更快地使用它,但是不要忘记构造函数仍然需要调用InitializeComponent。你可以像我在下面做的那样,通过链接构造函数或者在新构造函数的主体中手动执行,但是忽略它会很痛苦。我知道。我只是想把它说清楚,因为这很容易避免。传递表单是一个糟糕的想法,因为它会导致糟糕的设计。将所需内容作为构造函数参数从第一个表单传递到第二个表单,在第二个表单或单独的对象中传递对属性的引用,或者传递UI元素以外的任何内容。@Richard:我同意。我刚才回答了一个问题,关于你如何做到这一点。就设计而言,当然,这是个坏主意。您可以更快地使用它,但是不要忘记构造函数仍然需要调用InitializeComponent。你可以像我在下面做的那样,通过链接构造函数或者在新构造函数的主体中手动执行,但是忽略它会很痛苦。我知道。我只是想把它说清楚,因为这很容易避免。传递表单是一个糟糕的想法,因为它会导致糟糕的设计。将所需内容作为构造函数参数从第一个表单传递到第二个表单,在第二个表单或单独的对象中传递对属性的引用,或者传递UI元素以外的任何内容。@Richard:我同意。我刚才回答了一个问题,关于你如何做到这一点。当然,就设计而言,这是一个坏主意。如果表单需要有WinForm1类型的父表单,我不会这样做。如果不是这样的话,这可能会在运行时失败,但构造函数方法会强制使用已知的父窗体创建子窗体。您完全正确,我刚刚改进了我的答案:我仍然不希望触碰构造函数来允许在没有附加WinForm1的情况下创建对话框。如果表单需要有WinForm1类型的父表单,我不会这样做。如果不是这样的话,这可能会在运行时失败,但构造函数方法会强制使用已知的父窗体创建子窗体。你完全正确,我刚刚改进了我的答案:我仍然希望不接触构造函数以允许在没有附加WinForm1的情况下创建对话框