31

我在 C# 中的 WinForm 上使用了 CheckedListBox。我已经限制了这个控件,如下所示 -

chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";

我可以获得检查项目的索引,但我怎样才能获得检查项目的文本和值。而是如何通过 CheckedItems 访问 Text 和 Value 进行枚举?

感谢您分享您的时间。

4

9 回答 9

38

将其转换回其原始类型,如果您正在绑定表,它将是 DataRowView,然后您可以从相应的列中获取 Id 和 Text:

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
     DataRowView castedItem = itemChecked as DataRowView;
     string comapnyName = castedItem["CompanyName"];
     int? id = castedItem["ID"];
}
于 2011-02-02T14:40:28.793 回答
14

编辑:我意识到它被绑定到一个 DataTable 有点晚了。在这种情况下,想法是相同的,如果您想使用该类,您可以将其转换为 a,DataRowView然后获取其Row属性以获得 a 。DataRow

foreach (var item in checkedListBox1.CheckedItems)
{
    var row = (item as DataRowView).Row;
    MessageBox.Show(row["ID"] + ": " + row["CompanyName"]);
}

您需要将项目转换或解析为它们的强类型等效项,或者使用System.Data.DataSetExtensions命名空间来使用下面演示的DataRowExtensions.Field方法:

foreach (var item in checkedListBox1.CheckedItems)
{
    var row = (item as DataRowView).Row;
    int id = row.Field<int>("ID");
    string name = row.Field<string>("CompanyName");
    MessageBox.Show(id + ": " + name);
}

您需要强制转换项目以访问您的类的属性。

foreach (var item in checkedListBox1.CheckedItems)
{
    var company = (Company)item;
    MessageBox.Show(company.Id + ": " + company.CompanyName);
}

或者,您可以使用OfType扩展方法来获取强类型结果,而无需在循环内显式转换:

foreach (var item in checkedListBox1.CheckedItems.OfType<Company>())
{
    MessageBox.Show(item.Id + ": " + item.CompanyName);
}
于 2011-02-02T14:44:16.180 回答
10

您可以遍历该CheckedItems属性:

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
    MyCompanyClass company = (MyCompanyClass)itemChecked;    
    MessageBox.Show("ID: \"" + company.ID.ToString());
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.checkeditems.aspx

于 2011-02-02T14:31:57.237 回答
1
foreach (int x in chklstTerms.CheckedIndices)
{
    chklstTerms.SelectedIndex=x;
    termids.Add(chklstTerms.SelectedValue.ToString());
}
于 2012-03-16T07:08:01.793 回答
1

要获取 CheckedListBox 中的所有选定项目,请尝试以下操作:

在这种情况下,这个值是一个字符串,但它与其他类型的对象一起运行:

for (int i = 0; i < myCheckedListBox.Items.Count; i++)
{
    if (myCheckedListBox.GetItemChecked(i) == true)
    {

        MessageBox.Show("This is the value of ceckhed Item " + myCheckedListBox.Items[i].ToString());

    }

}
于 2018-02-12T11:13:08.340 回答
0

埃及开发博客:在 vb.net 中的 CheckedListBox 中获取选中项的值

将 CheckedListBox 与数据绑定后,您可以获得选中项的值

For i As Integer = 0 To CheckedListBox1.CheckedItems.Count - 1
                    Dim XDRV As DataRowView = CType(CheckedListBox1.CheckedItems(i), DataRowView)
                    Dim XDR As DataRow = XDRV.Row
                    Dim XDisplayMember As String = XDR(CheckedListBox1.DisplayMember).ToString()
                    Dim XValueMember As String = XDR(CheckedListBox1.ValueMember).ToString()
                    MsgBox("DisplayMember : " & XDisplayMember & "   - ValueMember : " & XValueMember )
Next

现在您可以从循环中的 2 个变量 XDisplayMember 和 XValueMember 中使用 CheckedListBox 中选中项目的值或显示

希望有用。

于 2011-09-19T13:50:03.220 回答
0

我已经在这篇文章Get the value for a listbox item by indexGetItemValue中发布了扩展方法 。此扩展方法适用于所有类,包括 ,和.ListControlCheckedListBoxListBoxComboBox


现有的答案都不够通用,但是对于这个问题有一个通用的解决方案。

在所有情况下,无论数据源的类型如何,Value都应根据 来计算项目的基础。ValueMember

的数据源CheckedListBox可能是a DataTable,也可能是包含对象的列表,如a List<T>,因此CheckedListBox控件的项目可能是DataRowView、复杂对象、匿名类型、主要类型和其他类型。

GetItemValue 扩展方法

我们需要一个GetItemValue与 类似的GetItemText,但返回一个对象,即项目的底层值,无论您添加为项目的对象类型如何。

我们可以创建GetItemValue 扩展方法来获取项目值,其工作方式如下GetItemText

using System;
using System.Windows.Forms;
using System.ComponentModel;
public static class ListControlExtensions
{
    public static object GetItemValue(this ListControl list, object item)
    {
        if (item == null)
            throw new ArgumentNullException("item");

        if (string.IsNullOrEmpty(list.ValueMember))
            return item;

        var property = TypeDescriptor.GetProperties(item)[list.ValueMember];
        if (property == null)
            throw new ArgumentException(
                string.Format("item doesn't contain '{0}' property or column.",
                list.ValueMember));
        return property.GetValue(item);
    }
}

使用上述方法,您无需担心设置,ListBox它将返回Value项目的预期值。它适用于List<T>, Array, ArrayList, DataTable, 匿名类型列表、主要类型列表以及您可以用作数据源的所有其他列表。这是一个使用示例:

//Gets underlying value at index 2 based on settings
this.checkedListBox.GetItemValue(this.checkedListBox.Items[2]);

由于我们将该GetItemValue方法创建为扩展方法,因此当您要使用该方法时,请不要忘记包含您放置该类的名称空间。

这种方法也ComboBox适用CheckedListBox

于 2019-05-16T17:55:09.077 回答
-1

尝试:

  foreach (var item in chlCompanies.CheckedItems){
     item.Value //ID
     item.Text //CompanyName
  }
于 2015-08-20T19:01:36.573 回答
-2

你可以试试这个:

string s = "";

foreach(DataRowView drv in checkedListBox1.CheckedItems)
{
    s += drv[0].ToString()+",";
}
s=s.TrimEnd(',');
于 2011-04-06T14:37:52.617 回答