ASP.NET C#实现单个GridView绑定两个ListBox值的技术问题
解决单个GridView绑定两个ListBox值的问题
嘿,我来帮你搞定这个绑定的问题!先看看你现有代码里的几个小问题:
- 第二段代码用字符串拼接SQL,这可是高危的SQL注入风险,绝对不能这么写,得换成参数化查询。
- 你在循环里每次调用
da.Fill(dt1),这会清空之前DataTable里的数据,最后只能拿到最后一次查询的结果,逻辑不对。 - 手动添加行之后又Fill数据库数据,会导致DataTable里的行重复或者结构混乱。
下面分两种常见场景给你正确的实现方式:
场景1:两个ListBox的选中项一一对应(比如ListBox1是菜单,ListBox2是对应成本)
如果你的两个ListBox是关联的,选中项数量一致,直接把它们的选中项对应添加到DataTable即可:
// 先准备好要绑定的DataTable,包含两列 DataTable dt = new DataTable(); dt.Columns.Add("Menu", typeof(string)); dt.Columns.Add("Cost", typeof(string)); // 先判断两个ListBox的选中项数量是否匹配 if (ListBox1.SelectedItems.Count == ListBox2.SelectedItems.Count) { // 一一对应添加行 for (int i = 0; i < ListBox1.SelectedItems.Count; i++) { DataRow dr = dt.NewRow(); dr["Menu"] = ListBox1.SelectedItems[i].Text; dr["Cost"] = ListBox2.SelectedItems[i].Text; // 要是用Value属性就改成.Value dt.Rows.Add(dr); } } else { // 如果数量不匹配,这里可以做个兼容处理,比如分别添加所有选中项 foreach (ListItem item in ListBox1.SelectedItems) { DataRow dr = dt.NewRow(); dr["Menu"] = item.Text; dr["Cost"] = ""; // 空值或者默认提示 dt.Rows.Add(dr); } foreach (ListItem item in ListBox2.SelectedItems) { DataRow dr = dt.NewRow(); dr["Menu"] = ""; dr["Cost"] = item.Text; dt.Rows.Add(dr); } } // 最后绑定到GridView GridView1.DataSource = dt; GridView1.DataBind();
场景2:成本需要从数据库根据ListBox1的选中项查询
如果你是要从数据库查选中菜单的成本,那得用参数化查询来保证安全,同时避免数据被覆盖:
DataTable dt = new DataTable(); dt.Columns.Add("Menu", typeof(string)); dt.Columns.Add("Cost", typeof(string)); // 用using自动管理数据库连接,避免资源泄漏 using (con) { con.Open(); foreach (ListItem lst in ListBox1.Items) { if (lst.Selected) { DataRow dr = dt.NewRow(); dr["Menu"] = lst.Text; // 参数化查询,彻底避免SQL注入 string strQuery = "SELECT cost FROM menu where name = @MenuName"; SqlCommand cmd = new SqlCommand(strQuery, con); // 这里要注意:如果ListBox的Value绑定的是数据库的name字段,就用lst.Value,否则用lst.Text cmd.Parameters.AddWithValue("@MenuName", lst.Value); // 执行查询获取成本,处理空值情况 object costResult = cmd.ExecuteScalar(); dr["Cost"] = costResult != DBNull.Value ? costResult.ToString() : "0.00"; dt.Rows.Add(dr); } } } GridView1.DataSource = dt; GridView1.DataBind();
几个小提醒:
- 确保你的数据库连接
con是正确初始化的(比如从Web.config读取连接字符串)。 - 调整
@MenuName对应的参数值(lst.Value或lst.Text),要和数据库里的name字段匹配。 - 如果要同时把ListBox2的其他选中项也加到GridView里,只需要给DataTable多加一列,然后遍历ListBox2的选中项添加即可。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

