调用父窗体函数?
Call parent form function?
我有一个包含 2 个表单的 C# window 程序。基本窗体 (Form1) 具有刷新 (RefreshView
) 视图的功能。单击按钮将调出 Form2。单击 Form2 上的 "Apply" 按钮后,如何调用 Form1 中存在的 RefreshView
函数?两种形式都由用户打开。
Form1.cs
中的 Form1 代码:
namespace MonitorCSharp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void RefreshView()
{
//refresh code etc
}
}
}
Form2.cs
中的 Form2:
namespace MonitorCSharp
{
public partial class Form2 : Form
{
public Form2(String args)
{
InitializeComponent();
form2Text = args;
}
private void button3_Click(object sender, EventArgs e)
{
this.Close();
//I want to refresh here
}
}
我尝试了各种代码,包括:
((Form1)this.ParentForm).RefreshView();
调用刷新函数,但到目前为止一切都给我一个运行时错误。我错过了什么吗?
我没有遇到任何编译错误。运行时错误是:
A first chance exception of type 'System.NullReferenceException' occurred in MonitorCSharp.exe
An unhandled exception of type 'System.NullReferenceException' occurred in MonitorCSharp.exe
Additional information: Object reference not set to an instance of an object.
您收到 NullReferenceException。
很有可能您从未初始化过 this.ParentForm
。
当 Form1 创建 Form2 时,请确保正确设置 属性。
实现此目的的一种方法是为 Form2 创建一个构造函数,该构造函数采用其父实例,例如
public Form2(Form1 parent)
{
InitializeComponent();
this.ParentForm = parent;
}
从父表单创建子表单时,
Form2 child = new Form2(this);
很可能您只需要在构造 Form2 时传递对 Form1 的引用。
找到 Form2 的构造函数,最有可能的是:
public Form2()
{
InitializeComponent();
}
并为其添加一个参数,因此现在显示为:
public Form2(Form form1)
{
InitializeComponent();
_form1 = form1;
}
并在您的 Form2 中添加一个私有字段 class:
private Form1 _form1;
然后当您从 Form1.cs 创建 Form2 时,您应该使用
new Form2(this);
其中 "this" 表示 Form1 的当前实例。
要从 Form2 访问 RefreshView,您可以调用
_form1.RefreshView();
父窗体可以将事件处理程序附加到它的子 FormClosed
事件处理程序,以便在关闭时执行代码:
public partial class Form1 : Form
{
public void Foo()
{
Form2 child = new Form2();
child.FormClosed += (s, args) => RefreshView();
child.Show();
}
public void RefreshView()
{
//refresh code etc
}
}
经过反复试验,这对我有用。 (被调用的函数不是静态的。)(VS2010.)
主要形式:
internal partial class Form1 : Form
{
...
using (Form2 f2 = new Form2(this) { Icon = this.Icon }) // Instantiate the child form.
{
f2.someUpDown.Maximum = foo; // (Optionally write data to the child form.)
f2.ShowDialog(); // Show the child form and wait until it closes.
...
bar = f2.someUpDown.Value; // (Optionally read data from the [closed] child form.)
...
} // (Destroy the child form.)
子表:
internal partial class Form2 : Form
{
private Form1 _parent; // (need this variable)
internal Form2(Form1 parent) // (the default constructor)
{
InitializeComponent();
_parent = parent; // Save the argument.
...
someUpDown.Maximum = Form1.foo; // (Optionally read data from the parent form.)
Form1.bar = someUpDown.Value; // (Optionally write data to the parent form.)
...
_parent.myProcedure(arg1); // (Optionally call myProcedure() in the parent form.)
...
}
private void SomeButton_Click(object sender, EventArgs e) // (callback from event loop)
{
...
someUpDown.Maximum = _parent.foo; // (Optionally read data from the parent form.)
_parent.bar = someUpDown.Value; // (Optionally write data to the parent form.)
...
_parent.myProcedure(arg1); // (Optionally call myProcedure() in the parent form.)
...
}
如果我把private Form1 _parent;
改成private Form _parent;
,那是无效的。
如果我把internal Form2(Form1 parent)
改成internal FormTubeSelection(Form parent)
,那是无效的,直到我把_parent = parent;
也改成_parent = (Form1)parent;
几乎在任何地方,您都可以使用 _parent.
前缀访问 Form1 字段和方法; Form1.
前缀无效。例外:在构造函数中访问 Form1 字段作为 Form1.foo
; _parent.foo
在那里无效。
如果只需要在子窗体关闭时调用主窗体中的过程,那么从主窗体调用更容易,紧跟在[=22=之后].如果调用是有条件的,主窗体中的代码可以测试子窗体中的数据 and/or return 的值 f2.ShowDialog()
,直到您处理 f2.
我有一个包含 2 个表单的 C# window 程序。基本窗体 (Form1) 具有刷新 (RefreshView
) 视图的功能。单击按钮将调出 Form2。单击 Form2 上的 "Apply" 按钮后,如何调用 Form1 中存在的 RefreshView
函数?两种形式都由用户打开。
Form1.cs
中的 Form1 代码:
namespace MonitorCSharp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void RefreshView()
{
//refresh code etc
}
}
}
Form2.cs
中的 Form2:
namespace MonitorCSharp
{
public partial class Form2 : Form
{
public Form2(String args)
{
InitializeComponent();
form2Text = args;
}
private void button3_Click(object sender, EventArgs e)
{
this.Close();
//I want to refresh here
}
}
我尝试了各种代码,包括:
((Form1)this.ParentForm).RefreshView();
调用刷新函数,但到目前为止一切都给我一个运行时错误。我错过了什么吗?
我没有遇到任何编译错误。运行时错误是:
A first chance exception of type 'System.NullReferenceException' occurred in MonitorCSharp.exe
An unhandled exception of type 'System.NullReferenceException' occurred in MonitorCSharp.exe
Additional information: Object reference not set to an instance of an object.
您收到 NullReferenceException。
很有可能您从未初始化过 this.ParentForm
。
当 Form1 创建 Form2 时,请确保正确设置 属性。
实现此目的的一种方法是为 Form2 创建一个构造函数,该构造函数采用其父实例,例如
public Form2(Form1 parent)
{
InitializeComponent();
this.ParentForm = parent;
}
从父表单创建子表单时,
Form2 child = new Form2(this);
很可能您只需要在构造 Form2 时传递对 Form1 的引用。
找到 Form2 的构造函数,最有可能的是:
public Form2()
{
InitializeComponent();
}
并为其添加一个参数,因此现在显示为:
public Form2(Form form1)
{
InitializeComponent();
_form1 = form1;
}
并在您的 Form2 中添加一个私有字段 class:
private Form1 _form1;
然后当您从 Form1.cs 创建 Form2 时,您应该使用
new Form2(this);
其中 "this" 表示 Form1 的当前实例。
要从 Form2 访问 RefreshView,您可以调用
_form1.RefreshView();
父窗体可以将事件处理程序附加到它的子 FormClosed
事件处理程序,以便在关闭时执行代码:
public partial class Form1 : Form
{
public void Foo()
{
Form2 child = new Form2();
child.FormClosed += (s, args) => RefreshView();
child.Show();
}
public void RefreshView()
{
//refresh code etc
}
}
经过反复试验,这对我有用。 (被调用的函数不是静态的。)(VS2010.)
主要形式:
internal partial class Form1 : Form
{
...
using (Form2 f2 = new Form2(this) { Icon = this.Icon }) // Instantiate the child form.
{
f2.someUpDown.Maximum = foo; // (Optionally write data to the child form.)
f2.ShowDialog(); // Show the child form and wait until it closes.
...
bar = f2.someUpDown.Value; // (Optionally read data from the [closed] child form.)
...
} // (Destroy the child form.)
子表:
internal partial class Form2 : Form
{
private Form1 _parent; // (need this variable)
internal Form2(Form1 parent) // (the default constructor)
{
InitializeComponent();
_parent = parent; // Save the argument.
...
someUpDown.Maximum = Form1.foo; // (Optionally read data from the parent form.)
Form1.bar = someUpDown.Value; // (Optionally write data to the parent form.)
...
_parent.myProcedure(arg1); // (Optionally call myProcedure() in the parent form.)
...
}
private void SomeButton_Click(object sender, EventArgs e) // (callback from event loop)
{
...
someUpDown.Maximum = _parent.foo; // (Optionally read data from the parent form.)
_parent.bar = someUpDown.Value; // (Optionally write data to the parent form.)
...
_parent.myProcedure(arg1); // (Optionally call myProcedure() in the parent form.)
...
}
如果我把private Form1 _parent;
改成private Form _parent;
,那是无效的。
如果我把internal Form2(Form1 parent)
改成internal FormTubeSelection(Form parent)
,那是无效的,直到我把_parent = parent;
也改成_parent = (Form1)parent;
几乎在任何地方,您都可以使用 _parent.
前缀访问 Form1 字段和方法; Form1.
前缀无效。例外:在构造函数中访问 Form1 字段作为 Form1.foo
; _parent.foo
在那里无效。
如果只需要在子窗体关闭时调用主窗体中的过程,那么从主窗体调用更容易,紧跟在[=22=之后].如果调用是有条件的,主窗体中的代码可以测试子窗体中的数据 and/or return 的值 f2.ShowDialog()
,直到您处理 f2.