我在C#中的WinForm上使用了CheckedListBox。我已经限制了这个控件,如下所示 -
chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";
我可以获取已检查项目的索引,但如何获取已检查项目文本和值。而是如何通过CheckedItems枚举访问文本和值?
感谢您分享您的时间。
答案 0 :(得分:28)
将它转换回原始类型,如果你绑定了一个表,它将是一个DataRowView,然后你可以从适当的列中获取Id和Text:
foreach(object itemChecked in checkedListBox1.CheckedItems)
{
DataRowView castedItem = itemChecked as DataRowView;
string comapnyName = castedItem["CompanyName"];
int? id = castedItem["ID"];
}
答案 1 :(得分:14)
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
method:
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);
}
答案 2 :(得分:8)
您可以遍历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
答案 3 :(得分:1)
foreach (int x in chklstTerms.CheckedIndices)
{
chklstTerms.SelectedIndex=x;
termids.Add(chklstTerms.SelectedValue.ToString());
}
答案 4 :(得分:0)
Egypt Development Blog : Get value of checked item in CheckedListBox in 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
现在你可以使用循环中2变量XDisplayMember和XValueMember的CheckedListBox中的选中项的值或显示
希望有用。
答案 5 :(得分:0)
要获取CheckedListBox中的所有选定项目,请尝试:
在这种情况下,ths值是一个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());
}
}
答案 6 :(得分:0)
我已经在这篇文章中发布了
GetItemValue
扩展方法 Get the value for a listbox item by index。此扩展 方法将适用于所有ListControl
类,包括CheckedListBox
,ListBox
和ComboBox
。
现有的答案都不够通用,但是有一个通用的解决方案。
在所有情况下,无论数据源的类型如何,都应针对Value
计算项目的基础ValueMember
。
CheckedListBox
的数据源可以是DataTable
,也可以是包含对象的列表,例如List<T>
,因此CheckedListBox
控件的项目可能是DataRowView
,复杂对象,匿名类型,主要类型和其他类型。
GetItemValue扩展方法
我们需要一个GetItemValue
,其工作方式与GetItemText
类似,但是无论您添加为项目的对象类型如何,都返回一个对象,即项目的基础值。
我们可以创建GetItemValue
extension method来获得与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
。
答案 7 :(得分:-1)
尝试:
foreach (var item in chlCompanies.CheckedItems){
item.Value //ID
item.Text //CompanyName
}
答案 8 :(得分:-2)
你可以试试这个:
string s = "";
foreach(DataRowView drv in checkedListBox1.CheckedItems)
{
s += drv[0].ToString()+",";
}
s=s.TrimEnd(',');