簡體   English   中英

C#無法遍歷控件集合並在Windows窗體中的用戶控件上設置屬性

[英]C# Unable to loop through control collection and set properties on a user control in Windows Forms

嗨,我有一個Forms應用程序,該應用程序使用基於稱為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“控件”不包含“ ThumbInnerColor”的定義,並且找不到可以接受的擴展方法“ ThumbInnerColor”接受“ Control”類型的第一個參數(是否缺少using指令或程序集引用?)

因此,有人對如何解決此問題有想法嗎? 謝謝

看看錯誤。“ 控件”不包含“ ThumbInnerColor”的定義,這是正確的。. 控件不包含該屬性。 現在看一下您的代碼:

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

您正在嘗試在控件類型為Object的對象上設置該屬性,該屬性屬於ColorSlider類型的特定控件。

該修復應與將控件投射到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);
            }
        }
    }

或更新的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);
        }
    }
}

您還可以使用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);
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM