【发布时间】:2016-05-23 19:56:29
【问题描述】:
我正在制作 C# Windows 窗体应用程序,该应用程序具有许多使用相同属性和样式的许多文本框和标签的窗体。
我没有更改每个文本框和每个标签的属性,而是创建了一个名为 MyTextBox 的类,它继承自 System.Windows.Forms.TextBox,然后在类构造函数中更改了它的属性,如下所示:
class MyTextBox:TextBox
{
public MyTextBox()
{
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Font = new System.Drawing.Font("Bookman Old Style", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ForeColor = System.Drawing.Color.Blue;
this.Size = new System.Drawing.Size(257, 23);
}
}
构建项目类后出现在工具箱中,并通过在我的表单上创建此类实例,它工作正常。
问题是,当我更改 MyTextBox 类中的任何属性并重建项目时,更改不适用于已经实例化的对象,当我查看设计器代码时,我发现 IDE 复制了 MyTextBox 中的所有属性类到设计器代码,所以我必须在对类代码进行任何更改后重新创建所有实例。
private void InitializeComponent()
{
this.MyTextBox1 = new WindowsFormsApplication9.MyTextBox();
this.SuspendLayout();
//
// MyTextBox1
//
this.MyTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.MyTextBox1.Font = new System.Drawing.Font("Bookman Old Style", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MyTextBox1.ForeColor = System.Drawing.Color.Blue;
this.MyTextBox1.Location = new System.Drawing.Point(67, 43);
有什么办法可以解决这个问题?我希望对应用于所有已实例化对象的类代码进行任何更改,而无需重新创建它们,或者如果有更好的方法请提供帮助。
假设我需要控制MyTextBox 实例的5 个属性,例如ForeColor,默认Width,默认字体Style,默认字体size 和BorderStyle。除了Width 属性之外,所有这些属性都不应具有除默认值以外的其他值。
【问题讨论】:
-
您可以在覆盖的
OnCreateControl中设置属性。该代码应在设计器生成代码之后运行。但请记住,您在设计器中设置的任何内容都将被这些属性覆盖。 -
当您从现有的控件类创建自己的控件类时,您通常需要做的一件事是替换基类属性。并给他们一个新的 [DefaultValue] 属性。使用 override 或 new 关键字。
-
好吧,假设我需要控制 MyTextBox 实例的 5 个属性,例如 ForeColor、默认宽度、默认字体样式、默认字体大小和边框样式。除 Width 属性外,所有这些属性都不应该有其他值比默认值。因此,在您的 ForeColor 示例中,值将是 Color.Color3 但对于 Width 它将是第二个值
-
我将选择
A和B两个属性,其中A是不可更改的。所以A不能在实例中更改,并且始终具有默认值。但是关于B,它有一个默认值,如果您在实例中不触摸它,更改类中的默认值将导致更改所有未触摸值的实例中的值。但是如果在某个实例中您更改了B,则更改默认值不会导致该特定实例中B的更改。好吗? -
当然,这正是我想要的