asp.net - 如何使用 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: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。
推荐阅读
- python - SQL:您如何在仅参考给定年份的月份的情况下每月平均数据?
- pandas - 根据时间删除行
- mysql - MySQL存储过程使用参数变量消耗1:8倍
- kubernetes - Kubernetes HPA 无法从 Stackdriver 检测到成功发布的自定义指标
- angular - Angular - GraphQL - 突变(大对象)
- postgresql - 当键不存在时,为什么postgresql会计算重复键?
- arrays - 在 while 循环中将非顺序值传递给存储过程。数组到存储过程
- javascript - 脚本代码不在 foreach 循环中运行?
- javascript - 通过映射数组需要帮助
- javascript - 使用滑块更改两个块的宽度比例