如何从CheckedListBox获取已检查项的值?

时间:2011-02-02 14:25:18

标签: c# .net winforms checkedlistbox

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

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

我可以获取已检查项目的索引,但如何获取已检查项目文本和值。而是如何通过CheckedItems枚举访问文本和值?

感谢您分享您的时间。

9 个答案:

答案 0 :(得分:28)

将它转换回原始类型,如果你绑定了一个表,它将是一个DataRowView,然后你可以从适当的列中获取Id和Text:

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
     DataRowView castedItem = itemChecked as DataRowView;
     string comapnyName = castedItem["CompanyName"];
     int? id = castedItem["ID"];
}

答案 1 :(得分:14)

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

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

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

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

答案 2 :(得分:8)

您可以遍历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

答案 3 :(得分:1)

foreach (int x in chklstTerms.CheckedIndices)
{
    chklstTerms.SelectedIndex=x;
    termids.Add(chklstTerms.SelectedValue.ToString());
}

答案 4 :(得分:0)

Egypt Development Blog : Get value of checked item in CheckedListBox in vb.net

将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中的选中项的值或显示

希望有用。

答案 5 :(得分:0)

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

在这种情况下,ths值是一个String,但它与其他类型的Object一起运行:

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

    }

}

答案 6 :(得分:0)

  

我已经在这篇文章中发布了GetItemValue扩展方法   Get the value for a listbox item by index。此扩展   方法将适用于所有ListControl类,包括   CheckedListBoxListBoxComboBox


现有的答案都不够通用,但是有一个通用的解决方案。

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

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

GetItemValue扩展方法

我们需要一个GetItemValue,其工作方式与GetItemText类似,但是无论您添加为项目的对象类型如何,都返回一个对象,即项目的基础值。

我们可以创建GetItemValue extension method来获得与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>ArrayArrayListDataTable,匿名类型列表,主要类型列表以及所有其他可用作数据源的列表一起使用。这是用法示例:

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

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

此方法也适用于ComboBoxCheckedListBox

答案 7 :(得分:-1)

尝试:

  foreach (var item in chlCompanies.CheckedItems){
     item.Value //ID
     item.Text //CompanyName
  }

答案 8 :(得分:-2)

你可以试试这个:

string s = "";

foreach(DataRowView drv in checkedListBox1.CheckedItems)
{
    s += drv[0].ToString()+",";
}
s=s.TrimEnd(',');