2017-06-22 50 views
0

的问题:- C#,SQL插入值和复选框的ID从CheckBoxList的

我填充从SQL表一个复选框列表:

public static List<string> populateCheckBoxes(string type) 
     { 
      List<string> items = new List<string>(); 
      items.Add(""); 

      SqlConnection conn = new SqlConnection(connectionString); 
      SqlCommand sqlcmd; 
      switch (type) 
      { 
       case "referralorsignposting": 
        sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment WHERE type = 'Referral or Signposting' ORDER BY order_no, name", conn); 
        break; 
       case "actionstaken": 
        sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment WHERE type = 'Actions Taken' ORDER BY order_no, name", conn); 
        break; 
       default: 
        sqlcmd = new SqlCommand("SELECT * FROM SWApp_List_Equipment", conn); 
        break; 
      } 
      SqlDataAdapter da = new SqlDataAdapter(sqlcmd); 
      DataTable dt = new DataTable(); 
      da.Fill(dt); 
      foreach (DataRow dr in dt.Rows) 
      { 
       items.Add(dr["name"].ToString()); 
       CheckboxIDRecord = dr["id"].ToString(); 
       //items.Add(dr["VisitTime"] + " " + dr["PropPostcode"]); 
      } 

      return items; 
     } 

我已经通过了在选择的每个值重复“checkboxlist”并插入每个选中的值:

foreach (var item in saw.actionsTakenCheckBoxList) 
       { //ADD ACTIONS AND REFERRAL 
        SqlCommand add = new SqlCommand("INSERT INTO SWApp_CheckboxAnswers (SW_ID, Checkbox_ID, Checkbox_Section, Checkbox_Type, Checkbox_Answer) VALUES(@SW_ID,@Checkbox_ID,@Checkbox_Section,@Checkbox_Type,@Checkbox_Answer) "); 
        add.CommandType = CommandType.Text; 
        add.Connection = sqlcon; 
        add.Parameters.AddWithValue("@SW_ID", ""); 
        add.Parameters.AddWithValue("@Checkbox_ID", ""); 
        add.Parameters.AddWithValue("@Checkbox_Section", ""); 
        add.Parameters.AddWithValue("@Checkbox_Type", ""); 
        add.Parameters.AddWithValue("@Checkbox_Answer", ""); 
        add.Parameters["@SW_ID"].Value = saw.EntryID.ToString(); 
        add.Parameters["@Checkbox_ID"].Value = CheckboxIDRecord.ToString(); 
        add.Parameters["@Checkbox_Section"].Value = "SmokeDetectionReferral"; 
        add.Parameters["@Checkbox_Type"].Value = ""; 
        add.Parameters["@Checkbox_Answer"].Value = item.ToString(); 
        sqlcon.Open(); 
        add.ExecuteNonQuery(); 
        sqlcon.Close(); 
       } 

正如你可以看到我目前试过的只输入第一个v的ID在复选框列表中选择了Alue。

目的

目的是具有插入件是“姓名”及每个项目的也为“id”的复选框的值。

研究:

我尝试下面的这篇文章,把物品放入一个数组,但结束了一个“阵列列的索引范围的”,这使我在第二篇文章。

Pass items from checkboxlist to SQL Server table

Index was out of bounds of array? c# forms

我将不胜感激任何与此指导。谢谢。

回答

0

我实现了一个字典的项目被放置到CheckBoxList的。这使我可以使用复选框项中的值,然后使用INSERT中的键到SQL DB。

Dictionary<string, string> referral = new Dictionary<string, string>(); 

在表单加载填充checkboxlist与词典中的项目。

private void Section3_Load(object sender, EventArgs e) 
     { 
      SqlConnection conn = new SqlConnection(connectionString); 
      SqlCommand cmd = new SqlCommand("select Id, name from SWApp_List_Equipment WHERE type = 'referral or signposting' ORDER BY order_no,name", conn); 
      conn.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 

      if (dr.HasRows) 
      { 
       while (dr.Read()) 
       { 
        referral.Add(dr["id"].ToString(), dr["name"].ToString()); 
       } 
      } 

      foreach (KeyValuePair<string, string> refs in referral) 
      { 
       box = new CheckBox(); 
       box.Text = refs.Value.ToString(); 
       actionsTakenCheckBoxList.Items.Add(box.Text); 
       box.CheckedChanged += new EventHandler(this.CheckedChange); 
      } 
     } 

