据我所知,这是系统呈现控件禁用状态的一种错误。我创建了下面的代码来模拟这个问题。代码有点冗长,但为了方便理解逻辑流程,我这样做了。
我创建了一个形式,:命名txtBox1,txtBox2,txtBox3和txtBox4 (我这样做是4个选框命名chkBox1,chkBox2,chkBox3和chkBox4
设置每个文本框为False Enabled属性 4文本框在设计时)
private void Form1_Load(object sender, EventArgs e) {
chkBox1.CheckedChanged += chkBox_CheckedChanged;
chkBox2.CheckedChanged += chkBox_CheckedChanged;
chkBox3.CheckedChanged += chkBox_CheckedChanged;
chkBox4.CheckedChanged += chkBox_CheckedChanged;
}
private void chkBox_CheckedChanged(object sender, EventArgs e) {
var chkBox = ((CheckBox)sender);
var controlSet = chkBox.Name.Substring(6,1);
var txtName = "txtBox" + controlSet;
foreach (var txtBox in Controls.Cast<object>().Where(ctl => ((Control)ctl).Name == txtName).Select(ctl => ((TextBox)ctl))) {
if (chkBox.Checked) {
txtBox.Enabled = true;
txtBox.Focus();
}
else {
//The checkbox stole the focuse when it was clicked, so no need to change.
txtBox.Enabled = false;
}
}
}
现在,如果你执行这个代码,你可以检查复选框,使文本具有相同名称的前缀(1,2,3或4)。这也将重点放在文本框上。现在,如果您禁用具有焦点的文本框,则其显示的内容与其他禁用的文本框不同。
我试过各种刷新,失效等等。关于控件和表单本身无济于事。
UPDATE
所以我发现,似乎工作黑客攻击。如果在禁用之前将文本框的边框样式设置为“无”,然后重置,则奇怪的轮廓效果不会发生。
var borderStyle = txtBox.BorderStyle;
txtBox.BorderStyle = BorderStyle.None;
txtBox.Enabled = false;
txtBox.BorderStyle = borderStyle;
您是否检查过所有复选框的属性相同,并且其中一个没有不同的样式或其他东西? – Chris
也许我没有解释得很好 - 它发生在所有TextBoxes上 - 在禁用之前已经关注的TextBox中(也都是使用相同的属性创建的 - 只有例外的是具有密码char的传递TextBoxes)。当我禁用用户文本框的自动对焦并且用户不单击以对其进行对焦/输入时,CheckBox在禁用时不会更改边框。这就是为什么我认为这是一个焦点问题。但后来我添加了一个测试TextBox tbTest,并做了tbTest.Focus();然后禁用2个文本框但仍然得到相同的结果。 – n1tr0
啊,我明白你的意思了,是的,我误解了它,因为一个特定的复选框导致了问题。 :( – Chris