gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:02 26 4
gpt4 key购买 nike

我有一个继承自 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 设计器将组件绘制为具有红色背景,并且出现当我启动程序时也是这样。但是,当我开始输入数字时,它确实会变回黑色/白色,否则会按预期运行。

但为什么控件似乎覆盖了我在构造函数中设置的属性?最初绘制控件时,文本没有更改……是这样吗?

最佳答案

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

这包括:

  • 前景色
  • 背景色
  • 正文

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

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

这个空字符串无法解析,所以现在我们有两种可能的情况:

  • BackColor 由表单设计器代码在 Text 之前设置,在这种情况下,TextChanged 的​​事件处理程序胜出。由于文本是一个空字符串,无法解析,所以背景色本来是白色的,但马上就变成了红色
  • 相反的情况发生了,文本被设置,解析失败,背景颜色被设置为红色,然后表单设计者将保存的背景颜色设置回白色。

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

简而言之,您有几种方法来处理这个问题:

  • 确定一个空字符串是否合法,尽管可能有一些默认值(也许是 null?)
  • 确保控件的构造函数为其分配一个文本,该文本是一个合法的可解析整数值(想到0)

关于c# - 为什么自定义 WinForms 控件在绘制时不遵守构造函数中设置的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com