如何关闭表格
Posted
技术标签:
【中文标题】如何关闭表格【英文标题】: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 调试器。
【参考方案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的方法
-
Form.Hide()
Application.Exit()
打开/启动表单的一些方法
-
Form.Show()
Form.ShowDialog()
Form.TopMost()
他们的行为不同,探索他们!
【讨论】:
以上是关于如何关闭表格的主要内容,如果未能解决你的问题,请参考以下文章