组特定 Filed in Gridview : Aspx web with Vb coding data from SQL DB

Group specific Filed in Gridview : Aspx web with Vb coding data from SQL DB

提问人:Baiju 提问时间:7/24/2023 最后编辑:joeljpaBaiju 更新时间:7/25/2023 访问量:46

问:

我有一个带有 VB.NET 和 SQL Web 的页面,其中我有一个网格视图,其中是一个公共列,它有多行。.aspxLPR_NO

我只想在网格视图中对LPR_NO进行分组。但是当我尝试时,出现了一个错误,并要求按组位输入所有子句。但这不是我的要求。

我的查询代码

SELECT 
    LP_ION.Originator, LP_ION.Originator_ID, LPR_No,  
    Product, LP_ION.AU, LP_ION.Qty_Req, 
    LP_ION.Qty_Issue, LP_ION.Qty_NA, LP_ION.Status AS ION_Status    
FROM 
    LP_ION 
GROUP BY 
    LPR_NO, Product, LP_ION.Originator,
    LP_ION.Originator_ID, LP_ION.AU, LP_ION.Qty_Req, 
    LP_ION.Qty_Issue, LP_ION.Qty_NA, LP_ION.Status

我得到的输出是这样的:

output is like this from the above code

我只想被分组。请指导我。LP_ION

asp.net vb.net gridview

评论

0赞 Hursey 7/24/2023
不确定我是否真的遵循了这个问题。也许您可以参考如何提问并稍微更新您的问题

答:

0赞 Albert D. Kallal 7/25/2023 #1

首先,该 GridView 示例不是将该 SQL 示例提供给 GridView 时得到的。发布的 GridView 屏幕截图在一行上显示 2 个值,这不是 GridView 的正常工作方式。

因此,您必须在此处遗漏一些重要的代码和细节。

简单的问题是 GridView 只能呈现 SQL 生成的最后一行数据。GridView 没有任何用于对此类数据进行分组的规定。

因此,这里的解决方案将要求开发人员通过编写一些代码来构建、制作和创建自己的分组解决方案。

这里有几种方法可以使用。

可以使用转发器,向该转发器提供所需的组的“列表”,然后在转发器内部嵌套 GridView。因此,对于每个组,将呈现一个全新的 GridView 对象。这在处理方面相当昂贵,因为对于每个分组,都需要一个全新的 SQL 查询,并且将呈现一个全新的 GridView。因此,对于少数群体来说,这是一个可能的解决方案。对于许多组和数据来说,这往往意味着处理成本太高,并且需要对每个组进行全新的 SQL 查询。

另一种方法是在行创建事件时将一个全新的行“注入”到 GridView 中。这同样可以做到,但代码相当复杂且难以编写。

对于简单的数据分组?然后我建议采用 ListView。

因此,这意味着转储 GridView 的使用。您可以允许向导为您创建和布局基本的 ListView。然后简单地删除所有生成的模板,只保留“项模板”部分。

或者,您可以使用以下标记,并根据需要进行修改。

那么,解决方案和过程呢?

删除 SQL 中的分组,因为它对此解决方案没有帮助。

只需按最上面的组对数据进行排序,然后按每个组内部所需的任何内容进行排序。 例: 一个简单的酒店列表,我们想要按每个城市进行分组。

因此,SQL 数据源如下所示:

 SELECT * FROM tblHotelsA ORDER BY City, HotelName

因此,我们按最上面的组(城市)排序,然后按 HotelName 对每个组进行排序,如上所述。

现在,当 City 值更改时,我们只需在 ListView 中“隐藏”或“显示”分组行。

虽然 ListView 的标记比 GridView 更“更多”,但 ListView 的选择比 GridView 更好,因为我们可以轻松地隐藏/显示额外的“分组行”,这就是为什么 ListView 在这里成为更好的选择。

因此,我们的标记:

<asp:ListView ID="ListView1" runat="server" >
    <ItemTemplate>
        <tr id="MyGroupHeading" runat="server" 
            style="background-color:black;color:white" >
            <td colspan="4">
                <asp:Label ID="lCity" 
                    runat="server" 
                    Text='<%# "Hotels For city = " & Eval("City") %>' />
            </td>
        </tr>
        <tr>
            <td><asp:Label ID="lFirst" runat="server" Text='<%# Eval("FirstName") %>' /></td>
            <td><asp:Label ID="lLast" runat="server" Text='<%# Eval("LastName") %>' /></td>
            <td><asp:Label ID="lHotel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
            <td><asp:Label ID="lDescript" runat="server" Text='<%# Eval("Description") %>' /></td>
        </tr>
    </ItemTemplate>

    <LayoutTemplate>
        <table id="itemPlaceholderContainer" runat="server" border="0" 
            class="table" style="width:40%" >
            <tr runat="server" style="">
                <th runat="server" style="width:90px">First Name</th>
                <th runat="server" style="width:90px">Last Name</th>
                <th runat="server">Hotel Name</th>
                <th runat="server">Hotel Description</th>
            </tr>
            <tr id="itemPlaceholder" runat="server">
            </tr>
        </table>
    </LayoutTemplate>
</asp:ListView>

因此,请注意我们如何为模板定义两个“tr”行。(ListView 的额外优势是每条记录可以有不止一行!

因此,向 ListView 发送数据的代码如下:

Dim strMyGroup As String

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If IsPostBack = False Then
        loadGrid()
    End If

End Sub

Sub loadGrid()

    strMyGroup = ""

    Dim strSQL As String =
         "SELECT * FROM tblHotelsA ORDER BY City, HotelName"

    ListView1.DataSource = MyRst(strSQL)
    ListView1.DataBind()

End Sub

注意:在页面类级别关闭上述变量 strMyGroup。因此,当 City 列更改时,我们将不得不编写代码来隐藏或显示分组行。

这样的代码相当简单。

因此:

Protected Sub ListView1_ItemDataBound(sender As Object, e As ListViewItemEventArgs) Handles ListView1.ItemDataBound

    If e.Item.ItemType = ListViewItemType.DataItem Then

        Dim strNewGroup = DirectCast(e.Item.FindControl("lCity"), Label).Text


        Dim MyTr As HtmlTableRow = e.Item.FindControl("MyGroupHeading")
        If strNewGroup <> strMyGroup Then
            ' a new group - 
            strMyGroup = strNewGroup
            MyTr.Visible = True
        Else
            MyTr.Visible = False
        End If

    End If

End Sub

生成的输出是按城市分组的酒店列表。

enter image description here

为了完整起见,我使用了一个非常方便的全局 MyRst 例程,该代码仅返回一个基于 SQL 的数据表。

因此:

Public Function MyRst(strSQL As String) As DataTable

    Dim rstData As New DataTable
    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
            rstData.TableName = strSQL
        End Using
    End Using
    Return rstData
End Function