如何在UserControl中关闭一个表单

7

我创建了一个带有保存关闭取消按钮的用户控件。我想在取消按钮上关闭窗体而不保存,并在关闭按钮上提示保存消息,而保存按钮则只保存而不关闭。通常情况下,我会在取消按钮上使用this.Close(),但是用户控件没有这样的选项。所以我想必须为此设置一个属性。

在向下滚动"可能已经有您答案的问题"部分时,我看到了这个问题:如何从加载在其中的用户控件按钮关闭ChildWindow?我使用了以下C#代码:

private void btnCancel_Click(object sender, EventArgs e)
{
    ProjectInfo infoScreen = (ProjectInfo)this.Parent;
    infoScreen.Close();
}

这段代码可以解决一个屏幕的问题,但我想知道是否需要将此代码应用于所有屏幕?我认为应该有更有效的方法。所以我的问题是:我是否需要为每个表单应用此代码,还是有另一种(更有效的)方法?


控件不应该干扰它们的父级,而是应该引发一个事件。 - Hans Passant
4个回答

24

你可以使用

((Form)this.TopLevelControl).Close();

我的答案对我使用的情况起了作用(实际上控件直接嵌入了表单中)。但是我更喜欢你的。 - FJPoort

7
您可以使用任何控件可用的FindForm方法:
private void btnCancel_Click(object sender, EventArgs e)
{
    Form tmp = this.FindForm();
    tmp.Close();
    tmp.Dispose();
}

不要忘记释放资源,需要调用Dispose方法来完成。
希望本文对您有所帮助。

你帮助了我的生活。非常感谢。 - Ogbonna Vitalis

1

您也可以使用远程线程在代码的任何部分关闭一个表单:

            MyNamespace.MyForm FormThread = (MyNamespace.MyForm)Application.OpenForms["MyForm"];
            FormThread.Close();

0

我找到了简单的答案 :) 我已经想到了类似的东西。

在用户控件内使用以下代码关闭WinForm:

private void button1_Click(object sender, EventArgs e) { Form form = this.FindForm(); form.Close(); }
private void btnCancel_Click(object sender, EventArgs e)
{
    Form someForm = (Form)this.Parent;
    someForm.Close();
}

这取决于用户控件是直接嵌入在窗体中还是在其他子控件中。使用TopLevelControl应该可以解决问题。 - Tobia Zambon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接