0

我有一个 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>

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

4

4 回答 4

1

你可以处理这个略有不同。您会看到,当控件放置在 gridview 中时,从该控件引发的任何事件也会引发 GridView 上的 RowCommand。

要获得您想要的,您可以将 CommandName 和 CommandArgument 添加到您的 LinkBut​​ton,然后在 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 GridView:获取 LinkItem 的行

于 2012-05-05T13:59:06.493 回答
0

假设网格有我们想要获取行索引的链接按钮

 <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

   }
}
于 2012-05-05T13:59:35.977 回答
0

首先:您在 TemplateFields 中有重复的 ID,就像lblUsername不允许的一样,因为它是相同的NamingContainer

您可以将RowIndexas传递CommandArgumentRowCommand

在 aspx 上:

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

处理 GridView 的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?
    }
  }  
于 2012-05-05T14:11:31.107 回答
0

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

protected void GrdViewUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        HyperLink myHyperLink = e.Row.FindControl("Edit") as HyperLink;
    }
}
于 2012-05-05T13:53:42.230 回答