对于 CheckedListBox 中的每个 <item>。 <item> 返回为 Object 而不是 Control

Posted

技术标签:

【中文标题】对于 CheckedListBox 中的每个 <item>。 <item> 返回为 Object 而不是 Control【英文标题】:For each <item> in CheckedListBox. <item> returns as Object and not as Control 【发布时间】:2011-01-31 02:21:55 【问题描述】:

我之前填充了一个 CheckedListBox。我想在 CheckedListBox 中的所有项目中循环使用“for each / next”,并对checkedlistbox的每个迭代元素做很多“事情”。

示例代码:

    For Each item In CheckedListBox1.Items

        If item.Checked = True Then

            'do stuff like
            item.BackColor = Color.Blue

        Else

            'do other stuff
            item.BackColor = Color.Brown

        End If

    Next

问题在于它是“对象”类型而不是“控制”类型。如果我强制迭代 var As CheckBox,它会抛出一个 InvalidCastException,说明类型“System.String”不能与类型“System.Windows.Forms.CheckBox”相关联

我知道我可以轻松解决这个问题,但我想使用 for each /next 循环,因为我在该循环中有很多代码(并且无法使用 With )并且总是直接指向对象是什么我希望避免,我真的需要代码尽可能简单。

我实际上花了一个下午的时间寻找这个,但找不到任何答案。

【问题讨论】:

【参考方案1】:

CheckedListBox 不是 CheckBox 控件的集合。 它没有包装对象的集合。

CheckedListBox 控件是一个简单的控件,只能显示一个简单的项目列表;听起来您正在寻找更强大的东西。 (例如,没有所有者绘图就无法更改单个项目的背景颜色)

您应该改用ListView(将CheckBoxes 属性设置为true)。 然后,您可以遍历其Items 集合中的ListViewItem 实例。

【讨论】:

是的,但是 CheckedListBox 对你来说不够强大。 其实没什么好想的。您得到的对象是您添加到列表中的实际对象(在您的情况下,我相信是一个字符串)。不是为它创建的“列表项”。对单个项目进行可视化定制需要编写一个所有者绘制的列表框,这完全是另一堂课。【参考方案2】:
For Each item In SuppliersCheckList.CheckedItems
        If SuppliersCheckList.GetItemCheckState(SuppliersCheckList.Items.IndexOf(item)) Then
            MsgBox(item.ToString)
        End If
Next

【讨论】:

这很好用。但似乎不需要 If 语句。只需使用 CheckedItems 即可为您过滤掉未选中的项目。

以上是关于对于 CheckedListBox 中的每个 <item>。 <item> 返回为 Object 而不是 Control的主要内容,如果未能解决你的问题,请参考以下文章

csharp una checkedListBox中的carica una lista

如何将选中的项目从checkedlistbox 插入SQL 数据库?

根据另一个 CheckedListbox 的检查值从数据库中填充 CheckedListbox

checkedListBox 的用发

CheckedListBox  数据绑定

C# CHECKEDLISTBOX用法总结