我在我的应用程序中创建了一个用户控件,它有一个文本框,然后是2个按钮。一个按钮是从文本框向数据库添加数据,第二个按钮取消操作。然后将此用户控件添加到多个对话框(表单)中,但我希望按钮触发相同的事件,这就是我将按钮放在用户控件而不是对话框上的原因。
我想要做的是在他们点击添加数据按钮后它成功,我希望它关闭控件所在的对话框。
编辑:
我不知道在从用户控件触发对话框时如何对其进行编码以关闭对话框。我不知道从哪里开始因为我之前没有使用过用户控件。通常我只在Dialog上有控件,允许DialogResult = DialogResult.OK;
由于
答案 0 :(得分:6)
模式打开的表单将在设置DialogResult时自动关闭。从它的声音,你设置控件的DialogResult,而不是表单。要执行您要执行的操作,您需要控件来设置或触发父窗体对话框结果的设置。您可以通过以下任一方式执行此操作:
1。将表单的引用传递给控件,其中 允许控件设置它。
2. 在表单侦听的控件上创建一个事件, 告诉它关闭。 (recomemnded way)
3。 (hacky方式)使用以下代码设置表单对话框结果:
this.ParentForm.DialogResult = DialogResult.OK;
表单也需要以模态方式显示,否则您需要手动调用Close()方法。
答案 1 :(得分:4)
您将需要使用委托来解决此问题。
在您的控件后面的代码中,定义一个委托,您将用它来告诉您的主窗体关闭自己。如果您想控制父表单关闭,您将提升此自定义事件,该事件将由您的父表单处理。例如,我们假设您想要在控件
中单击按钮来关闭父窗体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();
}
}
答案 2 :(得分:2)
由于你没有提供太多信息,我会大肆猜测。
对话框未关闭,因为它不是模态对话框。尝试使用ShowDialog()
而不是Show()
显示它。
答案 3 :(得分:1)
托尼说。你需要调用close方法。
你可以做的是将调用的引用传递给你的控件并从那里调用它的close方法。
答案 4 :(得分:1)
您可以在用户控件上放置Click事件处理程序,如下所示:
Form f = this.ParentForm;
if (f != null)
{
f.DialogResult = DialogResult.OK;
}
答案 5 :(得分:0)
DialogResult不会关闭 非模态 表单。
您需要调用表单的Close方法或在此案例对话框中。
修改强>
或使用ShowDialog()而不是Show()。
再次编辑
当表单显示为模式对话框时,单击“关闭”按钮(表单右上角带有X的按钮)会导致隐藏表单并将DialogResult属性设置为DialogResult。取消。当用户单击对话框的“关闭”按钮或设置DialogResult属性的值时,不会自动调用Close方法。相反,表单是隐藏的,可以再次显示,而无需创建对话框的新实例。由于此行为,您必须在应用程序不再需要该表单时调用表单的Dispose方法。