【问题标题】:Which Button called this form?哪个 Button 调用了这个表单?
【发布时间】:2026-01-29 07:40:01
【问题描述】:

我有两个问题:

  1. “哪个按钮调用了这个表单?” (短版)

  2. 我无法触摸按钮或按钮的窗体

我为什么要这个?

我有很多表单,需要知道用户是如何到达那里的。如果我能得到表单(而不是按钮),它也可以解决问题。

长版:我需要将源表单/按钮的一些属性复制到新的而不手动执行,我打算稍后在异常报告中使用它来获取更多信息

最初,我尝试做一个“newForm.Caller = this;”每个按钮上都有 200 多个表单和很多按钮。

所有表单和它的按钮都是自定义控件,所以我可以在那里做事。

尝试过的东西

  • 我尝试在表单构造函数中使用 StackFrames 和反射进行操作,但不起作用 (889310)

  • 我为 JAVA 找到了这个 10401190,但它无济于事

  • 我想我可以使用 OnClick 覆盖将最后一个按钮实例存储在按钮/表单类中的静态位置,然后在表单构造函数中获取它,但这似乎是最糟糕的解决方案。 (很多东西打开表单,罪魁祸首是最后按下的按钮)

  • 当其他东西打开表单并且我丢失了引用(DataGridVewButton、计时器、链接标签...)时,问题变得更糟


EDIT1: (oɔɯǝɹ) 另一个细节,可以从外部插件调用表单。因此,我再次无法访问代码来更改它。


EDIT2:示例(Graham Bass,ShreyasKapur) FormA 有一个 ButtonA,单击时会显示 FormB FormA 继承 FormBase Button 继承 ButtonBase FormB 继承 FormBase

我无法更改 FormA 和 ButtonA 代码,只能更改 FormBase 和 ButtonBase 代码


Edit3:(布拉德利·乌夫纳) ShowDialog() 表单具有解决部分问题的 Owner 属性。谢谢布拉德利,我忘了! 不幸的是,所有现有代码都使用无参数构造函数。 "将此表单显示为没有所有者窗口的模式对话框" (1)

【问题讨论】:

  • 这似乎是一个消息传递的案例。你在使用框架吗?
  • @graham-bass 我不是。
  • 据我了解,在按钮 OnClick 中可能发生任何事情以及 Form.Show()?还有 ShowDialog() 吗?表单创建也可以在 OnClick 中而不是在呢?
  • @Spawn,没错,但我认为按钮解决方案可以更简单
  • 如果窗口是一个对话框,那么 Window.Owner 应该有一个对打开它的窗口的引用。如果它不是一个对话框,它可能无济于事。

标签: c# winforms system.reflection


【解决方案1】:

我认为您正在尝试解决错误的问题。

当您的表单如此相互关联时,您将它们紧密地耦合在一起。通过回顾谁打电话给你,将它们更紧密地结合起来,只会让你的问题变得更糟。另见:comefrom 指令。

我建议在您的表单之间传递参数以提供他们需要的数据。但是尽量少用参数,不要尝试使用caller之类的东西,那是作弊。

【讨论】:

  • 我理解你,但有很多代码要更新,我不允许更改它。 (第二个问题)
  • 当在一个洞里时,我会建议停止挖得更深(或者至少不要更快)。但既然我不在洞里,我知道什么:-)