从另一个 UserControl 调用 UserControl 中的方法
Posted
技术标签:
【中文标题】从另一个 UserControl 调用 UserControl 中的方法【英文标题】:Calling a method in a UserControl from another UserControl 【发布时间】:2021-07-26 10:55:05 【问题描述】:我已经研究这个问题一段时间了,但似乎找不到有效的解决方案。我想从另一个 UserControl 中的方法调用一个方法 UserControl。
在 UserControl1 我有一个方法:
public void update(int lineNum, double price)
// do stuff...
// then call the method in another UserControl
UserControl2 uc2 = new UserControl2();
uc2.refreshList();
在 UserControl2 中,我有一个方法:
public void refreshList()
// do stuff....
当然,除了简单地创建 UserControl 的对象并以这种方式调用该方法之外,我还尝试了其他方法,但似乎没有任何效果。
【问题讨论】:
也许你解释一下你为什么要这样做。可能这是一个 XY 问题 这种用户控件的紧密耦合并不好。相反,在第一个用户控件中引发一个事件,并让托管控件的表单调用另一个用户控件中的 RefreshList 方法。 另外:new UserControl2()
将创建第二个控件的新实例,在这个新实例上调用 refreshList 然后丢弃该实例。可能不是你想要的。
@Klamsi 我想这样做是因为我希望在调用 update() 时更新一次 tablelayoutpanel。问题是 tablelayourpanel 与 UserControl1 不在同一个用户控件中。
还是有点模糊。但也许这有帮助?有人调用update()。理想情况下,这个人的方法可以准确地描述正在发生的事情。例如“插入新价格项目”。这个人负责所有的用户控件做正确的事情。不是 UserControls 本身。让 UI 尽可能地呆板。
【参考方案1】:
在用户控件之间存在这样的依赖关系并不好:它限制了使用并且使得它们很难单独测试。
您有多种选择来实现您想要的。
让调用者进行编排
您没有说明调用update
的代码所在的位置。但是由于方法是public
,我假设这是从外部UserControl1
调用的。也许可以在调用userControl1.update()
之后将userControl2.refreshList()
调用放在那里
使用事件
您可以在UserControl1
中定义一个事件,例如public event EventHandler UpdatePerformed
并在 update
方法的末尾提升它。然后在您的表单中订阅此事件并从那里致电refreshList
:
userControl1.UpdatePerformed += (s, e) => userControl2.refreshList();
【讨论】:
当你说“in your form”时,你是在说包含 main 的文件吗?另外,要在 update() 中引发事件,我会像EventHandler handle = UpdatePerformed
然后 handle(this, EventArgs.EMPTY)
那样吗?
我的意思是:你的 Winforms UI 不显示UserControl
s,它显示Form
s。在这些表单之一上,您添加了用户控件,对吗?关于引发事件:是的,但您应该在调用之前检查您的代表 handle
是否有 null
。以上是关于从另一个 UserControl 调用 UserControl 中的方法的主要内容,如果未能解决你的问题,请参考以下文章
在设计时从另一个表单引用 UserControl 的组成 TextBox vb.net
如何将我的UserControl从另一个项目(Dll)添加到我的WPF解决方案?
我在 UserControl 中有一个按钮,它应该在主窗口中调用一个方法