值插入表格的形式关闭。

private void closeButton_Click(object sender, EventArgs e) 
     { 
    using (SqlConnection sqlcon = new SqlConnection(connectionString)) { 
        //summary 
        foreach (var item in actionsTakenCheckBoxList.CheckedItems.OfType<string>().ToList()) 
        { 

         //ADD ACTIONS AND REFERRAL 
         SqlCommand add = new SqlCommand("INSERT INTO SWApp_CheckboxAnswers (SW_ID, Checkbox_ID, Checkbox_Section, Checkbox_Type, Checkbox_Answer) VALUES(@SW_ID,@Checkbox_ID,@Checkbox_Section,@Checkbox_Type,@Checkbox_Answer) "); 
         add.CommandType = CommandType.Text; 
         add.Connection = sqlcon; 
         add.Parameters.AddWithValue("@SW_ID", ""); 
         add.Parameters.AddWithValue("@Checkbox_ID", ""); 
         add.Parameters.AddWithValue("@Checkbox_Section", ""); 
         add.Parameters.AddWithValue("@Checkbox_Type", ""); 
         add.Parameters.AddWithValue("@Checkbox_Answer", ""); 
         add.Parameters["@SW_ID"].Value = entry.entryID.ToString(); 
         var myKey = referral.FirstOrDefault(x => x.Value == item.ToString()).Key; 
         add.Parameters["@Checkbox_ID"].Value = myKey; 
         add.Parameters["@Checkbox_Section"].Value = "SmokeDetection"; 
         add.Parameters["@Checkbox_Type"].Value = "Referral"; 
         add.Parameters["@Checkbox_Answer"].Value = item.ToString(); 
         sqlcon.Open(); 
         add.ExecuteNonQuery(); 
         sqlcon.Close(); 

        } 
       } 
} 
1

我看到几个问题,而不是试图纠正它们,这是一个如何解决这个问题的建议。

整体图片可以在CheckedListBox和SQL-Server上的MSDN代码示例中看到,其中包含一个用于生成数据库和数据的sql脚本。

https://code.msdn.microsoft.com/Working-with-CheckedListBox-3b765442?redir=0

从上方Operations.cs链路两者,这种方法得到我们的数据(下一个码块填充CheckedListBox)

/// <summary> 
/// Get all records to show in the CheckedListBox 
/// </summary> 
/// <returns></returns> 
public DataTable GetAll() 
{ 
    var dt = new DataTable(); 

    using (SqlConnection cn = new SqlConnection { ConnectionString = ConnectionString }) 
    { 
     using (SqlCommand cmd = new SqlCommand { Connection = cn }) 
     { 
      cmd.CommandText = "SELECT id, Description, Quantity, CheckedStatus FROM Products ---WHERE (Quantity > 0)"; 

      cn.Open(); 
      dt.Load(cmd.ExecuteReader()); 

     } 
    } 

    return dt; 

} 

表格代码

/// <summary> 
/// Load CheckedListBox from database table 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void Form1_Load(object sender, EventArgs e) 
{ 

    var ops = new Operations(); 

    // read data from database table 
    var dt = ops.GetAll(); 

    int LastIndex = 0; 

    /* 
     * Here we iterate the rows in the DataTable while in 
     * CoursesCodeSample I set the DataSource of the CheckedListBox 
     * to the DataTable. The method shown here has always been the 
     * way to go as many indicated that since the DataSource property 
     * of the CheckedListBox is not documented it could go away, well 
     * many years later it's still here so guess what, it's okay. 
     */ 
    foreach (DataRow row in dt.Rows) 
    { 
     checkedListBox1.Items.Add(new CheckListBoxItem() 
     { 
      Description = row.Field<string>("Description"), 
      PrimaryKey = row.Field<int>("id"), 
      Quantity = row.Field<int>("Quantity"), 
      IsDirty = false 
     }); 

     LastIndex = checkedListBox1.Items.Count - 1; 
     checkedListBox1.SetItemChecked(LastIndex, row.Field<bool>("CheckedStatus")); 

    } 

    checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck; 

} 

