gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:32:09 30 4
gpt4 key购买 nike

我们如何将 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/

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