c#TextBox边框与其他禁用的TextBox相比被禁用

时间:2011-10-26 15:42:15

标签: c# textbox focus border

我有一个非常奇怪的问题。 我有多个用于用户名/密码的TextBox,以及每个用户/密码组旁边的CheckBox。当用户单击CheckBox时,如果他检查了它,则旁边的用户名和密码TextBox将变为启用状态,焦点将设置为用户名TextBox。如果用户取消选中CheckBox,则旁边的TextBox会被禁用。但是,一个TextBox的边框与其他禁用的TextBox不同。

见:

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

我认为这是一个焦点问题,所以我改变了代码 - 当用户取消选中CheckBox时,它首先关注表单上的其他元素,然后禁用它,但它仍然会做同样的事情。 关于什么可能导致问题的任何想法?

1 个答案:

答案 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;