【问题标题】:Get Row Number of an Order ID in Gridview using VB.Net使用VB.Net在Gridview中获取订单ID的行号
【发布时间】:2021-07-11 08:30:08
【问题描述】:

我需要在 Gridview 中显示特定 orderID 的行号。我希望将其存储为会话变量:

session("rownum"0)

但是,作为一个初学者,我对如何根据 QueryString 中的 OrderID 检查 Guid OrderID 感到有些困惑。我需要将其更改为标签吗?我收到了错误:

System.NullReferenceException: Object reference not set to an instance of an object.

任何帮助表示赞赏。

<asp:SqlDataSource ID="DSOrders" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" SelectCommand="SELECT     TOP (100) PERCENT tblOrders.OrderID, tblOrders.stallmessage, tblOrders.price, tblAccounts.city, tblAccounts.postcode, tblAccounts.phoneNumber, tblOrders.orderDate, tblOrders.orderStatus, tblOrders.type, tblOrders.timeFor, tblOrders.paid, tblOrders.tblNo
    FROM tblOrders INNER JOIN
        tblAccounts ON tblOrders.accountID = tblAccounts.AccountID
    WHERE tblOrders.orderStatus='Completed'
        ORDER BY tblOrders.orderDate ASC">
</asp:SqlDataSource>

<asp:GridView ID="gdvOrders" width="100%" runat="server"ShowHeaderWhenEmpty="True" EmptyDataText="No orders" AllowPaging="True" AutoGenerateColumns="False" CssClass="mGrid" DataKeyNames="orderID" DataSourceID="DSOrders" PageSize="20" AllowSorting="True">
    <AlternatingRowStyle CssClass="alt" />
    <Columns>    
        <asp:BoundField DataField="orderID" HeaderText="OrderID" />
.
.
    </Columns>
</asp:GridView>

VB.NET

session("rownum")=0

For Each r As GridViewRow in gdvOrders.Rows
    If r.RowType = DataControlRowType.DataRow Then 
        Dim orderID As Label
        orderID = r.Cells(0).FindControl("orderID") 
        If orderID.text = Request.Querystring("orderID")
            session("rownum") = session("rownum") + 1
        End If
    End If
Next r

【问题讨论】:

  • 你能告诉我你在这段代码的哪一行得到了异常吗?
  • @Ale865 If orderID.text = Request.Querystring("orderID")
  • 我猜orderID为null,这意味着没有找到与r.Cells(0).FindControl("orderID")的控件
  • @Arsen gridview 显示里面有数据所以我不明白。

标签: asp.net vb.net gridview


【解决方案1】:

我通过使用 TemplateField 来完成这项工作:

        <asp:GridView ID="gdvOrders" width="100%" runat="server" style="font-size:1.5em" ShowHeaderWhenEmpty="True" EmptyDataText="No orders" AllowPaging="True" AutoGenerateColumns="False" CssClass="mGrid" DataKeyNames="orderID" DataSourceID="DSOrders" PageSize="20" AllowSorting="True">
            <AlternatingRowStyle CssClass="alt" />
            <Columns>    
                <asp:TemplateField HeaderText="OrderID">
                    <ItemTemplate>
                        <asp:Label ID="lblOrderID" text='<%# Eval("orderID").ToString %>' runat="server" ></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

【讨论】:

    【解决方案2】:

    通过使用 FindControl,您只能通过 ID 值获得控制权,如 docs 中所述:

    在当前命名容器中搜索带有 指定id参数。

    所以我认为您想要获取行文本值,而不是控制文本

    Dim orderID = r.Cells(0).Text 
    If orderID = Request.Querystring("orderID")
        session("rownum") = session("rownum") + 1
    

    【讨论】:

    • 可能是我的错,但您将 String 类型值分配给 Label 类型对象。在他的代码中,orderID 是一个标签。
    • @Ale865 这里orderID 必须是string 类型变量,谢谢提及
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2017-08-26
    • 2019-09-08
    • 2021-07-19
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多