You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多选AspxListBox后仅加载最后项数据?AspxGridView循环取数问题

解决AspxListBox多选后仅加载最后一项数据的问题

问题原因

你的代码存在两个核心问题导致多选时只显示最后一项数据:

  1. 多次绑定GridView:循环处理每个选中项时,每次执行SQL后立刻将DataTable绑定到GridView,后面的绑定会直接覆盖前面的结果。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:55:37