Как получить значение проверяемого элемента из 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(',');