【问题标题】:How to close form如何关闭表格
【发布时间】:2013-01-01 03:31:43
【问题描述】:

好的,所以一个 Windows 窗体类 WindowSettings 和窗体有一个“取消”按钮。当用户单击按钮时,会弹出对话框 DialogSettingsCancel 并询问用户是否确定要执行该操作。该对话框有 2 个按钮,一个“是”按钮和一个“否”按钮。如果用户单击“是”按钮,我希望 DialogSettingsCancel 和 WindowSettings 都关闭。

DialogSettingsCancel 中的我的 button_Click 事件处理程序:

private void button1_Click(object sender, EventArgs e)
{
    //Code to trigger when the "Yes"-button is pressed.
    WindowSettings settings = new WindowSettings();
    this.Close();
    settings.Close();
}

当我运行我的应用程序并进入设置表单,单击“取消”按钮,然后单击“是”按钮时,只有 DialogSettingsCancel 关闭而不关闭 WindowSettings。

为什么它不起作用?

我也尝试过改变

this.Close();
settings.Close();

settings.Close();
this.Close();

但结果还是一样。

【问题讨论】:

  • 你的“设置”从一开始就没有显示为关闭,你可能正在寻找其他实例
  • 发生这种情况是因为您在关闭另一个Window 之前关闭了处理点击事件的Window。这不是 Form 类,这是 Window 类的巨大差异。此外,设置不等于 WindowSettings 的实例,它等于一些完全不同的实例。使用 VS 调试器。

标签: c# winforms button formclosing


【解决方案1】:
new WindowSettings();

您刚刚关闭了一个全新的表单实例,而该实例最初是不可见的。

您需要关闭表单的原始实例,方法是接受它作为构造函数参数并将其存储在字段中。

【讨论】:

    【解决方案2】:

    您需要打开的WindowSettings 的实际实例,而不是新实例。

    目前,您正在创建WindowSettings 的新实例并在其上调用Close。这没有任何作用,因为该新实例从未显示过。

    相反,当显示DialogSettingsCancel 时,将WindowSettings 的当前实例设置为父级。

    类似这样的:

    WindowSettings:

    private void showDialogSettings_Click(object sender, EventArgs e)
    {
        var dialogSettingsCancel = new DialogSettingsCancel();
        dialogSettingsCancel.OwningWindowSettings = this;
        dialogSettingsCancel.Show();
    }
    

    DialogSettingsCancel:

    public WindowSettings OwningWindowSettings { get; set; }
    
    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
        if(OwningWindowSettings != null)
            OwningWindowSettings.Close();
    }
    

    这种方法考虑到,DialogSettingsCancel 可能会在没有 WindowsSettings 作为父级的情况下打开。

    如果两者始终相连,则应改为使用构造函数参数:

    WindowSettings:

    private void showDialogSettings_Click(object sender, EventArgs e)
    {
        var dialogSettingsCancel = new DialogSettingsCancel(this);
        dialogSettingsCancel.Show();
    }
    

    DialogSettingsCancel:

    WindowSettings _owningWindowSettings;
    
    public DialogSettingsCancel(WindowSettings owningWindowSettings)
    {
        if(owningWindowSettings == null)
            throw new ArgumentNullException("owningWindowSettings");
    
        _owningWindowSettings = owningWindowSettings;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
        _owningWindowSettings.Close();
    }
    

    【讨论】:

      【解决方案3】:

      您在创建设置窗口实例后立即关闭它。您需要先显示设置窗口,然后等待对话结果。如果它返回为已取消,则关闭窗口。例如:

      private void button1_Click(object sender, EventArgs e)
      {
          Settings newSettingsWindow = new Settings();
      
          if (newSettingsWindow.ShowDialog() == DialogResult.Cancel)
          {
              newSettingsWindow.Close();
          }
      }
      

      【讨论】:

        【解决方案4】:

        发送 WindowSettings 作为 DialogSettingsCancel 的构造函数的参数,然后在 button1_Click 上按下 yes 时调用 close 方法他们两个。

        public class DialogSettingsCancel
        {
            WindowSettings parent;
        
            public DialogSettingsCancel(WindowSettings settings)
            {
                this.parent = settings;        
            }
        
            private void button1_Click(object sender, EventArgs e)
            {
                //Code to trigger when the "Yes"-button is pressed.
                this.parent.Close();
                this.Close();
            }
        }
        

        【讨论】:

          【解决方案5】:

          为什么不使用 DialogResult 方法关闭表单?

          if(DialogSettingsCancel.ShowDialog() == DialogResult.Yes)
          {
               //this will close the form but will keep application open if your 
               //application type is "console" in the properties of the project
               this.Close();
          }
          

          但要使此功能起作用,您需要在调用 DialogSettingsCancel 表单时在“WindowSettings”表单中执行此操作。与调用 OpenFileDialog 或任何其他 Dialog 表单的方式非常相似。

          【讨论】:

            【解决方案6】:

            您也可以关闭应用程序:

            Application.Exit();
            

            它将结束进程。

            【讨论】:

              【解决方案7】:

              例如,如果您想在执行某个操作时关闭窗口窗体,有两种方法可以做到这一点

              1.直接关闭

              Form1 f=new Form1();
              f.close(); //u can use below comment also
              //this.close();
              

              2.我们也可以隐藏表单而不关闭它

               private void button1_Click(object sender, EventArgs e)
                  {
                      Form1 f1 = new Form1();
                      Form2 f2 = new Form2();
                      int flag = 0;
                      string u, p;
                      u = textBox1.Text;
                      p = textBox2.Text;
                      if(u=="username" && p=="pasword")
                      {
                          flag = 1;
                      }
                      else
                      {
                        MessageBox.Show("enter correct details");
                      }
                      if(flag==1)
                      {
                          f2.Show();
                          this.Hide();
                      }
              
                  }
              

              【讨论】:

                【解决方案8】:

                有不同的方法来打开或关闭winform。 Form.Close() 是关闭 winform 的一种方法。

                当 'Form.Close()' 执行时,以该表单创建的所有资源都将被销毁。 资源是指控件及其所有子控件(标签、按钮)、表单等。

                其他一些关闭winform的方法

                1. Form.Hide()
                2. Application.Exit()

                打开/启动表单的一些方法

                1. Form.Show()
                2. Form.ShowDialog()
                3. Form.TopMost()

                他们的行为不同,探索他们!

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-05-10
                  • 1970-01-01
                  • 2017-08-29
                  • 2015-06-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多