【问题标题】:Updatepanel trigger postback in gridviewUpdatepanel 在 gridview 中触发回发
【发布时间】:2014-08-21 03:06:22
【问题描述】:

我有下一个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) 时,我想要 回发 更新,但这不起作用。

是否可以在网格视图中的某些事件中获得异步回发,而在其他事件中获得回发?

【问题讨论】:

    标签: asp.net gridview webforms updatepanel postback


    【解决方案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>
    

    当用户点击网格内的任何按钮时,我们必须手动触发 PostBackButtonClick 事件,并传递 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" %> 
    

    是的。这是可能的。

    【讨论】:

    • 好吧,我对你的答案做了一些修改,但这确实很好用。非常感谢!
    【解决方案2】:

    here所说,你可以试试这个

    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnCustomerSearch" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="gvPersons" EventName="PageIndexChanging" />
        <asp:PostBackTrigger ControlID="gvPersons" EventName="SelectedIndexChanging" />
    </Triggers>
    

    【讨论】:

    • System.Web.UI.PostBackTrigger' 没有属性 'EventName'
    • 并且不能在同一个 Control 上注册 AsyncPostBackTrigger 和 PostBackTrigger
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 2011-06-19
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多