【发布时间】:2021-01-16 15:16:08
【问题描述】:
我的这个项目有 3 个用户控件和 1 个表单,当按下按钮时,用户控件会出现在表单上。现在我需要通过单击位于“UserControl1”中的按钮来更改“UserControl3”上的标签颜色,我尝试了以下代码,但它没有工作
var name = new UserControl3();
name.label.ForeColor = Color.Green;
我也尝试了另一种方法,但它引发了异常,如下图 https://imgur.com/kBHUBoX
然后我通过删除和添加用户控件找到了另一种几乎可以按预期工作的方法。问题是它会进入应该为空的主窗体
var name = new UserControl3();
this.Controls.Remove(name);
this.Controls.Add(name);
name.label1.ForeColor = Color.Green;
上面的代码几乎可以按我的意愿工作,但我认为它不是一个好的解决方案,我很确定还有其他更简单的方法可以完成这项工作......感谢任何形式的帮助。谢谢
【问题讨论】:
-
当然你不能这样做:
var name = new UserControl3();。您创建一个新的 UC 实例,它与UserControl3的任何现有实例都不相关。 -- 这些UserControl之间的关系是什么?一个人怎么知道另一个人的存在?它没有(也不应该)。您需要另一个负责在这些 parts 之间创建关系的对象。称它为控制器。您还可以让您的 UC 引发事件并公开允许与其内部组件交互的公共方法和/或属性。 -
例如,当点击 UC1 中的按钮时,UC1 会引发事件(公共)。您可以让您的表单订阅此事件(或使用 Controller 类)。引发事件时,Form(或 Controller)调用 UC3 的公共方法,该方法允许设置其内部组件之一的颜色。在这种情况下,即使 改变颜色 的控件被替换,外部代码保持不变——永远不要(永远)公开 UC 的子控件,将其访问修饰符更改为
public。 -
我明白出了什么问题,阅读您的回答一切都更清楚了,但现在我不知道如何创建这个“控制器”来关联用户控件。我知道我必须创建一个名为控制器的类
-
在找之前(MVC Pattern,MVP Pattern,MVVM Pattern),用你的Form类订阅一个UC1的公共事件,用这个事件调用UC3的一个公共方法.你必须两者都做,所以学习如何引发自定义事件以及如何公开公共方法。 -- 之后,看看那些模式。你会发现它很有用(是的,都有自己的学习曲线)。
-
另请注意,您必须了解基本的 OOP 原则,否则您将很难制作一个功能齐全的应用程序。
标签: c# .net winforms user-controls