#asp.net #gridview #webforms #updatepanel #postback
#asp.net #gridview #веб-формы #updatepanel #обратная передача
Вопрос:
У меня есть следующий gridview:
<asp:UpdatePanel ID="upCustomer" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnCustomerSearch" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="gvPersons" EventName="PageIndexChanging" />
</Triggers>
<ContentTemplate>
<asp:TextBox ID="txtCode" runat="server" />
<asp:Button ID="btnCustomerSearch" runat="server" Text="Search" OnClick="btnCustomerSearch_Click" />
<asp:GridView ID="gvPersons" runat="server" AutoGenerateColumns="False" AllowPaging="True"
PageSize="10" GridLines="Vertical" EmptyDataText="No results"
ShowHeaderWhenEmpty="True" OnRowDataBound="gvPersons_RowDataBound"
OnPageIndexChanging="gvPersons_PageIndexChanging"
onselectedindexchanging="gvPersons_SelectedIndexChanging">
<Columns>
<asp:BoundField DataField="Personid" />
<asp:BoundField DataField="Name" HeaderText="Nombre" />
<asp:BoundField DataField="Phone" HeaderText="Telefono" />
<asp:BoundField DataField="Email" HeaderText="Email" />
</Columns>
<PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" />
</asp:GridView>
</ContentTemplate>
Мне нужна следующая функциональность:
- Когда я нажимаю btnCustomerSearch, я хочу обновить Ajax (работает)
- Когда я нажимаю разбивку на страницы, я хочу обновить Ajax (работает)
- Когда я нажимаю на строку (gvPersons_SelectedIndexChanging), я хочу получить обратное обновление, но это не работает.
Возможно ли получить обратную отправку asyncpostback в некоторых событиях в gridview и обратную отправку в других?
Ответ №1:
Вставьте кнопку внутри панели обновления и определите для нее PostBackTrigger
<asp:UpdatePanel ID="upCustomer" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
<Triggers>
...
<asp:PostBackTrigger ControlID="PostBackButton" />
</Triggers>
<ContentTemplate>
...
<asp:Button ID="PostBackButton" runat="server" Text="Button" OnClick="PostBackButton_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Вставьте поле TemplateField в свою сетку следующим образом
<Columns>
<asp:TemplateField>
<ItemTemplate>
<input type="button" onclick="javascript:__doPostBack('<%= PostBackButton.ClientID %>',<%# ((GridViewRow)Container).RowIndex %>)" value="Select" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
Когда пользователь нажимает на любую кнопку внутри сетки, нам придется вручную запускать событие Click PostBackButton, передавая RowIndex в качестве аргумента.
На стороне сервера
protected void PostBackButton_Click(object sender, EventArgs e)
{
string argument = Request.Form["__EVENTARGUMENT"];
gvPersons.SelectedIndex = Convert.ToInt32(argument);
}
Теперь нам просто нужно скрыть PostBackButton…
protected void Page_Load(object sender, EventArgs e)
{
// ...
PostBackButton.Style.Add("display", "none");
}
…и отключите проверку события страницы, иначе мы получим исключение ArgumentException, когда пользователь выбирает строку
<%@ Page Language="C#" ... EnableEventValidation="false" %>
ДА. Это возможно.
Комментарии:
1. Ну, я внес некоторые изменения в ваш ответ, но это действительно работает очень хорошо. Большое вам спасибо!
Ответ №2:
Как указано здесь, вы можете попробовать это
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnCustomerSearch" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="gvPersons" EventName="PageIndexChanging" />
<asp:PostBackTrigger ControlID="gvPersons" EventName="SelectedIndexChanging" />
</Triggers>
Комментарии:
1. System.Web.UI.PostBackTrigger’ не имеет свойства ‘eventName’
2. и вы не можете зарегистрировать AsyncPostBackTrigger и PostBackTrigger в одном элементе управления