我有两个Windows窗体 - Form1
和Form2
。我需要从Form1
中的按钮点击事件关闭Form2
。如果Form1
中的方法是static
?
Form1中
namespace WinClose
{
public partial class Form1 : Form
{
public static void CloseForm()
{
this.Close();
}
}
}
窗体2
namespace WinClose
{
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
Form1.CloseForm();
}
}
}
我收到以下错误
关键字“this”在静态属性,静态方法或 静态字段初始化程序。
我听说过Single-ton
,Multi-ton
概念。是否需要转换类或是否有任何简单的方法来处理它?</ p>
修改
Form1
和Form2
可能有多个实例。考虑以下情况。
Form1
,然后从Form2
打开Form1
,按住Form2
按钮,Form1
应关闭(INSTANCE 1) Form1
的另一个实例,然后从Form2
打开Form1
,按下Form2
按钮,Form1
应该关闭。 (INSTANCE 2) 即,当用户点击Form2
(INSTANCE 2)中的按钮时,只应关闭一个Form1
(INSTANCE 2)。
任何帮助将不胜感激 提前谢谢。
答案 0 :(得分:2)
如果只想关闭打开Form2的Form1 ,则必须将Form1作为参数传递给Form2的构造函数:
namespace WinClose
{
public partial class Form2 : Form
{
Form1 form1;
public Form2(Form1 form1) {
InitializeComponent();
this.form1 = form1;
}
private void button1_Click(object sender, EventArgs e)
{
this.form1.Close();
}
}
}
如果要关闭Form1的所有实例:
namespace WinClose
{
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
foreach (var form in Application.OpenForms.OfType<Form1>().ToList())
form.Close ();
}
}
}
答案 1 :(得分:1)
您显然无法在静态方法中使用this
引用。它指的是哪个实例?
你可以把它变成单身,但这听起来像是一种设计气味。
我认为该方法不应该是静态的。如果Form2
需要了解Form1
,那么它应该引用Form1
个实例。
或者,如果Form2
不了解Form1
,但Form1
知道Form2
,那么Form2
可以触发发出Form1
信号的事件关闭。
答案 2 :(得分:0)
过度思考,直接关闭它。 静态方法无法关闭表单实例,因为类(静态方法是类的一部分)并不了解实例。
namespace WinClose
{
public partial class Form2 : Form
{
Form1 form1;
private void button1_Click(object sender, EventArgs e)
{
this.form1.Close();
}
}
}
可以通过构造函数或来自调用者的属性设置值form1
。
答案 3 :(得分:0)
你是以错误的方式打电话
检查以下
namespace WinClose
{
public partial class Form1 : Form
{
//no need of CloseForm
}
}
namespace WinClose
{
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
//Form1 o = new Form();//instance needed
Form1 o= Application.OpenForms.OfType<Form1>
if(o != null)
{
o.Close();
}
}
}
}