如何使用Session在GridView当前行上保存值,以将其复制到TextBox中? -VB.Net

问题描述

我正在尝试使用Session记录要在另一个Web From中使用的当前行第一列的数据,该Web From将使用{{1 }}。

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

作为参考,这是Session的设计,由于它们不相关,因此删除了大多数行:

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> 属性TemplateField。有了它,我创建了子目录:

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 可以将我定向到下一个Web窗体。但是现在,在测试过程中,当我使用Response.Redirect("~/CaseLog.aspx")时,在子项的LinkButton行上出现错误

LinkButton

代码是否可保存,还是需要重做?

谢谢。

解决方法

似乎按钮事件选择未连接的行。

我会这样说:

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

请注意我们如何在上面放置CommandName =“ Select”。如果您不这样做,那么所选行就不会正确出现在您的点击事件中。

您可以在链接按钮上尝试按照上面的方法执行select命令,但是我只是使用上面的方法。现在,以desinger形式突出显示网格。在属性表上,转到事件,然后双击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

请非常小心如何设置事件代码存根-事件args与您的不同。 因此,您可以在现有代码中尝试使用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>
            

因此我们有这个:

enter image description here

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

因此,我们在上面所做的/是让CommandArguemnt PASS选定的行值-该值将通过ok,因此我们不在乎选定的索引事件不会触发(并且通过更改命令参数)而不是“选择”,则实际上不会触发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将在编辑时提供选项列表。例如:

enter image description here

因此,这使我们有机会连接(添加)标准点击事件)。不需要选定的索引代码存根(因为无论如何该按钮都会在选定的索引之前触发)。因此,我们现在手动连接此事件。因此,我们不会使用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获取数据。

因此,您可以很好地转储选定的索引更改事件。您只需要传递行索引,然后从中进行工作。因此,代码存根可以walk狗,在会话中设置值,甚至可以通过参数传递/创建URL。