问题描述
我正在尝试使用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>
因此我们有这个:
现在,我们可以为附加按钮附加/拥有按钮代码。但是请注意,我们没有对命令参数使用内置的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将在编辑时提供选项列表。例如:
因此,这使我们有机会连接(添加)标准点击事件)。不需要选定的索引代码存根(因为无论如何该按钮都会在选定的索引之前触发)。因此,我们现在手动连接此事件。因此,我们不会使用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。