c# - 如何将 ItemTemplate 值传递到另一个页面?
问题描述
问候开发人员。我是 ASP.NET C# 的新手,所以如果我错过了某些领域,请原谅我/
当前在我的项目中,我有这个 Gridview - 我对几乎每个数据字段都使用了“TemplateField”。我的问题是,我不知道如何将值传递到另一个页面。我尝试使用 SESSION 但不幸的是,它不起作用。我也尝试使用 BOUNDFIELD,它可以工作,但它不能满足我的项目要求,因为 BOUNDFIELD 的默认设置是文本框,我希望它改为 DROPDOWN LIST 控件。任何善意的建议将不胜感激。下面附上我的代码。
WebForm1.aspx
<asp:GridView ID="Gridview1" runat="server" AutoGenerateColumns="False" OnPageIndexChanging="Gridview1_PageIndexChanging" OnRowCancelingEdit="Gridview1_RowCancelingEdit" OnRowCommand="Gridview1_RowCommand" OnRowDeleting="Gridview1_RowDeleting" OnRowEditing="Gridview1_RowEditing" OnRowUpdating="Gridview1_RowUpdating" ShowFooter="True" BorderStyle="None" BorderWidth="1px" CellPadding="3" CellSpacing="2" ShowHeaderWhenEmpty="True" Width="100%" CssClass="table table-responsive table-bordered" OnSelectedIndexChanged="Gridview1_SelectedIndexChanged" DataKeyNames="CID">
<Columns>
<asp:TemplateField HeaderText="Transaction ID">
<EditItemTemplate>
<asp:Label ID="lbleditid" runat="server" Text='<%# Bind("CID") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblid" runat="server" Text='<%# Bind("CID") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle CssClass="hidden-xs" />
<ItemStyle CssClass="hidden-xs" />
</asp:TemplateField>
<asp:TemplateField HeaderText="CCID">
<EditItemTemplate>
<asp:Label ID="lblccid2" runat="server"></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblccid" runat="server" Text='<%# Bind("CCID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category" SortExpression="Category">
<EditItemTemplate>
<%--<asp:TextBox ID="txtBox_Cat" runat="server" Text='<%# Bind("Category") %>'></asp:TextBox>--%>
<asp:DropDownList ID="ddlCategory" runat="server" >
<asp:ListItem Value="--Select--">--Select--</asp:ListItem>
<asp:ListItem Value="Transportation">Transportation</asp:ListItem>
<asp:ListItem Value="Children">Children </asp:ListItem>
<asp:ListItem Value="Food">Food</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="ddlCategory1" runat="server">
<asp:ListItem>--Select--</asp:ListItem>
<asp:ListItem>Transportation</asp:ListItem>
<asp:ListItem>Children </asp:ListItem>
<asp:ListItem>Food </asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Category") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Edited">
<EditItemTemplate>
<asp:TextBox ID="txtDateTime1" runat="server" Text='<%# Bind("Last_Edited") %>'></asp:TextBox>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtDateTime" runat="server" ToolTip="DD/MM/YYYY"></asp:TextBox>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="lblDateTime" runat="server" Text='<%# Bind("Last_Edited") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Edit" ShowHeader="False">
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
</EditItemTemplate>
<FooterTemplate>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="true" CommandName="AddNew" Text="Add New"></asp:LinkButton>
</FooterTemplate>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" />
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton3" runat="server" OnClick="PassData">Select</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
WebForm1.aspx.cs
protected void PassData(object sender, EventArgs e)
{
GridViewRow gr = ((sender as LinkButton).NamingContainer as GridViewRow);
Session["Category"] = gr.Cells[1].Text.Trim();
Response.Redirect("AfterUserMthlyExpenses.aspx");
}
WebForm2.aspx
<asp:Label ID="lblPassCategory" runat="server" ></asp:Label>
WebForm2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Passing "Category" from previous page
lblPassCategory.Text = Session["Category"].ToString();
}
}
解决方案
好吧,真的应该推迟将值传递到下一页,直到您有一个工作简单的答案来选择/获取您单击的给定行,对吗?
是转发器、网格视图、列表视图(详细信息视图)等?
在 asp.net 中,它们都遵循相同的过程。您希望该按钮单击设置/移动/更改为您单击的正确给定行。直到您发生“移动”或选择行,然后您将无法尝试从该行中获取值。
所以,看看这个,你有一个链接按钮(如果需要,它可能是一个 asp.net 按钮 - 没关系),你需要那个按钮来触发/设置/移动/导致你正在处理的行改变 FIRST在您尝试从该给定行中获取数据/值之前。
你这样做的方式是添加一个特殊的命令。如前所述,这适用于列表视图/grivdview/repeater 和更多数据绑定控件。
因此,您在这里学到的知识可以应用于几乎任何数据感知控制(重复数据)。
因此,将其添加到项目模板中的一个链接按钮:
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton3" runat="server"
CommandName = "MyJump"
CommandArgument = '<%# Eval("Category") %>'
>Select</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
因此,您添加 CommandName="Select" 的 INSTANT,那么这将导致网格的两个事件触发。
OnRow 命令:
行命令事件将触发。但是这一行还没有改变!
但是,既然我们使用 CommandArgument 并传递“Catagory”,那么我们当然可以使用 rowcomamnd 事件,并获取 CommandArgument 值。
因此,您可以在行命令事件中使用此代码:
Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles GridView1.RowCommand
Debug.Print("row command = " & e.CommandName)
Debug.Print("row arg = " & e.CommandArgument)
If e.CommandName = "MySelect" Then
' do whatever
End If
End Sub
请注意我们不需要(您可以删除)该按钮的单击事件 - 您使用 rowcommand 事件存根,并选择您传递的自定义命令名称(MySelect)。
您还可以触发选定的行事件来触发。这将允许您使用/保留/让您的现有代码单击按钮的存根。
但是,您现在必须将 CommandName 从“您的自定义”名称更改为;
Select (move the grid pointer)
Edit - trigger edit event
Delete - trigger delete event
但是,在您的按钮单击中(就像您现在一样)。
你可以试试这个:
Dim btn As Button = sender
Dim gvRow As GridViewRow = btn.Parent.Parent
Debug.Print("btn row sel = " & gvRow.RowIndex)
Debug.Print("btn argument = " & btn.CommandArgument)
因此,您可以尝试 btn.Parent (这将是网格单元格,并且 parent 再次将返回 ONE 行。从那里,您可以从该行中获取任何值。
例如:
dim myLable as label
myLabel = gvRow.FindControl("Label1")
debug.print myLabel.Text (should return catagory).
可能最容易添加一个 CommandArgument,然后从发件人那里获取它。
既然您首先验证了您的值是否正确,那么您可以将该值推入会话中。事实上,您甚至可以将整个 gvRow 推入会话,从而将该行的所有值传递到您跳转到的页面。
推荐阅读
- javascript - 在服务器文件夹中获取文件名的工作解决方案
- javascript - javascript - 如何模拟时区?
- regex - 我希望使用此代码从区域捕获中仅收集 8 个字符进行过滤
- date - Power BI 日期切片器删除具有空白日期的行,是否可以包含它们?
- vb.net - 无法将参数值从字符串转换为 int32
- python - webdriver.get() 引发 TimeoutException
- elasticsearch - 在 Elasticsearch 中使用数字作为类型
- angular - 我应该为 Angular 5 中的 HTML 中的每个元素编写属性指令吗?
- google-chrome - 有没有办法将 SameSite 属性应用于 .AspNetCore.Correlation cookie?
- angular - 如何在Angular(或一般的Typescript)中提取调用图到特定函数