【问题标题】:C# Unable to loop through control collection and set properties on a user control in Windows FormsC# 无法循环遍历控件集合并在 Windows 窗体中的用户控件上设置属性
【发布时间】:2019-07-17 19:47:14
【问题描述】:

您好,我有一个表单应用程序,它使用基于名为 colorSlider 的跟踪栏的自定义控件。此控件是从代码项目中获得的,并添加到 VS2017 中的工具中。控制的各个方面工作正常。我可以随意更改任何属性。然而,最终的项目是相当大的,所有的轨迹栏(50 左右)都将被这个自定义控件所取代。我还希望能够使用用户自定义皮肤修改滑块的外观。 所以,这里是一个典型的改变滑块按钮的命令。

colorSlider1.ThumbInnerColor = Color.FromArgb(99, 130, 208);

这非常好用。但是我想循环执行此操作。所有控件都在一个称为背面板的面板上。下面是一个改变按钮前景色的例子:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is Button)
                {
                    c.ForeColor = Color.Black;
                }
            }
        }

这很好用。但是,如果我尝试这样做:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is ColorSlider.ColorSlider)
                {
                    c.ThumbInnerColor = Color.FromArgb(99, 130, 208);
                }
            }
        }

在这种情况下,Visual Studio 给出了语法错误

错误 CS1061“Control”不包含“ThumbInnerColor”的定义,并且找不到接受“Control”类型的第一个参数的可访问扩展方法“ThumbInnerColor”(您是否缺少 using 指令或程序集引用?)

所以有人知道如何解决这个问题吗? 谢谢

【问题讨论】:

    标签: c# user-controls controlcollection


    【解决方案1】:

    您也可以使用 Controls.OfType 选项:

            foreach(Panel pnl in backPanel.Controls.OfType<Panel>())
            {
                foreach(ColorSlider cs in pnl.Controls.OfType<ColorSlider>())
                {
                    cs.ThumbInnerColor = Color.FromArgb(99, 130, 208);
                }
            }
    

    【讨论】:

    • VS 不理解所写的 .OfType。
    • 非常适合我...不知道哪里出了问题。
    • 很好,我不知道 OfType 会派上用场
    【解决方案2】:

    或在较新的 C# 中

    foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            if (c is ColorSlider.ColorSlider s)
            {
                s.ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      看看错误.. Control' 不包含“ThumbInnerColor”的定义 .. 这是真的.. Control 不包含该属性。 现在看看你的代码:

      c.ThumbInnerColor = Color.FromArgb(99, 130, 208);
      

      您正在尝试在类型为 ControlObject 上设置属性。 该属性属于 ColorSlider..

      类型的特定控件

      修复应该像将 Control 转换为 ColorSlider

      一样简单
      foreach (Panel pnl in backPanel.Controls)
          {
              foreach (Control c in pnl.Controls)
              {
                  ColorSlider.ColorSlider slider = c as ColorSlider.ColorSlider;
                  if (slider != null)
                  {
                      slider.ThumbInnerColor = Color.FromArgb(99, 130, 208);
                  }
              }
          }
      

      foreach (Panel pnl in backPanel.Controls)
          {
              foreach (Control c in pnl.Controls)
              {
                  if (c is ColorSlider.ColorSlider)
                  {
                      (c as ColorSlider.ColorSlider).ThumbInnerColor = Color.FromArgb(99, 130, 208);
                  }
              }
          }
      

      foreach (Panel pnl in backPanel.Controls)
          {
              foreach (Control c in pnl.Controls)
              {
                  if (c is ColorSlider.ColorSlider)
                  {
                      ((ColorSlider.ColorSlider)c).ThumbInnerColor = Color.FromArgb(99, 130, 208);
                  }
              }
          }
      

      【讨论】:

      • 不客气。它们都是一样的,只是做事的方式不同。您应该在 .NET 中查找类型转换。如果控制不是我们想要的类型,第一种方法将给出 null 。如果控件不是正确的类型,第二种方法将引发空异常。如果控件类型错误,第三种方法将引发无效的强制转换异常。但是该类型已经预先测试过了,所以永远不会发生异常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多