Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

EDIT: Я немного понял, что это связано с 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);
}

Ответ 4

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

Ответ 5

Египетский блог развития: получите значение проверенного элемента в 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 And XValueMember в цикле

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

Ответ 6

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

    }

}

Ответ 7

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


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

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

Источником данных CheckedListBox может быть объект DataTable или список, содержащий объекты, например List<T>, поэтому элементами CheckedListBox управления CheckedListBox могут быть DataRowView, сложные объекты, анонимные типы, первичные типы и другие типы.

Метод расширения GetItemValue

Нам нужен GetItemValue который работает аналогично GetItemText, но возвращает объект, базовое значение элемента, независимо от типа объекта, который вы добавили в качестве элемента.

Мы можем создать GetItemValue расширения 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.

Ответ 8

попробовать:

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

Ответ 9

Вы можете попробовать следующее:

string s = "";

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