我有一个非常奇怪的问题。 我有多个用于用户名/密码的TextBox,以及每个用户/密码组旁边的CheckBox。当用户单击CheckBox时,如果他检查了它,则旁边的用户名和密码TextBox将变为启用状态,焦点将设置为用户名TextBox。如果用户取消选中CheckBox,则旁边的TextBox会被禁用。但是,一个TextBox的边框与其他禁用的TextBox不同。
见:
我认为这是一个焦点问题,所以我改变了代码 - 当用户取消选中CheckBox时,它首先关注表单上的其他元素,然后禁用它,但它仍然会做同样的事情。 关于什么可能导致问题的任何想法?
答案 0 :(得分:1)
据我所知,这是系统呈现控件禁用状态的错误。我创建了以下代码来模拟此问题。代码有点冗长,但我这样做是为了便于理解逻辑流程。
我创建了一个表单,其中包含: 4个文本框名为txtBox1,txtBox2,txtBox3和txtBox4 4个复选框名为chkBox1,chkBox2,chkBox3和chkBox4
将每个文本框的Enabled属性设置为False(我在设计时执行此操作)
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)的文本框。这也将焦点设置为文本框。现在,如果禁用具有焦点的文本框,则它显示的方式与其他已禁用的文本框不同。
我尝试了各种各样的Refresh,Invalidate等。控件和Form本身无济于事。
<强>更新强>
所以我发现了一个似乎有效的黑客攻击。如果在禁用之前将文本框的bordertyle设置为“None”,然后在之后重置它,则不会发生奇怪的轮廓效果。
var borderStyle = txtBox.BorderStyle;
txtBox.BorderStyle = BorderStyle.None;
txtBox.Enabled = false;
txtBox.BorderStyle = borderStyle;