包含其他面板的面板中的Foreach按钮

时间:2017-11-21 10:56:55

标签: c#

我使用的自定义按钮包含其他元素和颜色样式,如TopColor和BotColor。我需要在面板中使用其他面板来处理这个Button。

我正在尝试这个:

foreach(CustomButton btn in panel1.Controls)
{  
    if(btn is CustomButton)
    {
        btn.TopColor=Color.Red;
    }

内部面板1我也包含其他面板。而我得到的错误是 它不能成为按钮中的转换元素面板。

一种解决方案是在一个面板中分离按钮。但我想问一下是否有办法避免其他因素。我不想使用foreach(在this.Controls中控制a)的原因是它不能识别我的自定义颜色样式TopColor和BotColor

Take a look

3 个答案:

答案 0 :(得分:1)

您收到错误的原因是您尝试将所有控件投射到CustomButton,甚至是面板。您已经知道了自己要查找的类型,因此您不必遍历面板中的每个控件。

假设您的所有自定义按钮都在panel1中并且您不需要递归,则应该将项目过滤到您想要的类型,然后使用它们:

var customButtons = panel1.Controls.OfType<CustomButton>();

foreach (CustomButton customButton in customButtons)
 {
     //do what you need here
 }

答案 1 :(得分:1)

我希望这个解决方案适合你。

   private void SetStylesToCustomButtons(Control.ControlCollection controls)
    {
        foreach (Control control in controls)
        {
            if (control is CustomButton)
            {
                (control as CustomButton).TopColor = Color.Red;
            }
            else if (control is Panel)
            {
                SetStylesToCustomButtons((control as Panel).Controls);
            }
        }
    }

答案 2 :(得分:0)

遍历所有控件(作为控件),检查它是否为按钮,然后在尝试设置颜色之前将其强制转换。

foreach(Control c in panel1.Controls)
{
    if (c is CustomButton)
    {
        (c as CustomButton).TopColor = Color.Red;
    }
}