将项目从ListBox复制到CheckedListBox

时间:2016-01-04 10:02:53

标签: c# .net winforms listbox checkedlistbox

有许多问题提出了这个问题的相反问题,遗憾的是,这些问题都没有对我有用。我有以下代码来实现我的目的:

foreach (var item in listBox1.Items)
{
    checkedListBox1.Items.Add(item);
}

问题在于,当我执行此操作时,我无法获取ListBox内的值,而不是System.Data.DataRowView项。因此,我的CheckedListBox会填充完整的System.Data.DataRowView字符串,这些字符串都是相同的,并且不会显示实际的字符串值。

修改:我以这种方式绑定到ListView:我有DataTable ds,并且:

listBox1.DataSource = ds;

4 个答案:

答案 0 :(得分:2)

由于某些未知原因,DataSource控件隐藏了DisplayMemberValueMemberCheckedListBox属性。

如果要复制列表框项目文本,正确的方法是使用ListControl.GetItemText这样的方法

foreach (var item in listBox1.Items)
    checkedListBox1.Items.Add(listBox1.GetItemText(item));

但是这样很难找到选中哪个对象来源(例如枚举CheckedItems时)。更好的方法是像这样定义自己的类

class MyListItem
{
    public object Value;
    public string Text;
    public override string ToString() { return Text; }
}

并使用

foreach (var item in listBox1.Items)
    checkedListBox1.Items.Add(new MyListItem { Value = item, Text = listBox1.GetItemText(item) });

答案 1 :(得分:1)

您需要执行以下演员:

foreach (var item in listBox1.Items)
 {
    checkedListBox1.Items.Add((ListItem)item);   
 }

或者你可以像这样使用:

foreach (ListItem item in listBox1.Items)
 {
     checkedListBox1.Items.Add(item);   
 }

即使这也可以帮助你(如果你想要文字和价值,可以这样使用);

for(int i=0;i<listBox1.Items.Count-1;i++)
   {
      checkedListBox1.Items.Add(new ListItem() { Text = listBox1.Items[i].Text, Value = listBox1.Items[i].Text });   
   }

答案 2 :(得分:1)

derived ListControl类(如CheckedListBox)显示的文本(当这些控件绑定到数据源时)由属性DisplayMember控制。此属性等于表示数据源中属性(或列名)的名称的字符串。

所以在将新商品添加到checkedlistbox之前,我建议写一下

checkedListBox1.DataSource = listBox1.DataSource       
checkedListBox1.DisplayMember = listBox1.DisplayMember
checkedListBox1.ValueMember = listBox1.ValueMember

无需创建循环读取源列表框中的所有项目,只需使用相同的数据源并准备就绪

答案 3 :(得分:1)

试试这个:

foreach (var dataRowView in listBox1.Items.OfType<DataRowView>())
{
     checkedListBox1.Items.Add(dataRowView[0].ToString());
}