Граница TextBox c # изменяется при отключении по сравнению с другими отключенными TextBox - PullRequest
2 голосов
/ 26 октября 2011

У меня действительно странная проблема. У меня есть несколько TextBox для имени пользователя / паролей, и CheckBox рядом с каждой группой пользователей / паролей. Когда пользователь нажимает на CheckBox, и если он проверил его, имя пользователя и пароль TextBox рядом с ним становятся включенными, и фокус устанавливается на имя пользователя TextBox. Если пользователь снял флажок с флажка, текстовые поля рядом с ним отключаются. Однако граница одного TextBox остается отличной от других отключенных TextBox.

См .:

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

Я думал, что это была проблема с фокусом, поэтому я изменил код - когда пользователь снимает флажок с CheckBox, он сначала фокусируется на каком-то другом элементе формы, а затем отключает его, но он все равно делает то же самое. Любые идеи о том, что может вызвать проблемы?

1 Ответ

1 голос
/ 26 октября 2011

Насколько я могу судить, это ошибка в том, как система отображает отключенное состояние элемента управления. Я создал следующий код для моделирования этой проблемы. Код немного многословен, но я сделал его так, чтобы легко понять логический поток.

Я создал форму с: 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). Это также устанавливает фокус на текстовое поле. Теперь, если вы отключите текстовое поле с фокусом, оно будет отображаться иначе, чем другие отключенные текстовые поля.

Я пробовал все виды обновлений, недействительных и т. Д. Элементов управления и самой формы, но безрезультатно.

UPDATE

Итак, я нашел взлом, который, кажется, работает. Если перед отключением установить для стиля границ текстового поля значение «Нет», а затем сбросить его, эффект нечетного контура не произойдет.

    var borderStyle = txtBox.BorderStyle;
    txtBox.BorderStyle = BorderStyle.None;
    txtBox.Enabled = false;
    txtBox.BorderStyle = borderStyle;
...