提问人:Baiju 提问时间:7/24/2023 最后编辑:joeljpaBaiju 更新时间:7/25/2023 访问量:46
组特定 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
问:
我有一个带有 VB.NET 和 SQL Web 的页面,其中我有一个网格视图,其中是一个公共列,它有多行。.aspx
LPR_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
我得到的输出是这样的:
我只想被分组。请指导我。LP_ION
答:
首先,该 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
生成的输出是按城市分组的酒店列表。
为了完整起见,我使用了一个非常方便的全局 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
评论