簡體   English   中英

異步回發時未觸發ASP.NET 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不在更新面板中,則此方法非常適合完整回發。 不幸的是,我需要回發是異步的。

如果有人對正在發生的事情有任何想法,可以共享這些想法將不勝感激。 謝謝!

注意:使用帶有“選擇”按鈕的列是不可接受的解決方案(顯然,我在問這個問題之前就知道這一點)。 這些行必須自己可以單擊。

這是一種實現方法:

  1. 將其中帶有“ Select按鈕的TemplateField列添加到GridView中
  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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM