Разница в 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 ответов
Button
s, 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 для отображения панели
НТН