如何获得对标签的引用,以便可以更改其属性之一?

时间:2019-12-24 15:34:53

标签: c# winforms controls label

我编写了此方法来禁用名称不包含字符串“ 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属性?

3 个答案:

答案 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;
}