![](/img/trans.png)
[英]ASP.NET redirect page in gridview selectedindexchanged
[英]ASP.NET GridView SelectedIndexChanged not fired on async postback
我在這個問題上看到了很多論壇主題。 但對於我來說,似乎沒有一個可以解決。 我在更新面板中有一個GridView,它在行單擊時觸發異步回發-這部分正在工作。 但是,在異步回發期間,即使回發通過Page_Load,RowDataBound等,也不會調用SelectedIndexChanged事件處理程序-除了SelectedIndexChanged以外,幾乎所有事件處理程序都將被調用。
請參考以下我的麥芽漿:
<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(只要我可以捕獲調用的Row)……但是都沒有被調用。
請注意,如果GridView不在更新面板中,則此方法非常適合完整回發。 不幸的是,我需要回發是異步的。
如果有人對正在發生的事情有任何想法,可以共享這些想法將不勝感激。 謝謝!
注意:使用帶有“選擇”按鈕的列是不可接受的解決方案(顯然,我在問這個問題之前就知道這一點)。 這些行必須自己可以單擊。
這是一種實現方法:
Select
按鈕的TemplateField列添加到GridView中 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.