从Opertions .cs - 插入方法

public void Insert(List<CheckListBoxItem> items) 
{ 
    // optionally used for obtaining new primary key 
    //int newIdentifier; 

    using (SqlConnection cn = new SqlConnection { ConnectionString = ConnectionString }) 
    { 
     using (SqlCommand cmd = new SqlCommand { Connection = cn }) 
     { 
      // uncomment ending select statement and use commented to get new primary key 
      cmd.CommandText = "INSERT INTO Products " + 
       "([Description],Quantity,CheckedStatus) " + 
       "VALUES (@Description,@Quantity,@CheckedStatus); " + 
       "-- SELECT CAST(scope_identity() AS int);"; 

      cmd.Parameters.Add(new SqlParameter() 
       { ParameterName = "@Description", SqlDbType = SqlDbType.NVarChar }); 
      cmd.Parameters.Add(new SqlParameter() 
       { ParameterName = "@Quantity", SqlDbType = SqlDbType.Int }); 
      cmd.Parameters.Add(new SqlParameter() 
       { ParameterName = "@CheckedStatus", SqlDbType = SqlDbType.Bit }); 
      cmd.Parameters.Add(new SqlParameter() 
       { ParameterName = "@CategoryIdentifier", SqlDbType = SqlDbType.Int }); 


      cn.Open(); 

      foreach (CheckListBoxItem item in items) 
      { 
       cmd.Parameters["@Description"].Value = item.Description; 
       cmd.Parameters["@Quantity"].Value = item.Quantity; 
       cmd.Parameters["@CheckedStatus"].Value = item.Checked; 


       //newIdentifier = (int)cmd.ExecuteNonQuery(); 
       if ((int)cmd.ExecuteNonQuery() > -1) 
       { 
        // inserted 
       } 
       else 
       { 
        // failed 
       } 

      } 
     } 
    } 
} 

以上是基本的,注释掉的代码显示(如果需要)如何获得新的主键。

拨打以上

private void iterateButton_Click(object sender, EventArgs e) 
{ 
    var items = new List<CheckListBoxItem>(); 

    for (int index = 0; index < checkedListBox1.Items.Count; index++) 
    { 
     if (((CheckListBoxItem)checkedListBox1.Items[index]).IsDirty) 
     { 
      items.Add(new CheckListBoxItem() 
      { 
       PrimaryKey = ((CheckListBoxItem)checkedListBox1.Items[index]).PrimaryKey, 
       Checked = checkedListBox1.GetItemChecked(index), 
       Description = ((CheckListBoxItem)checkedListBox1.Items[index]).Description 
      }); 
     } 
    } 

    if (items.Count >0) 
    { 
     Ops.Insert(items); 
    } 
} 

最后用来填充CheckedListBox

namespace CheckListBoxFromSQL_Server 
{ 
    public class CheckListBoxItem 
    { 
     /// <summary> 
     /// Identifier for database table 
     /// </summary> 
     public int PrimaryKey; 
     /// <summary> 
     /// Display member for CheckedListBox and a field in the table 
     /// </summary> 
     public string Description; 
     public int Quantity; 
     /// <summary> 
     /// Indicates the checked state in the database table and for setting a Checked item in the CheckedListbox 
     /// </summary> 
     public bool Checked; 
     /// <summary> 
     /// Used to determine if a item changed after loaded in the CheckedListBox 
     /// </summary> 
     public bool IsDirty; 
     public override string ToString() { return Description; } 
    } 
} 

希望这是有益的类中的方法

+0

非常感谢你为这个广泛的,有用的答案。我设法使用复选框列表项目的字典来工作。 –