【问题标题】:How can I pass ItemTemplate value to another page?如何将 ItemTemplate 值传递到另一个页面?
【发布时间】:2021-01-28 02:26:08
【问题描述】:

问候开发人员。我是 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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2014-06-12
      • 2014-04-17
      相关资源
      最近更新 更多