Как сослаться на кнопку ссылки, которая находится внутри asp:grid, когда она нажата

У меня есть ASP:grid, у которого есть кнопка ссылки, мне нужно как-то сослаться на это в коде, когда он нажат, но я борюсь с синтаксисом

Вот мой ASP: Grid. Мне нужно выполнить код в коде позади, когда эта кнопка ссылки «Повторно взять» нажата, а также иметь возможность узнать, на какую строку она была нажата, поскольку мне нужно будет ссылаться на электронные письма и имя пользователей, а затем отправьте электронное письмо с соответствующей информацией....

<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>

Если кто-то может помочь мне с фрагментом, я был бы очень признателен.


person Code Ratchet    schedule 05.05.2012    source источник
comment
Нет, просто помогите со ссылкой на событие нажатия кнопки ссылки, я сделал код для электронной почты и т. д.   -  person Code Ratchet    schedule 05.05.2012


Ответы (4)


Вы можете подойти к этому немного иначе. Видите ли, когда элемент управления помещается внутрь gridview, любое событие, вызванное этим элементом управления, также вызывает RowCommand в GridView.

Чтобы получить то, что вы хотите, вы можете добавить CommandName и CommandArgument в свой LinkButton, а затем поймать его в RowCommand GridView.

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

где myObjectID — это имя столбца идентификатора вашего объекта, к которому вы привязываете сетку.

потом

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

person MUG4N    schedule 05.05.2012

FindControl должно работать в этом случае.

protected void GrdViewUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        HyperLink myHyperLink = e.Row.FindControl("Edit") as HyperLink;
    }
}
person sarwar026    schedule 05.05.2012
comment
Привет, спасибо за фрагмент, нет ли события щелчка, похожего на то, как вы делаете обычное событие щелчка для кнопки? - person Code Ratchet; 05.05.2012

Во-первых: у вас есть повторяющиеся идентификаторы в ваших полях TemplateField, такие как lblUsername, что не разрешено, поскольку это один и тот же NamingContainer.

Вы можете передать RowIndex как CommandArgument в RowCommand:

на аспкс:

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

Обработайте RowCommand GridView:

  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?
    }
  }  
person Tim Schmelter    schedule 05.05.2012
comment
я сделал вышеописанное, но когда я нажимаю кнопку ссылки, страница просто мигает и не переходит к коду команды grdviewuser_row? - person Code Ratchet; 05.05.2012
comment
Iv добавляет onrowcommand=GrdViewUsers_RowCommand в asp:grid, затем я добавляю CommandArgument=‹%# ((GridViewRow) Container).RowIndex %›› мне нужно что-то изменить в этом? поскольку я не уверен на 100%, я затем добавил фрагмент GridViews RowCommand в свой код позади, когда я запускаю и ставлю точку останова в коде, ничего не происходит, страница просто обновляется ........ - person Code Ratchet; 05.05.2012
comment
@ScottAtkinson: это должно работать, если вы добавили обработчик rowcommand в разметку gridview (как вы сказали выше). Привязываете ли вы данные GridView при загрузке страницы при обратных передачах? Вы должны сделать это, только если !Page.IsPostback. - person Tim Schmelter; 05.05.2012
comment
когда страница загружается в первый раз, она привязывается, но код, который вы мне дали, когда я ставлю точку останова внутри этого колодца на if (e.commandname == Edit), он не попадает в нее, это то, что у меня есть в моем загрузка страницы protected void Page_Load (отправитель объекта, EventArgs e) { if (!IsPostBack) { BuildGrids(); } } builddgrids — это то место, где я привязываю данные к grdViewUSers, но снова прохожу через событие загрузки страницы, и все? - person Code Ratchet; 05.05.2012
comment
@Scott: Нет, насколько я могу судить, ничего плохого. Я не знаю, почему RowCommand не уволен. Будет ли это работать, если вместо этого вы обработаете событие щелчка LinkButton? Вы получаете ссылку на GridViewRow через var row = (GridViewRow)((LinkButton)sender).NamingContainer; - person Tim Schmelter; 06.05.2012
comment
Хм, я поиграю с этим и посмотрю, что на самом деле идет не так - person Code Ratchet; 06.05.2012

Предположим, в сетке есть кнопка-ссылка, по которой мы хотим получить индекс строки.

 <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

   }
}
person Adil    schedule 05.05.2012