为什么自定义WinForms控件在绘制时不遵守构造函数中设置的属性?

时间:2015-07-11 06:07:31

标签: c# winforms

我有一个继承自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;
        }
    }
}

如上所示,我分别拥有WhiteBlack的默认背景和前景,但WinForms设计器将组件绘制为具有红色背景,当我启动时它会出现这种情况该计划也是如此。然而,当我开始输入数字时,它确实会变回黑/白,否则表现得像预期的那样。

但为什么控件似乎会覆盖我在构造函数中设置的属性?最初绘制控件时,文本没有更改......或者是它?

1 个答案:

答案 0 :(得分:1)

将控件放到窗体上时,窗体设计器会保存其当前属性。

这包括:

  • 前景色
  • 背景色
  • 文本

构造表单时,会将这些属性设置回控件。​​

在控件的构造函数中,您将背景颜色设置为白色,但不要更改文本,因此text属性保持为空字符串。

无法解析此空字符串,因此现在我们有两种可能的情况:

  • BackColor由Text之前的表单设计器代码设置,在这种情况下,TextChanged的事件处理程序获胜。由于文本是一个无法解析的空字符串,因此背景颜色会立即变为红色,虽然它是短暂的白色
  • 相反的情况是,文本设置,解析失败,背景颜色设置为红色,然后表单设计器将保存的背景颜色设置为白色。

控件属性按字母顺序设置(如果我没有弄错的话),所以第一个场景是你看到的场景。

简而言之,您有几种方法可以解决这个问题:

  • 确定空字符串是否合法,但可能有一些默认值(可能为null?)
  • 确保您的控件的构造函数为其指定一个合法的可解析整数值的文本(0可以想到)