从另一个 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 不显示UserControls,它显示Forms。在这些表单之一上,您添加了用户控件,对吗?关于引发事件:是的,但您应该在调用之前检查您的代表 handle 是否有 null

以上是关于从另一个 UserControl 调用 UserControl 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

在设计时从另一个表单引用 UserControl 的组成 TextBox vb.net

如何将我的UserControl从另一个项目(Dll)添加到我的WPF解决方案?

WPF 自定义搜索框

我在 UserControl 中有一个按钮,它应该在主窗口中调用一个方法

WPF - 带OpacityMask / VisualBrush的边框:内存泄漏

如何在 UserControl (.ascx) 中调用 ASP.NET WebMethod