在运行时更改 winforms 控件

Posted

技术标签:

【中文标题】在运行时更改 winforms 控件【英文标题】:Change winforms control at runtime 【发布时间】:2018-10-18 12:01:20 【问题描述】:

我通过以下方式继承了用户控件:

控制基础

|__ControlInherited1

|__ControlInherited2

ControlBase 包含在每个继承的控件中被覆盖的方法和属性,但它根本没有其他控件。继承的控件覆盖基方法并在它们上具有子控件,并且彼此完全不同。

我已将ControlBase 添加到表单中,我想根据运行时条件将其更改为ControlInherited1ControlInherited2

我想利用继承,所以我不必为每个继承的类添加不同的例程

我尝试了简单的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 控件的主要内容,如果未能解决你的问题,请参考以下文章

winform窗体控件设计时的位置到运行后怎么发生了变化

C# winform 跨线程更改窗体控件的属性

在C#winform中删除运行时生成的控件

winform窗体运行时的大小和设计时不一致

z 顺序更改时的 Winform 控件事件

WinForm图表控件:将图表保存到文件时更改图表大小