2011-10-26 33 views
2

我有一个非常奇怪的问题。 我有多个用于用户名/密码的文本框和每个用户/密码组旁边的复选框。当用户点击CheckBox时,如果他检查了它,那么在它旁边的用户名和密码TextBox被启用并且焦点被设置为用户名TextBox。如果用户未选中CheckBox,则旁边的TextBox将被禁用。但是,一个TextBox的边框与其他禁用的TextBoxes保持不同。c#文本框边框在被禁用时与其他禁用的文本框相比发生了变化

参见:

http://img545.imageshack.us/img545/1944/textbox.png

我认为这是一个焦点问题,所以我改变了代码 - 当用户取消选中它首先集中一些其他元素上的复选框的形式,然后在禁用它,但它仍然执行相同的操作。 有关可能导致问题的任何想法?

+0

您是否检查过所有复选框的属性相同,并且其中一个没有不同的样式或其他东西? – Chris

+0

也许我没有解释得很好 - 它发生在所有TextBoxes上 - 在禁用之前已经关注的TextBox中(也都是使用相同的属性创建的 - 只有例外的是具有密码char的传递TextBoxes)。当我禁用用户文本框的自动对焦并且用户不单击以对其进行对焦/输入时,CheckBox在禁用时不会更改边框。这就是为什么我认为这是一个焦点问题。但后来我添加了一个测试TextBox tbTest,并做了tbTest.Focus();然后禁用2个文本框但仍然得到相同的结果。 – n1tr0

+0

啊,我明白你的意思了,是的,我误解了它,因为一个特定的复选框导致了问题。 :( – Chris

回答

1

据我所知,这是系统呈现控件禁用状态的一种错误。我创建了下面的代码来模拟这个问题。代码有点冗长,但为了方便理解逻辑流程,我这样做了。

我创建了一个形式,:命名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; 
+0

我认为我发现如果你在注释行中放置了一个MessageBox.Show(“something”),点击确定后,禁用代码将会执行,并且TextBox将会像它应该是的 – n1tr0

+0

是的,我认为这是合法的错误,就像我说过的,我试图刷新/重绘控件无济于事,我怀疑你想弹出一个消息框来修复控件的渲染,希望你能找出一些东西,我会玩一些东西今天下午更多。 –

+0

我发现如果您将表单重新调整大小,然后重新调整表单的大小以便不显示格式不正确的文本框,然后将表单重新设置为正常,则格式是正确的。但是,它在代码中不起作用。你也可以最小化和恢复,它回到了它应该是的。 –