首页 > 解决方案 > 如何将 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>
                        &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();
    }
}

标签: c#asp.net

解决方案


好吧,真的应该推迟将值传递到下一页,直到您有一个工作简单的答案来选择/获取您单击的给定行,对吗?

是转发器、网格视图、列表视图(详细信息视图)等?

在 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 推入会话,从而将该行的所有值传递到您跳转到的页面。


推荐阅读