Как получить значение проверенного элемента из CheckedListBox?
Я использовал CheckedListBox над моей WinForm на С#. Я ограничил этот элемент управления, как показано ниже -
chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";
Я могу получить индексы проверенных элементов, но как я могу получить проверенный текст и значение элемента. Скорее, как я могу перечислять через CheckedItems доступ к тексту и стоимости?
Спасибо, что поделились своим временем.
Ответы
Ответ 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);
}
Ответ 3
Вы можете CheckedItems
свойство 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
Ответ 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(',');