You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何构造Control.ControlCollection以调用控件只读设置方法?

如何构造Control.ControlCollection调用控件只读方法

你尝试用Control[]数组来调用设置控件只读的方法是行不通的,因为Control.ControlCollection是WinForms中专门的控件集合类型,和普通数组类型不兼容。下面给你两种可行的解决思路:

1. 直接使用现有控件集合

如果要处理整个窗体的控件,直接传入窗体的Controls属性即可,它本身就是Control.ControlCollection类型:

// 假设你的设置方法叫SetAllControlsReadOnly
SetAllControlsReadOnly(this.Controls, true);

如果控件有嵌套(比如Panel里的TextBox),记得在方法里加上递归处理子控件的逻辑。

2. 为特定控件构造临时集合

如果只想处理指定的几个控件(比如textbox1),可以通过临时容器来构造Control.ControlCollection:

// 创建临时Panel作为容器
Panel tempContainer = new Panel();
// 将目标控件添加到临时容器的Controls集合中
tempContainer.Controls.Add(textbox1);
// 传入临时容器的Controls集合调用方法
SetAllControlsReadOnly(tempContainer.Controls, true);

⚠️ 注意:如果目标控件已经在窗体或其他容器上,这段代码会把它从原容器移到临时Panel里,用完可能需要再移回去。

更灵活的方案:重载方法

其实没必要非要用Control.ControlCollection,可以给原方法写个重载,支持传入任意控件集合(比如数组、List等):

// 重载方法,支持IEnumerable<Control>类型参数
public void SetAllControlsReadOnly(IEnumerable<Control> controls, bool isReadOnly)
{
    foreach (Control ctrl in controls)
    {
        // 根据控件类型设置只读,这里以TextBox为例
        if (ctrl is TextBox textBox)
        {
            textBox.ReadOnly = isReadOnly;
        }
        // 递归处理子控件
        if (ctrl.HasChildren)
        {
            SetAllControlsReadOnly(ctrl.Controls.Cast<Control>(), isReadOnly);
        }
    }
}

调用的时候直接传数组就行:

SetAllControlsReadOnly(new Control[] { textbox1 }, true);

内容的提问来源于stack exchange,提问作者Jocelyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:24:11