我在这个问题上看过很多论坛主题;但似乎没有人能解决这个问题。我在更新面板中有一个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;按钮不是一个可接受的解决方案(显然我在问这个问题之前就已经知道了)。行必须自己可以点击。
答案 0 :(得分:0)
这是一种方法:
Select
按钮的TemplateField列RowDataBound
中,隐藏按钮单元格并将按钮的CommandArgument
设置为行索引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);
}
}