【发布时间】: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