【问题标题】:Looping checkedlistbox in TabPage在 TabPage 中循环选中列表框
【发布时间】:2014-07-16 01:45:05
【问题描述】:

在搜索我的解决方案时 找到这篇文章
Loop through controls in TabControl
它确实帮助了我
我成功地通过我需要的 TabPage 创建了一个循环
但它只更改第一个选中列表框(我知道为什么!)
我不明白的是如何更改我循环的所有项目 我知道我需要使用类似的东西:
_C.items.add(value);
这是代码:

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);
                        }
                    }
                }

            }

但后来遇到了其他控件的问题...
请指教
谢谢!!

【问题讨论】:

  • 我知道它用上面的代码循环了所有需要的控件(checkedlistboxes)但是改变了第一个checkedlistbox的7倍(硬编码)

标签: c# winforms loops controls


【解决方案1】:

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

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

然后在foreach 块中,OfType<> 方法只获取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&lt;TabPage&gt; .SingleOrDefault(x =&gt; x.Name == "tabPage2"); 上收到错误Cast&lt;TabPage&gt; 上的错误
  • 它已经在 using 语句中,我得到的错误是:错误 1 ​​'System.Data.EnumerableRowCollectionExtensions.Cast(System.Data.EnumerableRowCollection)' 是一个'方法',它在给定的上下文中无效
  • 你能改变或解释它应该是怎样的吗? (谢谢!!)
  • the () .... 明白了... 谢谢!!虽然我自己(以不同的方式)弄清楚了这个看起来更简单......谢谢!!!!
【解决方案2】:

好的,
显然看起来不够深......
在这里找到答案:
Convert 'Control' to textbox and assign it a value
这是工作代码:

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);
                        }
                    }
                }

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多