Как получить значение проверяемого элемента из CheckedListBox?

Я использовал CheckedListBox поверх моей WinForm в C#. Я ограничил этот контроль, как показано ниже -

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

Я могу получить индексы отмеченных предметов, но как я могу получить проверенный текст и значение предмета? Скорее, как я могу перечислить через CheckedItems доступ к тексту и значению?

Спасибо, что поделились своим временем.

8 ответов

Решение

Приведите его к исходному типу, который будет DataRowView, если вы связываете таблицу, и затем вы можете получить Id и Text из соответствующих столбцов:

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

РЕДАКТИРОВАТЬ: я немного поздно понял, что это было связано с 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 метод продемонстрирован ниже:

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

Вы можете перебрать 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

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

Чтобы получить все выбранные элементы в CheckedListBox, попробуйте это:

В этом случае это значение 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());

    }

}

Я уже выложил GetItemValue метод расширения в этом посте Получить значение элемента списка по индексу. Этот метод расширения будет работать для всех ListControl классы в том числе CheckedListBox , ListBox а также ComboBox ,


Ни один из существующих ответов не является достаточно общим, но существует общее решение проблемы.

Во всех случаях основной Value предмет должен быть рассчитан относительно ValueMember независимо от типа источника данных.

Источник данных CheckedListBox может быть DataTable или это может быть список, который содержит объекты, такие как 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 тоже.

Блог разработчиков Египта: получите значение проверенного элемента в CheckedListBox в 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

Теперь вы можете использовать значение или Отображение отмеченных элементов в CheckedListBox из 2 переменных XDisplayMember и XValueMember в цикле

надеюсь быть полезным.

Пытаться:

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

Вы можете попробовать это:

string s = "";

foreach(DataRowView drv in checkedListBox1.CheckedItems)
{
    s += drv[0].ToString()+",";
}
s=s.TrimEnd(',');
Другие вопросы по тегам