Updatepanel запускает обратную передачу в gridview

#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 в одном элементе управления