Разница в OnClick для ImageButton внутри GridView и обычного ImageButton

Я работаю над проектом ASP.NET/C#, и у меня есть элемент управления GridView. Одним из столбцов является TemplateField/ItemTemplate с кнопкой ImageButton внутри. Во время события OnClick я делаю панель видимой. Когда вы делаете это с обычным ImageButton, страница перезагружается и панель видна. Этого не происходит с моим ImageButton внутри GridView. Кто-нибудь знает, как я могу это сделать, или почему это так?

Спасибо за ваше время, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

Вот соответствующее определение жереха

<asp:TemplateField ItemStyle-Width="90px"  ItemStyle-VerticalAlign ="Bottom" ItemStyle-HorizontalAlign ="Center" HeaderText="Add Alias">
                <HeaderStyle Font-Bold="True" Font-Size="11px" VerticalAlign="Bottom"/>
                    <ItemTemplate>
                        <asp:ImageButton ID ="btnAddAliasHeader" runat="server" ImageUrl="~/img/AddAlias.gif" onclick="btnAddAlias_Click" />
                 </ItemTemplate>
                </asp:TemplateField>

А вот C# для функции OnClick.

protected void btnAddAlias_Click(object sender, EventArgs e)
{
    ImageButton btnAddAlias = (ImageButton)sender;
    GridViewRow row = (GridViewRow)btnAddAlias.Parent.Parent;
    int rowIndex = row.RowIndex;

    lblSelectedCity.Text = gvResults.Rows[rowIndex].Cells[0].Text;
    lblSelectedCountry.Text = ddlCountry.Text;
    pnlAddAlias.Visible = true;

}

Я добавил событие OnRowCommand и сделал панель видимой, но она все равно не отображается. Я думаю, что это может быть как-то связано с обратной передачей, потому что, если я затем нажму кнопку за пределами вида сетки, при перезагрузке тогда панель с кнопкой внутри вида сетки будет отображаться нормально.

Изменить: я идиот и не учел, что все это происходит в панели обновления.

5 ответов

Buttons, ImageButtonс и LinkButtonс не стреляют Click события, когда они находятся в шаблоне управления, как вы описываете. (Изменить: если не используется с OnClick свойство элемента управления) Вместо этого содержащий элемент управления запускает событие, в случае GridView это RowCommand событие. Использовать CommandName а также CommandArgument Свойства вашей кнопки для определения правильного действия в обработчике событий, как показано ниже:

Разметка:

<asp:LinkButton ID="LinkButton1" runat="server" CommandName="DoStuff" CommandArgument='<%# Eval("RecordID") %>' Text="DoStuff"></asp:LinkButton>

Код:

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
    If e.CommandName = "DoStuff" Then
        'Do something with e.CommandArgument'
    End If
End Sub

Вы можете использовать Oncommand Event для gridview, а не использовать Onclick для перкулярного элемента управления, только вы должны передать имя команды из элемента управления и проверить его по e.commandname и делать все, что захотите

Я предполагаю, что ваше событие не запускается - вы должны использовать атрибут имени команды в кнопке изображения - и забрать его в onrowcommand вида сетки - или зарегистрировать событие нажатия кнопки image в событии onrowcreated.

Если обратная связь не нужна. Извините, если я неправильно понял вопрос. Вместо кнопки изображения (серверный элемент управления) можно использовать ссылку или обычное изображение, заключенное в тег и jQuery. Это предотвратит обратную передачу на сервер. Надеюсь это поможет.

<a href="#" id="viewPanel">Click to View Panel</a>

$("#<%=viewPanel.ClientID%>").click(function(e)
{
    e.preventDefault();
    $("#id_of_panel").show();

});

Надеюсь это поможет.

Кнопки / кнопки изображений внутри контейнера, такие как представление сетки (просмотр списка, повторитель и т. Д.), Имеют событие щелчка, связанное с самим контейнером. Чтобы сделать панель видимой, вам нужно использовать имя кнопки и свойства аргумента команды на кнопке, а затем использовать событие OnRowCommand в gridview для отображения панели

НТН

Другие вопросы по тегам