首页 > 解决方案 > 如何使用 Session 保存 GridView 当前行的值,复制到 TextBox 中?- VB.Net

问题描述

我正在尝试使用Session记录当前行第一列的数据,以便在另一个 Web From 中使用,该 Web From 将LinkButton使用GridView.

基本上,如果我单击LinkButton第 1 行的 ,则第 1 行的第 1 列数据将被复制到下一个 Web 窗体。但在我这样做之前,我想做一个小规模的实验来测试它。因此,现在我希望将数据以相同的形式Session复制到 a中。TextBox

作为参考,这里是 的设计GridView,大多数行被删除,因为它们不相关:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    BorderColor="Black" BorderStyle="Solid" BorderWidth="1px" Font-Names="Arial">
    <AlternatingRowStyle BackColor="#B7DBFF" />
    <Columns>

        <asp:BoundField DataField="caseticket" HeaderText="Ticket #" >
                <HeaderStyle BackColor="#000066" ForeColor="White" Wrap="False" width="10%"/>
                <ItemStyle Wrap="False" />
        </asp:BoundField>
                                                                
        <asp:TemplateField ShowHeader="False">
            <HeaderStyle BackColor="#000066" ForeColor="White" Wrap="False" width="10%"/>
            <ItemTemplate>
                <asp:linkbutton ID="newLog" runat="server" onclick = "CaseLog_click" >Add Log </asp:linkbutton>
            </ItemTemplate>
        </asp:TemplateField>

    </Columns>
    <HeaderStyle BackColor="#000066" />
    <RowStyle HorizontalAlign="Center" />
</asp:GridView>

For theTemplateField是一个LinkButton带有onclick属性的。有了它,我创建了子:

Sub CaseLog_click(ByVal sender As Object, ByVal e As EventArgs)

    Session("ticket") = GridView1.SelectedRow.Cells(1).Text
    'Response.Redirect("~/CaseLog.aspx")  ==> will be using this to proceed to next Web Form
    TextBox1.Text = Session("ticket")    '==> For test use only.

End Sub

如果我只保留Response.Redirect("~/CaseLog.aspx")sub 中的,LinkButton可以将我引导到下一个 Web 表单。但就像现在一样,在测试期间,当我使用sub 时LinkButton出现错误session

Object reference not set to an instance of an object.

代码是否可以挽救,还是我需要重做?

谢谢。

标签: asp.netvb.net

解决方案


看起来选择行的按钮事件没有连接。

我会这样说:

<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:ButtonField CommandName="Select"  HeaderText="Select" ShowHeader="True" Text="Button" />

请注意我们如何将 CommandName="Select" 放在上面。如果您不这样做,则所选行不会正确地出现在您拥有的点击事件中。

您可以按照上面的链接按钮尝试选择命令,但我只会使用上面的。现在,在表单设计器中突出显示网格。在属性表上,转到事件,然后双击 SelectedIndex Change 事件。因此,您的按钮没有正确更改所选索引。

代码存根将如下所示:

 Protected Sub GridView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GridView1.SelectedIndexChanged

    Dim lgridrow As GridViewRow = Me.GridView1.SelectedRow

    Debug.Print("<" & lgridrow.Cells(0).Text & ">")
    Debug.Print("<" & lgridrow.Cells(3).Text & ">")

    Debug.Print("<" & Me.GridView1.SelectedRow.Cells(3).Text & ">")


End Sub

注意非常小心如何设置事件代码存根 - 事件参数与您的不同。因此,您可以在现有代码中尝试 CommandName="Select",但如果没有,请尝试上面的按钮字段,而不是您拥有的自定义 asp.net 按钮。就目前而言,它看起来不像您的 asp.net 按钮正在触发行更改事件。

编辑和跟进:

我可以有额外的按钮 - 运行他们自己的代码吗?

是的你可以。您可以通过多种方式执行此操作(一种是选择在 SelectedIndex 更改事件中单击了哪个按钮。

或者,您可以插入额外的按钮并使用该事件代码存根。

因此,在我的示例中,让我们添加一个额外的按钮。

我们现在有这个:

       <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
            <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
            <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
            <asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
            <asp:ButtonField CommandName="Select"  HeaderText="Select" ShowHeader="True" Text="Button" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server"   OnClick="LinkButton1_Click"
                        CommandName="MySelect" CommandArgument  ="<%# Container.DisplayIndex %>"
                        style="background-color:gray;color:white;text-decoration:none;padding-left:6px;padding-right:6px"
                        text="Mybutton"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
            

因此,我们有这个:

在此处输入图像描述

现在,我们可以附加/拥有额外按钮的按钮代码。但请注意,我们没有使用内置的 SELECT 命令参数。原因是,如果我们有 Command=select,那么选定的索引将触发,但在我们的按钮代码存根之后。这意味着我们不能使用 selectedrow(太早)。

因此,我们在上面所做/所做的是让 CommandArguemnt PASS 选定的行值 - 该值将通过,因此我们不在乎选定的索引事件不会触发(并且通过将我们的命令参数更改为 NOT “ select",那么实际上 selectedindexchange 事件不会触发。

结果,我们在命令参数中使用了传递的行,我们为按钮代码提供了这个:

Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)

    Dim ixrow As Integer = sender.CommandArgument

    Debug.Print(Me.GridView1.Rows(ixrow).Cells(0).Text)

End Sub

请注意,当我们编辑标记时,intel-sense 会在编辑时给出一个选项列表。例如这个:

在此处输入图像描述

所以,这让我们有机会连接(添加)一个标准的点击事件)。不需要选定的索引代码存根(因为无论如何按钮都会在选定索引之前触发)。所以我们现在手动连接这个事件。因此,我们没有使用 selectedindex 更改事件 - 我们甚至不需要它。

所以,现在在我们的按钮存根中,我们可以自由地做任何我们想做的事情——包括跳转到另一个页面

例如:

Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)

    Dim ixrow As Integer = sender.CommandArgument

    Debug.Print(Me.GridView1.Rows(ixrow).Cells(0).Text)
    Session("HotelName") = Me.GridView1.Rows(ixrow).Cells(3)
    Response.Redirect("~/ShowHotelDetails.aspx")

End Sub

因此,要添加单独的代码按钮:不要使用选定的索引更改事件 - 您可能仍然希望它运行,但它会在您的按钮代码之后运行/触发(因此不能使用 selectedrow - 太早了)。

但是,您确实需要 Command="myjunk" 因为没有命令,则命令参数不起作用。通过在命令参数中传递行索引,我们可以按照上面的代码通过行索引自由地从 gridview 中获取数据。

因此,您可以很好地转储选定的索引更改事件。您只需要传递行索引,然后从它开始工作。因此,代码存根可以遛狗、在会话中设置值,甚至可以传递/制作带有参数的 url。


推荐阅读