【问题标题】:Get CheckedItems string value from checkedlistbox从checkedlistbox获取CheckedItems字符串值
【发布时间】:2018-12-11 12:13:52
【问题描述】:

我想获取变量上的checkedlistBox值,我的代码在下面,谁能帮助我

private void CheckPreviousTxn_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            int selected = CheckPreviousTxn.SelectedIndex;
            string selecteditem1 = CheckPreviousTxn.CheckedItems.ToString();
            if (selected != -1)
            {
                foreach (string slecteditem in CheckPreviousTxn.CheckedItems)
                {
                    con = new SqlConnection(connectionpath);
                    cmd = new SqlCommand("select QTNCode as 'QTN Code',STKCODE as 'Item Code',STKDESCP as 'Item Name',Quantity,BaseUnit as 'Unit',Rate,DiscountAmount as 'Discount',Amount,VatPercentage as 'VAT %',TotalTaxAmount as 'VAT Amt' from Tbl_QTNDetail where QTNCode ='" + slecteditem + "'", con);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    GrdQtnDetail.DataSource = dt;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

我得到以下异常

无法将“System.Data.DataRowView”类型的对象转换为“System.String”类型

我得到了checkedlistBox
value = {System.Windows.Forms.CheckedListBox, Items.Count: 13, Items[0]:QTN0001}

【问题讨论】:

  • string selecteditem1 = CheckPreviousTxn.CheckedItems.ToString(); 是问题所在。 CheckedItems 返回一个集合,您需要对其进行迭代以提取所有字符串。
  • 题外话:您的代码易受 SQL 注入攻击。
  • 要获取项目文本,请使用CheckedListBoxGetItemText 方法。要获取项目值,请使用GetItemValue 扩展方法。

标签: c# winforms


【解决方案1】:

CheckedItems 不是 String 类型的集合。您需要使用ListItem 或使用Object,例如:

 foreach (ListItem selecteditem in CheckPreviousTxn.CheckedItems)
 {
    string itemValue = selectedItem.Value;
    string itemText = selectedItem.Text;
    string item = selectedItem.ToString();
    // use it in query
 }

或:

foreach(object itemChecked in checkedListBox1.CheckedItems) 
{
   string selectedItem= itemChecked.ToString();
}

请参阅DOCS here 以供参考。

旁注:

不要对查询进行字符串连接。考虑使用参数化查询,因为您的应用程序容易受到带有字符串连接查询的 sql 注入的影响。

【讨论】:

  • ListItem 不是来自PresentationFramework 吗?在WinForms中,你通常会得到带有string itemText = checkedListBox1.GetItemText(checkedListBox1.Selecteditem);的项目(对象)文本
  • @Jimi 不确定在 winforms 上工作已经这么长时间了,但是是的,object 是基本类型,所以应该可以工作
  • 好吧,我说的是这个:foreach (ListItem selecteditem in CheckPreviousTxn.CheckedItems) { }。还有这个:string itemValue = selectedItem.Value;。有.Value 属性吗?
  • 它对 Windows 窗体无效。甚至itemChecked.ToString() 也会针对这个问题显示System.Data.DataRowView
  • CheckPreviousTxn.GetItemText(CheckPreviousTxn.CheckedItems); checklistbox id 是 CheckPreviousTxn 我得到的值是 CheckPreviousTxn | {selectedItem="QTN0007"} Qtn0007 是我想要获取的值 CheckPreviousTxn ="Qtn0007"
【解决方案2】:

如果你在 for 循环中填充数据表,你只会得到最后一个检查项值数据表。 如果您想要一个数据表中的所有检查项目,您可以在 for 循环之前创建数据表并将新数据添加到该数据表:

    DataTable dtBig = new DataTable();
    foreach (ListItem selecteditem in CheckPreviousTxn.CheckedItems)
    {
       con = new SqlConnection(connectionpath);
       cmd = new SqlCommand("select QTNCode as 'QTN Code',STKCODE as 'Item Code',STKDESCP as 'Item Name',Quantity,BaseUnit as 'Unit',Rate,DiscountAmount as 'Discount',Amount,VatPercentage as 'VAT %',TotalTaxAmount as 'VAT Amt' from Tbl_QTNDetail where QTNCode ='" + selectedItem.ToString()+ "'", con);
       SqlDataAdapter da = new SqlDataAdapter(cmd);
       DataTable dt = new DataTable();
       da.Fill(dt);
       dtBig.Add(dt);
  }
  GrdQtnDetail.DataSource = dtBig;

或者你可以试试sql中的in子句,这对性能更好:

string[] items = CheckPreviousTxn.CheckedItems.OfType<object>().Select(item => item.ToString()).ToArray();
string resultItems = string.Join("','", items);
con = new SqlConnection(connectionpath);
cmd = new SqlCommand("select QTNCode as 'QTN Code',STKCODE as 'Item Code',STKDESCP as 'Item Name',Quantity,BaseUnit as 'Unit',Rate,DiscountAmount as 'Discount',Amount,VatPercentage as 'VAT %',TotalTaxAmount as 'VAT Amt' from Tbl_QTNDetail where QTNCode IN ('" + resultItems+ "')", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
GrdQtnDetail.DataSource = dt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2011-01-30
    相关资源
    最近更新 更多