2016-06-10 63 views
2

我有一个CheckBoxList包含动态数据。现在我想从CheckBoxList中获取所选项目的列表。我正在使用以下代码。如何获取CheckedListBox在Windows窗体中选择的项目文本

for (int i = 0; i < chkTblListDb001.Items.Count; i++) 
{ 
    if (chkTblListDb001.GetItemChecked(i)) 
    { 
      FirstTableSelectedColumns += chkTblListDb001.Items[i].ToString() + ","; 
      MessageBox.Show(FirstTableSelectedColumns); 
    } 
} 

,但回报(在FirstTableSelectedColumns变量) “System.Data.DataRowView,System.Data.DataRowView,”

当我使用这个代码

string test = "you've selected :"; 

foreach (ListItem item in theCheckBoxList.Items) 
{ 
    test += item.Selected ? item.Value + ", " : ""; 
} 
labelResult.Text = test; 

它给我出现以下错误

ListItem not found。

+1

你必须告诉你如何绑定该列表中,但基本上,你会需要将'chkTblListDb001.Items [i]'强制转换为'DataRowView',然后获得想要显示的'DataRowView'列,例如'((DataRowView)chkTblListDb001.Items [i])[0] .ToString()' – Pikoh

+0

Windows窗体没有“CheckBoxList”控件。你的意思是'CheckedListBox'? –

+0

是@ Reza Aghaei我的意思是CheckedListBox。 –

回答

1

解决方案是((DataRowView的)chkTblListDb001.Items [I])[0]的ToString()

string FirstTableSelectedColumns = ""; 
     for (int i = 0; i < chkTblListDb001.Items.Count; i++) 
      { 
       if (chkTblListDb001.GetItemChecked(i)) 
       { 
       //FirstTableSelectedColumns += chkTblListDb001.Items[i].ToString() + ","; 
        FirstTableSelectedColumns += ((DataRowView)chkTblListDb001.Items[i])[0].ToString() + ","; 
        MessageBox.Show(FirstTableSelectedColumns); 
       } 
      } 

Thankx到@Pikoh

+1

使用'GetItemText'来查找文本并使用'string.Join'来加入字符串列表项。 –

2

要得到的文本您可以使用GetItemText

不要紧,什么是项目的类型,如果你已经使用DataSourceDisplayMember它使用DisplayMember返回文本,否则使用项目的ToString方法。

下面是你在找什么,用逗号分隔的检查项目文本的列表的示例:

var texts = this.checkedListBox1.CheckedItems.Cast<object>() 
       .Select(x => this.checkedListBox1.GetItemText(x)); 

MessageBox.Show(string.Join(",", texts)); 
0

使用CheckedItems方法。

 StringBuilder sbCheckedItems = new StringBuilder(); 

     foreach (var cbx in chkTblListDb001.CheckedItems) 
     { 
      sbCheckedItems.Append(cbx.ToString() + ","); 
     } 
     MessageBox.Show(sbCheckedItems.ToString()); 
+0

如果Item的类型是一个对象,那么您将收到对象的ToString()的结果,在这种情况下,对于OP来说,它是'System.Data.DataRowView',因为他似乎在使用'DataTable'作为'DataSource'。 –

0

试试下面这个类在这之后建模(这意味着你需要改变控件的名称,以匹配您的控件的形式,使用的代码添加到您的项目

using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
public static class CheckedListBoxExtensions 
{ 
    public static string CheckedItemsJoined(this CheckedListBox sender) 
    { 
     var Result = from singleItem in sender.Items.OfType<string>().Where(
         (item, index) => 
         { 
          return sender.GetItemChecked(index); 
         } 
        ) 
        select singleItem; 

     return string.Join(",", Result.ToList<string>()); 
    } 
} 

现在。

someLabel.Text = checkedListBox1.CheckedItemsJoined(); 

希望这是你所追求的。

+0

如果该项目不是字符串类型,则此代码不会返回任何内容。最稳定的解决方案是使用'GetItemText'方法。 –