【问题标题】:User Control Buttons to Close a Dialog Box用于关闭对话框的用户控制按钮
【发布时间】:2011-07-16 15:15:18
【问题描述】:

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

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

编辑:

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

谢谢

【问题讨论】:

  • 我的建议是向我们展示一些代码并准确说明“这不起作用”的意思。从这里很难说这意味着什么。
  • 你说得对,是我没说清楚。
  • 您的编辑没有帮助。你还是没有说明问题。
  • 对不起,如果编辑没有帮助,我想我不知道如何清楚地解释我的问题。
  • 你应该做的是告诉我们更多关于什么不起作用。有没有错误。表格根本没有关闭。如果是后者,那我想我有答案了。

标签: c# winforms user-controls dialogresult


【解决方案1】:

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

1. 将表单的引用传递给控件,​​该控件 允许控件设置它。

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

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

this.ParentForm.DialogResult = DialogResult.OK;

表单也需要模态显示,否则您需要手动调用 Close() 方法。

【讨论】:

  • 对 dialogresult 关闭模式对话框进行了一些研究,根据文档,我们在关闭部分是错误的。
  • 设置一个活动可能需要更多的工作,但我也建议这样做。最终,应该由表单负责关闭自身,而不是包含控件。因此,一个事件通知用户控件中的按钮已被按下,然后表单决定如​​何对该事件做出反应(在这种情况下通过关闭自身)。
【解决方案2】:

你会想要使用委托来解决这个问题。

在您的控件背后的代码中,定义一个委托,您将使用它来告诉您的主窗体自行关闭。无论您希望在控件中的哪个位置关闭父表单,您都将引发此自定义事件,该事件将由您的父表单处理。例如,我们假设您希望在控件中单击按钮时关闭父窗体

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();
    }


}

【讨论】:

  • 感谢您提供代码。接受的答案是正确的,但这个答案告诉你如何去做。
【解决方案3】:

由于您没有提供太多信息,我将大胆猜测。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

              Form f = this.ParentForm;
              if (f != null)
              {
                  f.DialogResult = DialogResult.OK;
              }
      

      【讨论】:

        【解决方案6】:

        DialogResult 不会关闭 non-modal 表单。

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

        编辑

        或者使用 ShowDialog() 代替 Show()。

        再次编辑

        根据DialogResult documentation

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

        【讨论】:

        • 如果表单是模态打开的,它会这样做
        • 哈哈。不敢相信我在回答中忘记了这一点。 :P
        • 对此做了一些研究,根据文档,我们在接近的部分是错误的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 2015-01-08
        • 1970-01-01
        • 2021-12-27
        • 2015-02-12
        • 1970-01-01
        相关资源
        最近更新 更多