【问题标题】:Get Names ForEach Checked item in Checkedlistbox获取 Checkedlistbox 中每个选中项的名称
【发布时间】:2014-03-25 21:54:41
【问题描述】:

我想获取与我在程序中选择的状态相关联的名称。以下是我目前拥有的代码。我的数据库在一个州内有多个位置,这些位置具有不同的联系人。我只想选择一个状态并获得该状态下的每个人。感谢您的帮助!

con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\\Database\\LocNo.accdb");
con.Open();

foreach (Object c in checkedListBox2.CheckedItems)
{
    if (checkedListBox2.GetItemCheckState(checkedListBox2.Items.IndexOf(c)) == CheckState.Checked)
    {
        str1 += c.ToString() + ","; 
        flag = 1;
    }
}

i = 0;
allSelectedtypestring = "";
allSelected = str1.Split(',');


while (allSelected.Length - 1 > i)
{
    str = "select c1 from table where state ='" + allSelected[i++] + "'";
    cmd = new OleDbCommand(str, con);
    dr = cmd.ExecuteReader();

    dr.Read();
    allSelectedtypestring += dr.GetString(11);
}

label30.Text = Convert.ToString(allSelectedtypestring);
con.Close();

【问题讨论】:

  • 如果用户在CheckedListBox中选择了多个项目,你想做什么?您要返回分配给各州的所有联系人的汇总列表,还是要检索一个接一个州的联系人?
  • 好问题,我只想要一个聚合。每个人都在那个状态。以最简单的为准。

标签: c# visual-studio foreach while-loop checkedlistbox


【解决方案1】:

您可以使用以下代码检索联系人:

var states = new List<string>();
foreach (Object c in checkedListBox2.CheckedItems)
{
    states.Add(c.ToString()); 
    flag = 1;  // Can also be substituted by states.Count > 0
}

using(var con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\\Database\\LocNo.accdb"))
{
    con.Open();
    using(var cmd = con.CreateCommand())
    {
        var paramIndex = 0;
        var paramClause = new System.Text.StringBuilder(100);
        foreach(var state in states)
        {
            if (paramClause.Length > 0)
                paramClause.Append(", ");
            paramClause.Append("?");
            var paramName = "State" + (paramIndex++).ToString();
            cmd.Parameters.AddWithValue(paramName, state);
        }
        var paramsClause = string.Join(", ", cmd.Parameters.
        cmd.CommandText = "select distinct c1 from table where state IN (" + paramsClause.ToString() + ")";
        using(var rdr = cmd.ExecuteReader())
        {
            var contacts = new List<string>();
            while(rdr.Read())
            {
                contacts.Add(rdr.GetString(0);
            }
            label30.Text = string.Join(", ", contacts);
        }
    }        
}

请注意,我进行了以下更改:

  • 添加了using 语句以可靠地处理连接、命令和读取器。
  • 使用List&lt;string&gt; 作为收集所选状态的更便捷方式。
  • 为 SELECT 添加了 DISTINCT 以过滤重复条目。
  • 在命令文本中使用了一个参数以避免 SQL 注入攻击。虽然这种使用带有 IN 子句的参数的方式适用于 SQL Server,但我还没有检查它是否也适用于 Access 数据库。如果它不起作用,请在 cmets 中告诉我。

【讨论】:

  • 忽略,这是我的错误。这完美!我要测试更多的东西。谢谢!!
  • 最后一个问题,当我选择超过 1 个状态时,结果为空白。有什么建议吗?
  • @hexc: 可能是 Access 不喜欢我为 IN 提供参数的方式。我已经更新了我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多