如何引用单击时位于 asp:grid 内的链接按钮

本文关键字:grid asp 按钮 链接 何引用 引用 单击 | 更新日期: 2023-09-27 18:33:20

>我有一个带有链接按钮的ASP:grid,我需要在单击时在代码后面引用它,但我在语法上挣扎

这是我的ASP:Grid,当按下链接按钮"Re-Take"时,我需要在代码隐藏中执行代码,并且还能够知道单击了哪一行,因为我需要引用用户的电子邮件和姓名,然后发送包含相关信息的电子邮件....

<asp:GridView ID="GrdViewUsers" runat="server" AutoGenerateColumns="false" GridLines="None"
                    EnableViewState="false" class="tablesorter">
    <AlternatingRowStyle></AlternatingRowStyle>
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton Text="Re-Take" runat="server" ID="Edit" CommandName="Edit"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Full Name">
            <ItemTemplate>
                <asp:HyperLink ID="HyperFullName" CssClass="gvItem" runat="server" NavigateUrl='<%#Eval("UserID","/ExamPaper.aspx?uid={0}") %>'
                    Text='<%# DataBinder.Eval(Container,"DataItem.FullName") %>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Email">
            <ItemTemplate>
                <asp:Label ID="lblSurname" CssClass="gvItem" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Email") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Exam Taken">
            <ItemTemplate>
                <asp:Label ID="lblUsername" CssClass="gvItem" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.ExamTaken") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Date Taken">
            <ItemTemplate>
                <asp:Label ID="lblUsername" CssClass="gvItem" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.DateTaken") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Exam Total">
            <ItemTemplate>
                <asp:Label ID="lblUsername" CssClass="gvItem" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.ExamTotal") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

如果有人可以帮助我提供片段,我将不胜感激

如何引用单击时位于 asp:grid 内的链接按钮

你可以稍微不同一点。您会看到,当控件放置在网格视图中时,从该控件引发的任何事件也会引发 GridView 上的 RowCommand。

为了获得你想要的东西,你可以将CommandName和CommandArgument添加到你的LinkButton,然后在GridView的RowCommand中捕获它。

<asp:LinkButton id="LinkButton1" runat="server" commandName="LinkButtonClicked" commandArgument='Eval("myObjectID")' />

其中 myObjectID 是将网格绑定到的对象的 ID 列的名称。

然后

void GridView1_RowCommand( object sender, GridViewCommandEventArgs e )
{
    if ( e.CommandName == "LinkButtonClicked" )
    {
        string id = e.CommandArgument; // this is the ID of the clicked item
    }
}

请参阅:ASP.net 网格视图:获取链接项的行

在这种情况下FindControl应该可以工作。

protected void GrdViewUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        HyperLink myHyperLink = e.Row.FindControl("Edit") as HyperLink;
    }
}

首先:您的模板字段中有重复的 ID,例如lblUsername不允许的内容,因为它是相同的NamingContainer

您可以将RowIndex作为CommandArgument传递给RowCommand

在 ASPX 上:

<asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton 
           Text="Re-Take" 
           runat="server" 
           ID="Edit" 
           CommandName="Edit"
           CommandArgument="<%# ((GridViewRow) Container).RowIndex %>">
        </asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

处理网格视图的RowCommand

  void GrdViewUsers_RowCommand(Object sender, GridViewCommandEventArgs e)
  {
    if(e.CommandName=="Edit")
    {
        int index = Convert.ToInt32(e.CommandArgument);      
        GridViewRow row = GrdViewUsers.Rows[index];
        // now you can get all of your controls like:
        Label lblSurname = (Label)row.FindControl("lblSurname");
        String email = lblSurname.Text // you noticed that DataItem.Email is bound to lblSurname?
    }
  }  

假设网格有链接按钮,我们想要在其上获取行索引

 <asp:LinkButton ID="lnkbtnAdd " runat="server" CommandName="cmdAdd" ImageUrl="~/Images/add.gif" ></asp:LinkButton>

代码隐藏中,在 OnRowCreated 事件中,我们将网格的行号附加到行的每个按钮,以便在 RowCommand 事件中单击它时将其取回

    protected void gvListing_RowCreated(object sender, GridViewRowEventArgs e)
    {           
        if (e.Row.RowType == DataControlRowType.DataRow)
        {                
          System.Web.UI.WebControls.LinkButton lnkbtnAdd = new System.Web.UI.WebControls.LinkButton();    
                lnkbtnAdd = (System.Web.UI.WebControls.LinkButton)e.Row.FindControl("lnkbtnAdd");                    
                if (lnkbtnAdd != null)
                    lnkbtnAdd .CommandArgument = e.Row.RowIndex.ToString();
         }          
    }

在 RowCommand 事件中,我们将返回当前行索引并设置网格的选定索引

protected void gvListing_RowCommand(object sender, GridViewCommandEventArgs e)
{      
   if (e.CommandName.ToString() == "cmdAdd")
   { 
       int RowIndex = int.Parse(e.CommandArgument.ToString());// Current row
   }
}