【发布时间】:2026-01-06 16:55:01
【问题描述】:
我有一个继承自 System.Windows.Forms.TextBox 的自定义文本框控件。
基本上我将其设置为在每次文本更改时自动检查输入的值是否为数字。示例代码:
public class MyTextBox : TextBox {
public MyTextBox() : base() {
base.TextChanged += MyTextBox_TextChanged;
base.BackColor = Color.White;
base.ForeColor = Color.Black;
}
private void MyTextBox_TextChanged(object sender, EventArgs e) {
try {
int.Parse(base.Text);
base.BackColor = Color.White;
base.ForeColor = Color.Black;
} catch(FormatException) {
base.BackColor = Color.Red;
base.ForeColor = Color.White;
}
}
}
如上所述,我的默认背景和前景分别为White 和Black,但是 WinForms 设计器将组件绘制为具有红色背景,并且在我启动程序时也会出现这种情况.但是,当我开始输入数字时,它确实会变回黑/白,否则会按预期运行。
但是为什么控件似乎覆盖了我在构造函数中设置的属性呢?最初绘制控件时,文本没有改变......或者是这样吗?
【问题讨论】:
-
您是在将控件放到表单上之后还是之前添加了此代码?
-
可能已经过了,但是当我进行更改时,我总是重新构建解决方案,但似乎仍然无法纠正它
-
当您将控件放到表单上时,表单设计器会将当前颜色保存到表单设计器代码中。您在控件的构造函数中对相同属性所做的更改会立即被拥有该控件的窗体覆盖。您应该再次删除并删除控件,看看是否有帮助。重建对解决这个问题没有帮助。您还可以转到表单的 .Designer.cs 文件并删除有问题的行,但在更改其代码后再次删除和删除控件会更安全。
-
仍然不起作用,我确实看到 Designer.cs 正在覆盖颜色设置,但为什么呢?更改颜色的代码只应该在文本更改时运行。将控件放在表单上时文本是否“更改”?
-
是的,控件的当前文本也被保存并设置回表单设计器代码中的控件。由于文本框的初始文本是空字符串,无法解析,因此您会得到红色。