gpt4 book ai didi

与其他禁用的 TextBox 相比,c# TextBox 边框在被禁用时会发生变化

转载 作者:行者123 更新时间:2023-11-30 17:15:35 27 4
gpt4 key购买 nike

我有一个非常奇怪的问题。我有多个用于用户名/密码的文本框,每个用户/密码组旁边都有一个复选框。当用户单击 CheckBox 时,如果他选中它,它旁边的用户名和密码 TextBox 将被启用,焦点将设置为用户名 TextBox。如果用户取消选中 CheckBox,它旁边的 TextBoxes 将被禁用。然而,一个文本框的边框与其他禁用的文本框保持不同。

参见:

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

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

最佳答案

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

我创建了一个表单,其中:4 个文本框,分别命名为 txtBox1、txtBox2、txtBox3 和 txtBox44 个复选框,分别命名为 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)的文本框。这还将焦点设置到文本框。现在,如果您禁用具有焦点的文本框,它的显示方式将不同于其他禁用的文本框。

我在控件和表单本身上尝试了各种刷新、无效等,但都无济于事。

更新

所以我找到了一个似乎有效的 hack。如果您在禁用前将文本框的边框样式设置为“无”,然后在禁用后将其重置,则不会发生奇怪的轮廓效果。

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

关于与其他禁用的 TextBox 相比,c# TextBox 边框在被禁用时会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com