禁用 Groupbox 内的所有控件

4
我试图禁用如下所示的所有Groupbox中的控件,但是我遇到了错误,无法将任何建议转换为类型。

无法将类型为system.windows.forms.checkbox的对象强制转换为类型system.windows.forms.textbox

            foreach (Control cont in GB_Product_Entry.Controls)
            {
                if (cont is TextBox || cont is ComboBox)
                {
                    ((TextBox)cont).ReadOnly = true;
                    ((TextBox)cont).BackColor = SystemColors.Control;

                    ((ComboBox)cont).Enabled = false;
                    ((ComboBox)cont).BackColor = SystemColors.Control;

                    ((CheckBox)cont).Enabled = false;
                    //((CheckBox)cont).BackColor = SystemColors.Control;
                }
            } 

1
change || to if else - Lei Yang
1
如果您想禁用 GroupBox 中的所有控件,则可以禁用 GroupBox,这样里面的所有控件都将被禁用。 - Roman
@RomaDoskoch 谢谢 - sam
@LeiYang 谢谢你也 - sam
@SergeyBerezovskiy 当我使用foreach使textboxs只读时,它会将textbox更改为只读,但不会更改其颜色..有什么想法吗? - sam
显示剩余2条评论
2个回答

10

为什么不干脆禁用整个GroupBox本身呢?

GB_Product_Entry.Enabled = false;

如果你真的必须循环它们,那么请分开if条件:

foreach (Control cont in GB_Product_Entry.Controls)
{
    if (cont is TextBox)
    {
        ((TextBox)cont).ReadOnly = true;
        ((TextBox)cont).BackColor = SystemColors.Control;
    }
    else if (cont is ComboBox)
    {
        ((ComboBox)cont).Enabled = false;
        ((ComboBox)cont).BackColor = SystemColors.Control;
    }
    else if (cont is CheckBox)
    {
        ((CheckBox)cont).Enabled = false;
      //((CheckBox)cont).BackColor = SystemColors.Control;
    }
    // Any other conditions here...
} 

目前出现问题的原因是在 if 语句里你将 cont 转换为 TextBox 然后片刻之后又转换成 ComboBox。由于它只能是其中一个类型,所以转换始终会失败。

当语句分开时,你就知道类型,因为它被 if 过滤了。


1
我之前不知道禁用 GroupBox 会导致其中所有控件都被禁用。我试过了,但是界面看起来并不好,因为标签也会被禁用,整个界面看起来像是不活跃的...谢谢。 - sam
@sam 好的,那么对于每种类型使用if/else。 - Equalsk
1
@sam 当你禁用文本框、组合框和复选框时,你的界面应该看起来是不活动的,以便清晰地展示给用户。如果禁用整个组件组,则加1分。 - Sergey Berezovskiy
@sam 暂停一下思考为什么标签在禁用时会改变外观。标签不是交互控件 - 你不能在标签中输入一些数据。标签改变它们的外观是为了通知用户控件组被禁用了。 - Sergey Berezovskiy
@Equalsk 不要考虑删除 if-else 语句,我测试过了,这是由于类型转换问题导致的相同错误。 - sam
显示剩余4条评论

0

GB_Product_Entry.Enabled = false; 这将禁用 GB_Product_Entry GroupBox 内的所有内容


1
非常抱歉给你的回答点了踩,但是这并没有禁用子控件(如问题所述),它们仍然是启用的 - 只是在父控件被禁用时无法访问,就像在另一个选项卡上的控件一样 - 启用但不可用。子控件也没有禁用的外观,而且由于 Windows 主题的缘故,甚至分组框的标题看起来也没有被禁用。就用户界面而言,您需要迭代控件 - 而不是意外地启用本应该被禁用的子控件!也许可以使用/编写自定义控件来处理所有这些。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接