【问题标题】:how to detect a button click from another form如何检测来自另一个表单的按钮点击
【发布时间】:2014-08-02 15:58:17
【问题描述】:

我的目的是制作一个弹出窗口(使用另一种形式)并在触发删除文件事件时显示它。在此弹出表单上,用户应输入正确的密码,然后单击“确定”按钮,此弹出窗口消失并继续删除操作。我所做的是在弹出表单(表单 2)中设置一个字符串变量“Result”。单击确定按钮时,如果输入的密码正确,则设置“结果”,例如“真”。在我的主要形式中,我做了这样的:

if(form2.Result=="true"){ // deletion operation}

但是这种方法不起作用。当我输入正确的密码并在 form2 中单击“确定”时,我的主表单中没有任何反应。任何人都知道我如何在主窗体中检测到 form2 中的按钮单击事件?类似“if(form2.button.click==true)”的东西。 谢谢

【问题讨论】:

  • 这将是一种更像 Windows 的方法,让子窗口通过消息通知父级或在关闭时向父级返回某些内容。您通常不希望依赖检查孩子内存被释放的机会,而您已经有一个消息队列。

标签: c# winforms


【解决方案1】:

您不应该检测到第二个表单上的按钮点击,您应该重组您的流程。

有两种常见的方法可以做到这一点。最容易实现的方法是调用 form2.Show() 来代替你现在可能正在做的事情,你应该调用 form2.ShowDialog() 来停止 form1 中方法的执行,直到 form2 关闭

所以在 form1 中你会有类似的东西

private void DeleteSomething() {
  if (form2.ShowDialog() == DialogResult.Ok) {
      if (form2.result == true)
         doDelete();
  }
}

请注意,检查 DialogResult 是一种常见做法,除非您在 Form2 上指定属性指定哪个按钮将充当“确定”按钮,否则您需要像 Sayse 在他的回复中提到的那样在 form2 中手动设置对话框结果与

this.DialogResult = DialogResult.OK;

在您的情况下,使用对话结果并不是绝对必要的,但实现对不同对话结果(确定、取消等)的支持是一种常见的做法

另一种方法是不将 form2 视为对话框,而是让 form1 将对其自身的引用传递给 form2

然后在 form2 中,您可以调用 form1 上的方法来“授权”删除

所以 form1 会有一个私有方法“confirmDelete”,它只会显示 form2

还有另一个公共方法“doDelete”,在需要时由 form2 调用。

关于您的代码的无关注释:

如果您要使用变量来指示身份验证成功的天气,请不要使用值为“true”的字符串,请使用布尔值。

如果您想返回 3 个或更多状态(例如,结果可能是“确定”“用户已取消”“密码错误”“权限不足”等),请使用枚举。

【讨论】:

  • 非常感谢!它完美地工作。弹出表单的返回状态不是问题,因为我已经做到了。也感谢其他建议!
【解决方案2】:

ShowDialog() 方法返回一个DialogResult,您可以设置它以指示表单如何退出

using(var form2 = MyFormName())
{
     if(form2.ShowDialog() == DialogResult.OK)
        //success -- You can access form2 properties also.
}

在表单上的 button_ok 事件中,将 DialogResult 设置为 OK

 this.DialogResult = DialogResult.OK;

【讨论】:

  • 感谢您的解决方案。 ShowDialog() 方法正是我所需要的(因为我使用的是 Show())。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多