3

我在我的应用程序中创建了一个用户控件,它有一个文本框,然后是 2 个按钮。一个按钮是从文本框中向数据库添加数据,第二个按钮是取消操作。然后将此用户控件添加到多个对话框(表单)中,但我希望按钮触发相同的事件,这就是我将按钮放在用户控件而不是对话框上的原因。

我要做的是在他们单击“添加数据”按钮并且成功后,我希望它关闭控件所在的对话框。

编辑:

我不知道如何编写此代码以在从用户控件触发时关闭对话框。我不知道从哪里开始,因为我以前没有使用过用户控件。通常我只有一个对话框上的控件,它允许DialogResult = DialogResult.OK;

谢谢

4

6 回答 6

6

设置 DialogResult 时,模态打开的表单将自动关闭。从它的声音来看,您正在设置控件的 DialogResult,而不是表单。要执行您想要执行的操作,您需要控件来设置或触发父表单对话框结果的设置。您可以通过以下任一方式执行此操作:

1.将表单的引用传递给控件,​​允许控件对其进行设置。

2.在窗体监听的控件上创建一个事件,告诉它关闭。(推荐方式)

3. (hacky方式)使用以下代码设置表单对话框结果:

this.ParentForm.DialogResult = DialogResult.OK;

该表单还需要以模态方式显示,否则您将需要手动调用 Close() 方法。

于 2011-03-16T14:23:21.767 回答
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();
    }


}
于 2011-03-16T15:18:41.470 回答
2

由于您没有提供太多信息,因此我将进行大胆的猜测。

该对话框不会关闭,因为它不是模态对话框。尝试使用ShowDialog()而不是显示它Show()

于 2011-03-16T14:22:36.407 回答
1

正如托尼所说。您需要调用 close 方法。

您可以做的是将调用 from 的引用传递到您的控件中,然后从那里调用它的 close 方法。

于 2011-03-16T14:24:41.527 回答
1

您可以在您的用户控件上放置 Click 事件处理程序,如下所示:

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }
于 2011-03-16T14:25:21.417 回答
0

DialogResult 不会关闭非模态表单。

您需要调用表单的 Close 方法或在本例中为对话框。

编辑

或者使用 ShowDialog() 而不是 Show()。

再次编辑

根据DialogResult 文档

当窗体显示为模式对话框时,单击关闭按钮(窗体右上角带有 X 的按钮)会导致窗体隐藏并且 DialogResult 属性设置为 DialogResult.Cancel。当用户单击对话框的关闭按钮或设置 DialogResult 属性的值时,不会自动调用 Close 方法。相反,该表单被隐藏并且可以在不创建对话框的新实例的情况下再次显示。由于这种行为,当您的应用程序不再需要该表单时,您必须调用该表单的 Dispose 方法。

于 2011-03-16T14:08:26.780 回答