多选AspxListBox后仅加载最后项数据?AspxGridView循环取数问题
解决AspxListBox多选后仅加载最后一项数据的问题
问题原因
你的代码存在两个核心问题导致多选时只显示最后一项数据:
- 多次绑定GridView:循环处理每个选中项时,每次执行SQL后立刻将DataTable绑定到GridView,后面的绑定会直接覆盖前面的结果。
- DataTable数据被覆盖:如果
FillDataTable方法是清空现有DataTable再填充新数据,那么每次查询都会清除之前的结果,最终只剩最后一项的数据。
推荐解决方案:一次性查询所有选中项(性能更优)
通过收集所有选中项,构建带参数的IN查询,一次性从数据库获取所有数据,最后统一绑定到GridView,减少数据库交互次数。
Protected Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click Dim dt As New DataTable Dim myconn As New clsConnection Dim selectedItems As New List(Of String) ' 收集所有选中项的文本 For Each item As ListEditItem In lBoxItem.Items If item.Selected Then selectedItems.Add(item.Text) End If Next ' 如果没有选中项,清空GridView If selectedItems.Count = 0 Then grdViewItems.DataSource = Nothing grdViewItems.DataBind() Return End If ' 构建带参数的IN查询语句 Dim paramPlaceholders As String = String.Join(", ", selectedItems.Select(Function(i, idx) $"@Item{idx}")) Dim strSelect As String = $"SELECT ID, Description, Qty, Remark FROM table_1 WHERE itemString IN ({paramPlaceholders})" ' 为每个选中项添加对应参数 For idx As Integer = 0 To selectedItems.Count - 1 myconn.AddParameter($"@Item{idx}", MySqlDbType.String) myconn.SetParameter($"@Item{idx}", selectedItems(idx)) Next Try myconn.OpenConnection() myconn.FillDataTable(dt, strSelect) ' 统一绑定所有数据到GridView grdViewItems.DataSource = dt grdViewItems.DataBind() Catch ex As Exception ' 可添加异常日志记录逻辑 Finally myconn.CloseConnection() myconn.ClearAllParameter() End Try End Sub
备选解决方案:循环累加数据(适合需逐个处理选中项的场景)
如果必须逐个查询每个选中项,可通过临时DataTable存储单次查询结果,合并到主DataTable后,最后统一绑定。
Protected Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click Dim dt As New DataTable Dim myconn As New clsConnection For Each item As ListEditItem In lBoxItem.Items If item.Selected Then Dim strItem As String = item.Text Dim strSelect As String = "SELECT ID, Description, Qty, Remark FROM table_1 WHERE itemString = @ItemString" myconn.AddParameter("@ItemString", MySqlDbType.String) myconn.SetParameter("@ItemString", strItem) Try myconn.OpenConnection() Dim tempDt As New DataTable myconn.FillDataTable(tempDt, strSelect) ' 将单次查询结果合并到主DataTable If tempDt.Rows.Count > 0 Then dt.Merge(tempDt) End If Catch ex As Exception ' 异常处理逻辑 Finally myconn.CloseConnection() myconn.ClearAllParameter() End Try End If Next ' 循环结束后统一绑定数据 If dt.Rows.Count > 0 Then grdViewItems.DataSource = dt grdViewItems.DataBind() Else grdViewItems.DataSource = Nothing grdViewItems.DataBind() End If End Sub
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

