在运行时更改 winforms 控件
Posted
技术标签:
【中文标题】在运行时更改 winforms 控件【英文标题】:Change winforms control at runtime 【发布时间】:2018-10-18 12:01:20 【问题描述】:我通过以下方式继承了用户控件:
控制基础
|__ControlInherited1
|__ControlInherited2
ControlBase
包含在每个继承的控件中被覆盖的方法和属性,但它根本没有其他控件。继承的控件覆盖基方法并在它们上具有子控件,并且彼此完全不同。
我已将ControlBase
添加到表单中,我想根据运行时条件将其更改为ControlInherited1
或ControlInherited2
。
我想利用继承,所以我不必为每个继承的类添加不同的例程
我尝试了简单的controlBase = new ControlInherited1();
行,但是ControlInherited1
控件的对象没有显示在窗体上。
这样的视觉继承是可能的吗?
【问题讨论】:
您能否澄清一下不同的例程在您的上下文中的含义?如果添加派生类,则始终可以转换为它们的baseclass
并访问常用方法(([SomeControlInheriting] as baseclass).[CommonMethod]((...))
或.[CommonProperty] = (...)
)。如果方法是专门的,则不会进行强制转换。
【参考方案1】:
您遇到的问题是,即使您的新控件继承自基本控件,也无法自动将现有属性应用于您通过调用controlBase = new ControlInherited1();
添加的新属性。本质上,当通过创建ControlInherited1
类的新实例并将其设置为controlBase
的值来覆盖原始变量时,您将丢失有关原始控件的所有信息。
替换现有控件的正确方法是首先删除现有控件,然后将另一个控件添加到表单中,如下所示:
this.Controls.Remove(controlBase);
this.Controls.Add(newControl);
除此之外,您还必须做一些手动工作,以确保您希望从原始控件保留的所有属性都应用于新的(替换的)控件。
【讨论】:
这个问题是控件的名称将是newControl
,这就是我需要进一步引用它的方式。但是,代码中的所有内容都是通过controlBase
调用的,所以我的代码不起作用。
谢谢,原来删除和添加控件后我只需要添加controlBase = newControl;
。现在我可以通过常用代码引用所有内容。以上是关于在运行时更改 winforms 控件的主要内容,如果未能解决你的问题,请参考以下文章