我如何传递ItemTemplate值到另一个页面?



欢迎各位开发人员。我是ASP的新手。. NET c#如果我遗漏了一些地方请原谅/

当前在我的项目中,我有这个Gridview -在那里我使用了"TemplateField"对于几乎所有数据字段。我的问题是,我不知道如何将值传递到另一个页面。我尝试使用SESSION,但不幸的是,它不工作。我也尝试使用BOUNDFIELD,它的工作,但它不满足我的项目要求作为BOUNDFIELD的默认设置是文本框,我希望它是一个下拉列表控件,而不是。任何善意的建议将不胜感激。以下是我的代码。

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>
&nbsp;
<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按钮,如果想-没关系),你需要那个按钮来触发/设置/移动/导致你正在工作的行改变第一和之前,你试图从给定的行抓取数据/值。

这样做的方法是添加一个特殊的命令。如前所述,这适用于列表视图/grivdview/repeater和更多的数据绑定控件。

所以你在这里学到的东西可以应用到几乎任何数据感知控制(重复数据)。

那么,将这个添加到项目模板中的一个链接按钮中:

<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton3" runat="server"
CommandName = "MyJump"
CommandArgument = '<%# Eval("Category") %>'
>Select</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>

因此,当您添加CommandName="Select"时,这将导致网格的两个事件被触发。

OnRowComand:

将触发行命令事件。但是,这一行还没有改变!

然而,既然我们使用了commandparameter并传递了"category",那么我们当然可以使用rowcommand事件,并获取commandparameter的值。

所以,你可以把这段代码放在行命令事件中:

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

请注意,我们不需要(您可以删除)该按钮的on-click事件-您使用行命令事件存根,并选择您传递的自定义命令名称(MySelect)。

还可以触发所选行的事件。这将允许你使用/keep/让你现有的代码为你的按钮点击存根。

但是你现在必须从"你的自定义"中更改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。父(这将是网格单元格,父将再次返回一行,因为你有。由此,您可以从该行获取任何值。

,

dim myLable as label
myLabel = gvRow.FindControl("Label1")
debug.print myLabel.Text (should return catagory).

可能最简单的方法就是添加一个CommandArgument,然后从发送者处获取。

现在您首先验证了您有正确的值,然后您可以将该值推入会话。实际上,您甚至可以将整个gvRow插入到会话中,从而将该行的所有值传递给您跳转到的页面。

最新更新