ASP.NET GridView SelectedIndexChanged未在异步回发

时间:2016-04-12 21:04:11

标签: c# asp.net ajax asynchronous gridview

我在这个问题上看过很多论坛主题;但似乎没有人能解决这个问题。我在更新面板中有一个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 **
}

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

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

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

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

因为我有ChildrenAsTriggers =&#34; True&#34;,我知道这是不必要的,但无论如何我都要尝试。

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不在更新面板中,这对于完全回发非常有效。不幸的是,我需要回发是异步的。

如果有人对正在发生的事情有所了解,如果您能分享它们将会非常感激。谢谢!

注意:列中包含&#39;选择&#39;按钮不是一个可接受的解决方案(显然我在问这个问题之前就已经知道了)。行必须自己可以点击。

1 个答案:

答案 0 :(得分:0)

这是一种方法:

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

    <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);
        }
    }