Как получить значение проверенного элемента из CheckedListBox? - PullRequest
25 голосов
/ 02 февраля 2011

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

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

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

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

Ответы [ 9 ]

29 голосов
/ 02 февраля 2011

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

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
     DataRowView castedItem = itemChecked as DataRowView;
     string comapnyName = castedItem["CompanyName"];
     int? id = castedItem["ID"];
}
14 голосов
/ 02 февраля 2011

РЕДАКТИРОВАТЬ: я немного поздно понял, что это было связано с DataTable.В этом случае идея та же, и вы можете привести к DataRowView, а затем взять его Row свойство, чтобы получить DataRow, если вы хотите работать с этим классом.

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

Youнужно будет привести или проанализировать элементы к их строго типизированным эквивалентам или использовать пространство имен 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);
}

Youнеобходимо привести элемент к элементу, чтобы получить доступ к свойствам вашего класса.

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);
}
8 голосов
/ 02 февраля 2011

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

1 голос
/ 12 февраля 2018

Чтобы получить все выбранные элементы в 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());

    }

}
1 голос
/ 16 марта 2012
foreach (int x in chklstTerms.CheckedIndices)
{
    chklstTerms.SelectedIndex=x;
    termids.Add(chklstTerms.SelectedValue.ToString());
}
0 голосов
/ 16 мая 2019

Я уже разместил 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.

0 голосов
/ 20 августа 2015

попробуй:

  foreach (var item in chlCompanies.CheckedItems){
     item.Value //ID
     item.Text //CompanyName
  }
0 голосов
/ 19 сентября 2011

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

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

0 голосов
/ 06 апреля 2011

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

string s = "";

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