c# - 如何更改winform中文本框的只读属性false?

标签 c# winforms

我们如何将 winform 中所有文本框的 ReadOnly 属性从 true 更改为 false 我正在尝试使用这段代码,但这提示我对象空引用错误...

    private void TextBoxesReadOnlyTrue(Control.ControlCollection cc)
    {
        foreach (Control ctrl in cc)
        {
            TextBox tb = ctrl as TextBox;
            if (tb.ReadOnly)
             {
                tb.ReadOnly = false;
             }

        }
    } 

最佳答案

那是因为cc中并不是所有的控件都是TextBox。因此,当您尝试将它们转换为 TextBox 时,该变量为空。当变量为 null 时,您无法访问该变量的任何属性,否则会出现错误。因此,只要变量可以为 null,就必须首先测试它是否为 null。

这是您要用来解决问题的修改后的 if 命令:

    if (tb != null && tb.ReadOnly) { tb.ReadOnly = false; }

所以我很抱歉我忽略了您的文本框可以包含在其他容器控件中。是的,这意味着您需要做 2 件事中的 1 件事: 1:您可以将 TextBox 移到 GroupBox 之外。哈哈。我只是在开玩笑。是的,这可以解决那个问题,但你会遇到更糟糕的问题。正确的方法是为每个在其 Controls 属性中包含控件的控件递归调用您的方法。每个控件都有这个属性,但在不是容器的控件中它似乎是空的(但不是空的)。 (我今天才知道每个控件都有这个 Controls 属性,所以我更新了我的代码以反射(reflect)这一点。) 因此,对于这个真正的解决方案,我建议类似于此:

private void TextBoxesReadOnlyTrue(Control.ControlCollection cc)
{
    foreach (Control ctrl in cc)
    {
        TextBox tb = ctrl as TextBox;
        if (tb != null && tb.ReadOnly)
        { tb.ReadOnly = false; continue; }

        if (ctrl.Controls != null && ctrl.Controls.Count > 0)
        { TextBoxesReadOnlyTrue(ctrl.Controls); }
        // this recursively calls this same method for every control ...
        // that is a container control that contains more controls, ...
        // such as GroupBoxes, Panels, etc.
    }
}

关于c# - 如何更改winform中文本框的只读属性false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672691/

相关文章:

c# - 从字节数组创建新的 FileStream

c# - 我可以从 Windows 窗体应用程序运行编码的 UI 测试吗?

javascript - 如何正确格式化使用 javascript 在服务器端传递的参数?

c# - 回发后将要上传的文件分配给 fileUpload 控件

c# - 在绘画应用程序中保存图像 C#

c# - 鼠标在面板上单击会跳过单击

vb.net - 如何防止在 VB.NET Windows 窗体中垂直调整大小

c++ - 在托管 C++ GUI 中通过另一个事件结束/中断/切换一个事件

c# - 使用 C# 编程格式化可移动媒体

c# - 在页面加载时隐藏 HTML 文本框的 Javascript 函数