C# 在TabPage中循环checkedlistbox

C# 在TabPage中循环checkedlistbox,c#,winforms,loops,controls,C#,Winforms,Loops,Controls,在搜索我的解决方案时 找到这篇文章 它确实帮助了我 我成功地通过所需的选项卡页创建了一个循环 但它只会更改第一个checkedlistbox(我知道为什么!) 我不明白的是如何更改我循环的所有项目 我知道我需要使用类似于: \u C.项目添加(值) 这是代码: foreach (TabPage TPage in ShiftsViewTab.TabPages) { if (TPage.Name.Equals("tabPage2"))

在搜索我的解决方案时 找到这篇文章

它确实帮助了我
我成功地通过所需的选项卡页创建了一个循环
但它只会更改第一个checkedlistbox(我知道为什么!)
我不明白的是如何更改我循环的所有项目 我知道我需要使用类似于:
\u C.项目添加(值)
这是代码:

foreach (TabPage TPage in ShiftsViewTab.TabPages)
            {
                if (TPage.Name.Equals("tabPage2"))
                {
                    var TabPageControlls = TPage.Controls;
                    foreach( Control _C in TabPageControlls)
                    if (_C is CheckedListBox)
                    {
                        checkedListBox1.Items.Clear();
                        foreach (string _Val in Settings.Default.ShiftList)
                        {
                            checkedListBox1.Items.Add(_Val);
                        }
                    }
                }

            }
尝试使用:

foreach (TabPage TPage in ShiftsViewTab.TabPages)
            {
                if (TPage.Name.Equals("tabPage2"))
                {
                    var TabPageControlls = TPage.Controls;
                    foreach(CheckedListBox _C in TabPageControlls)
                        _C.Items.Clear();
                        foreach (string _Val in Settings.Default.ShiftList)
                        {
                            _C.Items.Add(_Val);
                        }
                    }
                }

            }
但随后遇到其他控件的问题…
请告知
谢谢

好的,
显然看得不够深…
在这里找到答案:

这是工作代码:

foreach (TabPage TPage in ShiftsViewTab.TabPages)
            {
                if (TPage.Name.Equals("tabPage2"))
                {
                    var TabPageControlls = TPage.Controls;
                    foreach( Control _C in TabPageControlls)
                    if (_C is CheckedListBox)
                    {
                        ((CheckedListBox)_C).Items.Clear();
                        foreach (string _Val in Settings.Default.ShiftList)
                        {
                            ((CheckedListBox)_C).Items.Add(_Val);
                        }
                    }
                }

            }

你可以用这个。语法有点不同;它使用LINQ来缩短代码

基本上,前两行代码检查“tabPage2”是否存在,如果不存在则返回

然后在
foreach
块中,type
方法的
只获取类型
CheckedListBox
的控件

我还使用了
AddRange
,因此您可以消除最内部的
foreach
循环,但它需要额外的强制转换,目前我无法测试它是否能够完全正常工作

var tabPage2 = ShiftsViewTab.TabPages.Cast<TabPage>()
                            .SingleOrDefault(x => x.Name == "tabPage2");

if (tabPage2 == null)
    return;

foreach (var clb in tabPage2.Controls.OfType<CheckedListBox>())
{
    clb.Items.Clear();

    clb.Items.AddRange(Settings.Default.ShiftList.Cast<object>().ToArray());
}
var tabPage2=ShiftsViewTab.TabPages.Cast()
.SingleOrDefault(x=>x.Name==“tabPage2”);
if(tabPage2==null)
返回;
foreach(tabPage2.Controls.OfType()中的var clb)
{
clb.Items.Clear();
clb.Items.AddRange(Settings.Default.ShiftList.Cast().ToArray());
}

我知道它使用上面的代码循环所有需要的控件(checkedlistbox),但是由于某种原因,第一个checkedlistbox(硬编码)更改了7倍,我在
var tabPage2=ShiftsViewTab.TabPages.Cast.SingleOrDefault(x=>x.Name==“tabPage2”)上得到一个错误Cast上的错误
它已经在using语句中,我得到的错误是:错误1'System.Data.EnumerableRowCollectionExtensions.Cast(System.Data.EnumerableRowCollection)'是一个“方法”,在给定的上下文中无效。您可以更改或解释它应该是什么样的吗?(谢谢)。。。。知道了。。。谢谢虽然我自己(以不同的方式)弄明白了,但这个看起来更简单。。。谢谢