- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常奇怪的问题。我有多个用于用户名/密码的文本框,每个用户/密码组旁边都有一个复选框。当用户单击 CheckBox 时,如果他选中它,它旁边的用户名和密码 TextBox 将被启用,焦点将设置为用户名 TextBox。如果用户取消选中 CheckBox,它旁边的 TextBoxes 将被禁用。然而,一个文本框的边框与其他禁用的文本框保持不同。
参见:
我认为这是一个焦点问题,所以我更改了代码 - 当用户取消选中 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/
我是一名优秀的程序员,十分优秀!