【问题标题】:C# - SQL Insert Value and ID of checkbox From CheckboxListC# - SQL 从 CheckboxList 插入复选框的值和 ID
【发布时间】:2017-06-22 10:03:04
【问题描述】:

问题:

我从一个 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;
        }

我已经遍历了“复选框列表”中选择的每个值,并且插入了每个选择的值:

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

如您所见,我目前尝试的只是输入复选框列表中选择的第一个值的 ID。

目标

目的是插入复选框的值,即“名称”以及每个项目的“id”。

研究:

我尝试按照这篇文章将项目放入一个数组中,但最终得到一个“数组超出索引范围”,这导致我进入了第二篇文章。

Pass items from checkboxlist to SQL Server table

Index was out of bounds of array? c# forms

我将不胜感激这方面的任何指导。谢谢。

【问题讨论】:

    标签: c# sql-server checkbox checkboxlist


    【解决方案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; }
        }
    }
    

    希望对你有帮助

    【讨论】:

    • 非常感谢您提供这个广泛而有用的答案。我设法使用字典来处理复选框列表项。
    【解决方案2】:

    我为要放入复选框列表的项目实现了一个字典。这允许我使用复选框项目中的值,然后使用 INSERT 中的键到 SQL DB。

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

    在表单加载时,用字典中的项目填充复选框列表。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      相关资源
      最近更新 更多