简体   繁体   中英

ASP.NET Gridview ItemTemplate Access in CodeBehind

I am having trouble accessing an asp.NET HiddenField from a Gridview ItemTemplate in the codebehind. I need to be able to read the values that these hiddenfields contain so that I can execute the delete method. The code is as follows

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MemberList.ascx.cs" Inherits="UserControls_MemberList" %>
<asp:RadioButtonList ID="ReportSelect" runat="server" RepeatDirection="Horizontal">
<asp:ListItem Value="1">All</asp:ListItem>
<asp:ListItem Value="2">Current Members</asp:ListItem>
<asp:ListItem Value="3">Perspective Members</asp:ListItem>
</asp:RadioButtonList>
<asp:Button ID="ReportSelectButton" runat="server" OnClick="ReportSelectButton_Click"
Text="Select Report Type" />
<asp:Button ID="LinkToHomePage" runat="server" Text="Back to Homepage" OnClick="LinkToHomePage_Click">
</asp:Button>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" Height="308px"
Width="1282px" onselectedindexchanged="GridView1_SelectedIndexChanged">
<Columns>
    <asp:BoundField HeaderText="First Name" AccessibleHeaderText="FirstName" DataField="FirstName">
    </asp:BoundField>
    <asp:BoundField HeaderText="Last Name" AccessibleHeaderText="LastName" DataField="LastName">
    </asp:BoundField>
    <asp:BoundField HeaderText="Street Address" AccessibleHeaderText="StreetAddress"
        DataField="StreetAddress"></asp:BoundField>
    <asp:BoundField HeaderText="City" AccessibleHeaderText="City" DataField="City"></asp:BoundField>
    <asp:BoundField HeaderText="State" AccessibleHeaderText="State" DataField="State">
    </asp:BoundField>
    <asp:BoundField HeaderText="Zip" AccessibleHeaderText="Zip" DataField="Zip"></asp:BoundField>
    <asp:BoundField HeaderText="Birthday" AccessibleHeaderText="Birthday" DataField="Birthday" />
    <asp:BoundField HeaderText="Email" AccessibleHeaderText="Email" DataField="Email">
    </asp:BoundField>
    <asp:BoundField HeaderText="PrimaryPhone" AccessibleHeaderText="PrimaryPhone" DataField="PrimaryPhone" />
    <asp:BoundField HeaderText="AlternatePhone" AccessibleHeaderText="AlternatePhone"
        DataField="AlternatePhone" />
    <asp:BoundField HeaderText="Pending" AccessibleHeaderText="Pending" DataField="Pending" />
    <asp:BoundField HeaderText="IsMember" AccessibleHeaderText="IsMember" DataField="IsMember" />
    <asp:BoundField HeaderText="Username" AccessibleHeaderText="Username" DataField="Username">
    </asp:BoundField>
    <asp:BoundField HeaderText="Description" AccessibleHeaderText="Descripton" DataField="Description" />
    <asp:TemplateField HeaderText="Edit" AccessibleHeaderText="Edit">
        <ItemTemplate>
            <asp:HyperLink ID="EditUsername" runat="server" NavigateUrl='<%# Link.ToMemberAdmin(Eval("Username").ToString())%>'
                Text="Edit" />
            <asp:Button ID="DeleteButton" runat="server" Text="Delete Entry" OnClick="DeleteButton_Click"/>
            <asp:HiddenField ID="HiddenUsername" Value='<%#Bind("Username") %>' runat="server" />
            <asp:HiddenField ID="HiddenEmail" Value='<%#Bind("Email") %>' runat="server" />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>

CodeBehind

protected void DeleteButton_Click(object sender, EventArgs e)
{
    HiddenField Username = GridView1.FindControl("HidderUsername") as HiddenField;
    HiddenField Email = GridView1.FindControl("HiddenEmail") as HiddenField;
    string username = Username.Value;
    string email = Email.Value;
    AdminAccess.DeleteMemberApplication(username, email);
}

Any help would be greatly appreciated.

The HiddenField controls are going to be part of a <td> which is one of the <tr> the GridView renders. The GridView control's FindControl only knows of it's immediate children and as the Hidden controls are two levels below that, it's not going to find them. Instead, start from the sender and try to find its sibling Hidden controls. Replace the two HiddenControl lines in the event handler as below:

HiddenField Username = (HiddenField) ((Button)sender).Parent.Controls.FindControl("HiddenUsername");
HiddenField Email = (HiddenField) ((Button)sender).Parent.Controls.FindControl("HiddenEmail");

And it should get the values you are looking for to delete the data in that row.

Just use CommandArgument of button

<asp:TemplateField HeaderText="Edit" AccessibleHeaderText="Edit">
    <ItemTemplate>
        <asp:HyperLink ID="EditUsername" runat="server" NavigateUrl='<%# Link.ToMemberAdmin(Eval("Username").ToString())%>'
            Text="Edit" />
        <asp:Button ID="DeleteButton" runat="server" Text="Delete Entry" OnClick="DeleteButton_Click"
            CommandArgument='<%#Eval("Username")+"^"+Eval("Email") %>'/>
    </ItemTemplate>
</asp:TemplateField>

protected void DeleteButton_Click(object sender, EventArgs e)
{
    var btn = sender as Button;
    var args = btn.CommandArgument.Split('^');
    string username = args[0];
    string email = args[1];
    AdminAccess.DeleteMemberApplication(username, email);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM