调用静态方法来关闭表单

时间:2015-02-03 11:44:27

标签: c# .net winforms this static-methods

我有两个Windows窗体 - Form1Form2。我需要从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-tonMulti-ton概念。是否需要转换类或是否有任何简单的方法来处理它?<​​/ p>

修改

Form1Form2可能有多个实例。考虑以下情况。

  • 用户打开Form1,然后从Form2打开Form1,按住Form2按钮,Form1应关闭(INSTANCE 1)
  • 用户可以再次打开Form1的另一个实例,然后从Form2打开Form1,按下Form2按钮,Form1应该关闭。 (INSTANCE 2)

即,当用户点击Form2 (INSTANCE 2)中的按钮时,只应关闭一个Form1 (INSTANCE 2)

任何帮助将不胜感激 提前谢谢。

4 个答案:

答案 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();       
            }     
        }
    }
}