用户控制按钮关闭对话框
-
25-10-2019 - |
题
我在应用程序中创建了一个用户控件,该用户控件具有文本框,然后在其中有2个按钮。一个按钮是从文本框中添加数据,第二个按钮取消动作。然后将此用户控件添加到多个对话框(表单)中,但我希望按钮触发相同的事件,这是我将按钮放在用户控件上而不是对话框上的原因。
我要做的是在他们单击“添加数据”按钮并成功之后,我希望它关闭控件所在的对话框。
编辑:
我不知道如何在用户控件触发对话框时进行编码以关闭对话框。我不知道从哪里开始,因为我以前从未使用过用户控件。通常,我只有对话框上的控件,该控件允许 DialogResult = DialogResult.OK;
谢谢
解决方案
设置了拨号符时,将单程打开的表单将自动关闭。从它的声音中,您正在设置控件的拨号,而不是表单。要做您正在尝试做的事情,您需要控件来设置或触发父式对话框结果的设置。您可以通过两者来执行此操作:
1. 通过对控件的表单的引用,从而允许控件设置它。
2. 在表单倾听的控件上创建一个事件,该事件告诉其关闭。 (推荐的方式)
3. (骇人听闻的方式) 使用此代码设置表单对话框结果:
this.ParentForm.DialogResult = DialogResult.OK;
该表单还需要模仿显示,否则您需要手动调用Close()方法。
其他提示
您将需要使用代表解决此问题。
在您控件背后的代码中,定义一个代表,您将使用该代表来告诉主表单以关闭自身。无论您在控制何处,您都想关闭父母表格,您都会提出此自定义事件,该事件将由您的父母表格处理。举例来说,我们假设您要在控件中单击按钮上关闭父表格
public delegate void CloseHostFormEventHandler(Object sender, EventArgs e);
public partial class MyControl : Control {
public event CloseHostFormEventHandler CloseFormEvent;
public closeButton_Clicked(object sender, EventArgs) {
// do your db stuff
// you could create your own class here and pass the object to your main form if you wanted
EventArgs myargs = new EventArgs();
// tell host form to close itself
CloseFormEvent(this, myargs);
}
}
现在,以您的父级表格,您将需要处理由控件提出的事件。
public partial class MyForm : Form {
public MyForm() {
InitializeComponent();
// ill assume your control was added via the designer and thus done in InitializeComponent()
// hook up event handler
mycontrol.CloseFormEvent += CloseFormEventHandler(closeformCallback);
}
protected void closeformCallback(object sender, EventArgs e) {
DialogResult = DialogResult.OK;
this.Close();
}
}
由于您没有提供太多信息,因此我会做一个疯狂的猜测。
对话框没有关闭,因为它不是模态对话框。尝试显示 ShowDialog()
而不是 Show()
.
正如托尼所说。您需要调用关闭方法。
您可以做的是将对呼叫的引用从您的控件中进行,并从那里调用其关闭方法。
您可以将单击事件处理程序放在您的用户控制上:
Form f = this.ParentForm;
if (f != null)
{
f.DialogResult = DialogResult.OK;
}
Dialogresult不会关闭 非模式 形式。
您需要调用表单的关闭方法或在这种情况下对话框。
编辑
或使用showdialog()而不是show()。
再次编辑
根据 Dialogresult文档:
当将表单显示为模态对话框时,单击“闭合”按钮(表单的顶角中的X上的按钮)会导致表单被隐藏,并将Dialogresult属性设置为dialogresult.cancel。当用户单击对话框的关闭按钮或设置Dialogresult属性的值时,关闭方法不会自动调用。取而代之的是,该表单是隐藏的,并且可以再次显示,而无需创建对话框的新实例。由于这种行为,当您的应用程序不再需要表单时,您必须调用表单的处置方法。