我编写了此方法来禁用名称不包含字符串“ Label”的所有标签的autosize属性。
private void DisableAutoSize()
{
foreach (Control control in Controls)
{
if (!control.Name.Contains("Label"))
{
(control as Label).AutoSize = false;
}
}
}
下面的行是导致问题的原因:
(control as Label).AutoSize = false;
我得到的错误是:
System.NullReferenceException:“对象引用未设置为对象的实例。” (... as System.Windows.Forms.Label)返回null。
如何访问该AutoSize属性?
答案 0 :(得分:1)
按类型过滤并使用LINQ方法OfType()和Where()应用搜索条件:
private void DisableAutoSize()
{
foreach (Label control in Controls.OfType<Label>().Where(c => !c.Name.Contains("Label")))
{
control.AutoSize = false;
}
}
答案 1 :(得分:0)
您正在遍历以下形式的所有Control
,其中至少一个不是Label
。因此,强制转换失败。在您的循环中,检查是否存在这种情况:
private void DisableAutoSize()
{
foreach (Control control in Controls)
{
Label label = control as Label;
if (label == null || control.Name.Contains("Label"))
{
continue;
}
label.AutoSize = false;
}
}
答案 2 :(得分:0)
您的代码存在的问题是Controls
也可能包含非标签控件。如果将非标签控件转换为控件(control as Label
),则它将返回null。这就是您最终获得NullReferenceException
的原因。
您可以使用Enumerable.OfType<T>
方法来过滤标签控件。例如,
foreach (Label control in Controls.OfType<Label>())
{
if (!control.Name.Contains("Label"))
{
control.AutoSize = false;
}
}
您可以使用Enumerable.Where<T>
进一步扩展Linq以基于Name属性过滤标签,从而删除if条件。
foreach (Label control in Controls.OfType<Label>().Where(x=>!x.Name.Contains("Label")))
{
control.AutoSize = false;
}