【发布时间】:2026-01-29 07:40:01
【问题描述】:
我有两个问题:
“哪个按钮调用了这个表单?” (短版)
我无法触摸按钮或按钮的窗体
我为什么要这个?
我有很多表单,需要知道用户是如何到达那里的。如果我能得到表单(而不是按钮),它也可以解决问题。
长版:我需要将源表单/按钮的一些属性复制到新的而不手动执行,我打算稍后在异常报告中使用它来获取更多信息
最初,我尝试做一个“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