【问题标题】:ASP.NET GridView SelectedIndexChanged not fired on async postbackASP.NET GridView SelectedIndexChanged 未在异步回发时触发
【发布时间】:2016-08-03 16:47:08
【问题描述】:

我看过很多关于这个问题的论坛主题;但在我的情况下似乎没有人能解决它。我在更新面板中有一个 GridView,它在行单击时触发异步回发 - 这部分正在工作。但是,在异步回发期间,即使回发通过 Page_Load、RowDataBound 等,也不会调用 SelectedIndexChanged 事件处理程序 - 除了 SelectedIndexChanged 之外的几乎所有事件处理程序。

请参考下面我的makrup:

<asp:UpdatePanel ID="Panel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="True">
    <ContentTemplate>
        <asp:GridView ID="GridView" runat="server" AllowSorting="True" OnRowDataBound="OnRowDataBound" OnSorting="OnSorting" AutoGenerateColumns="True" OnSelectedIndexChanged="OnSelectedIndexChanged" ></asp:GridView>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="outsideControl1" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="outsideControl2" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>

以及背后的代码:

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(Panel, "Select$" + e.Row.RowIndex);
  }
}

protected void OnSelectedIndexChanged(object sender, EventArgs e)
{
    // ** Do stuff here **
}

我可以看到添加了属性“onclick”,因为只要单击任何行,GridView 就会触发异步回发。问题是永远不会调用事件处理程序 OnSelectedIndexChanged。关于为什么要进行部分回发,我已经没有想法了;但导致它的事件无法识别。

以下是我尝试过的一些解决方案,但显然不起作用:

1.) 将 GridView 添加为异步回发触发器:

<asp:AsyncPostBackTrigger ControlID="GridView" EventName="SelectedIndexChanged" />

由于我有 ChildrenAsTriggers="True",我知道这是不必要的,但我还是必须尝试。

2.) 将 GridView 添加为完整的回发触发器:

<asp:PostBackTrigger ControlID="GridView" EventName="SelectedIndexChanged" />

仍然没有工作,我也不想要这种行为。

3.) 将行数据绑定中的属性语句修改如下:

e.Row.Attributes["onclick"] = "__doPostBack('" + this.UniqueID + "$" + GridView.ID + "', 'Select$" + e.Row.RowIndex + "')";

这进行了完整的回发而不是部分回发,并且仍然没有调用 SelectedIndexChanged。

4.) 尝试将事件从 SelectedIndexChanged 更改为 SelectedIndexChanging 甚至 RowCommand(只要我可以捕获调用行)...但它们都没有被调用。

请注意,如果 GridView 不在更新面板中,这对于完整回发非常有效。不幸的是,我需要异步回发。

如果有人对正在发生的事情有任何想法,如果您能分享它们,将不胜感激。谢谢!

注意: 有一个带有“选择”按钮的列是不可接受的解决方案(显然我在问这个问题之前就知道这一点)。这些行本身必须是可点击的。

【问题讨论】:

    标签: c# asp.net ajax asynchronous gridview


    【解决方案1】:

    这是一种方法:

    1. 向 GridView 添加一个带有 Select 按钮的 TemplateField 列
    2. RowDataBound中,隐藏按钮单元格并将按钮的CommandArgument设置为行索引
    3. 在行的onclick事件中,模拟点击隐形按钮

    标记:

    <asp:GridView ID="GridView" runat="server" AllowSorting="True" OnRowDataBound="OnRowDataBound" OnSorting="OnSorting" AutoGenerateColumns="True" OnSelectedIndexChanged="OnSelectedIndexChanged" >
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button ID="btnSelect" runat="server" CommandName="Select" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    代码隐藏:

    protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        // Hide cell with the display style, not with the Visible property
        e.Row.Cells[0].Style["display"] = "none";
    
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Button btnSelect = e.Row.FindControl("btnSelect") as Button;
            btnSelect.CommandArgument = e.Row.RowIndex.ToString();
            e.Row.Attributes["onclick"] = string.Format("document.getElementById('{0}').click();", btnSelect.ClientID);
        }
    }
    

    【讨论】:

    • 感谢您的回复。你的想法非常合乎逻辑。但是,当我尝试它时,它仍然无法正常工作。这适用于完整回发,但异步回发中的某些内容由于某种原因避免调用 GridView 的事件处理程序。与我之前的示例一样,该行会触发部分回发,但不会调用事件处理程序。我什至尝试让按钮可见并直接单击它们作为测试,但结果相同。
    • 在我自己的测试中,它与 UpdatePanel 配合得很好。调用 SelectedIndexChanged 事件处理程序,其他事件处理程序也是如此。
    • 它似乎应该像你描述的那样工作。我当前的设置现在非常复杂,所以可能有一些东西阻止它正常工作。此时,我只是寻求解决方法,因为我已经落后于截止日期。为您的回答 +1,但我希望其他人可以确认这一点以供将来参考。
    • 您可以创建一个简单的项目并测试此解决方案。如果它有效(就像在我的测试项目中一样),您可以逐步修改该项目,直到它与您的真实项目相匹配,并一路查看问题出现的地方。
    • 你是对的,我在一个空项目中测试了它,它可以工作。对我来说不幸的是,我现有的项目现在太复杂了,听从你的建议会适得其反。很高兴知道您的方法有效。今后我会牢记这一点,谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多