在Checkedlistbox中获取名称ForEach Checked项目

时间:2014-02-24 09:59:47

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

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

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();

1 个答案:

答案 0 :(得分:2)

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

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<string>作为收集选定状态的更便捷方式。
  • 将DISTINCT添加到SELECT以过滤重复的条目。
  • 在命令文本中使用了一个参数,以避免SQL注入攻击。虽然这种使用带有IN子句的参数的方式适用于SQL Server,但我还没有检查它是否也适用于Access数据库。如果不起作用,请在评论中告诉我。