如何从数据库检索数据到CheckedListBox并将项目设置为已选中?

时间:2015-05-12 04:35:46

标签: c# sql-server wpf foreach checkedlistbox

我是WPF的新手。我正在尝试从数据库加载值以填充CheckedListBox。根据条件,在checkedlistbox中加载时,必须设置一些项目以进行检查。 这该怎么做?我已尝试过以下代码,项目已加载到CheckedListBox,但未检查。 下面是加载到检查列表框的值

    public void fillcheck()
    {
        con = new SqlConnection(connectionstring);
        con.Open();
        string comboquery = "SELECT [Machine] FROM Department Where active='True'";
        SqlCommand cmd = new SqlCommand(comboquery, con);
        SqlDataReader rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            string fil1 = rdr.GetString(0);
            Checkedlistbox1.Items.Add(fil1);
        }
        rdr.Close();

     }




    int departmentID=60//for just refer
   Object[] jobs = CheckedlistBox1.Items.Cast<Object>().ToArray();
   foreach (Object obj in jobs)
   {
    string query = "SELECT [Machine] FROM Department Where ID='" + departmentID+ "'";
  SqlCommand cmd = new SqlCommand(query, con);
  SqlDataReader rdr = cmd.ExecuteReader();
   while(rdr.Read())
   {
    string mac = rdr.GetString(0);//Here i get two values(XRAY,CT)but finally shown CT only be checked,so how to do both checked
    if (mac == obj.ToString())
    {
      int indexx = CheckedlistBox1.Items.IndexOf(mac);
      if (indexx >= 0)
      {
        CheckedlistBox1.SetItemChecked(indexx, true);
       }
    }
  }
  rdr.Close();
 }

2 个答案:

答案 0 :(得分:2)

您需要将SqlDataReader rdr内容传输到DataTable。这将帮助您获得包含多行的DataTable对象,如您所述。

现在进行下一步,您可以在foreach对象上应用DataTable来迭代其所有行,如下所示:

foreach(DataRow dr in dt.Rows)
{
   if(yourCondition)
   {
      //set isChecked = true for the checkbox.
   }
}

更新:

尝试像这样修改while循环:

while (rdr.Read())
{
   string mac = rdr.GetString(0);
   ListItem li = new ListItem();
   li.Value = "yourBindedValue";// some value from database column
   li.Text = "yourBindedText";// use mac if its text.
   int index = Checkedlistbox1.Items.IndexOf(li);
   if (index >= 0)
   {
      Checkedlistbox1.SetItemChecked(index, true);
   }
} 

我测试了这个并且它有效。您只需要传递要在Text对象中找到的CheckBoxListItem的Valueli,并且可以获取索引(如果存在)。确保您传递两个属性。

答案 1 :(得分:0)

你应该使用代码 -

foreach (int indexChecked in chlstBox.Items)

而不是

foreach (int indexChecked in chlstBox.CheckedIndices)

一开始你有0个选定的项目,这就是为什么你的外部for循环不起作用..

编辑 -

基本逻辑也不正确。 你应该遍历数据集,找到checkboxlist中的字符串,然后检查它。因此,不需要外部foreach循环。另外,请确保使用正确的checkboxlist变量。在for循环中,您使用 chlstBox 在搜索时,您正在使用 Checkedlistbox1 ....