2016-04-12 3 views
0

Я видел много тем форума по этой проблеме; но никто, кажется, не исправил это в моем случае. У меня есть GridView внутри панели обновления, которая запускает асинхронную обратную передачу при нажатии клавиши - эта часть работает. Однако во время асинхронной обратной передачи обработчик события SelectedIndexChanged никогда не вызывается, даже если postback проходит через Page_Load, RowDataBound и т. Д. - почти все обработчики событий, кроме SelectedIndexChanged.ASP.NET GridView SelectedIndexChanged не запускается после async postback

Пожалуйста, обратитесь к моим 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 как асинхронная Postback Trigger:

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

Так как у меня ChildrenAsTriggers =» Правда », я знал, что это не нужно, но мне все равно пришлось попробовать.

2.) Добавлена ​​GridView как полный Postback Trigger:

<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 не находится в панели обновления. К несчастью, мне нужно, чтобы postback был асинхронным.

Если у кого-то есть идеи о том, что происходит, мы будем очень благодарны, если вы сможете поделиться ими. Благодаря!

Примечание: Наличие столбца с кнопками «Выбор» не является приемлемым решением (очевидно, я знаю это, прежде чем задавать этот вопрос). Строки должны быть интерактивными.

ответ

0

Вот один из способов сделать это:

  1. Добавить в GridView столбец TemplateField с кнопкой Select в нем
  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); 
    } 
} 
+0

Спасибо за ваш ответ. Ваша идея очень логична. Однако, когда я это пробовал, он все равно не работает. Это работает при полной обратной передаче, но что-то в асинхронной обратной передаче позволяет избежать вызова обработчика события GridView по какой-то причине. Как и в предыдущих примерах, строка вызывает частичную обратную передачу, но не вызывает обработчики событий. Я даже пытался сделать кнопки видимыми и нажимать на них как тест, но это приводит к такому же результату. – psApprentice

+0

Он хорошо работает с UpdatePanel в моих собственных тестах. Вызывается обработчик события SelectedIndexChanged, как и другие. – ConnorsFan

+0

Кажется, он должен работать, как вы описали. Моя текущая настройка довольно сложная, так что, вероятно, что-то мешает этому работать так, как должно. В это время я просто пошел к обходному пути, поскольку я отстаю от своего срока. +1 для вашего ответа, но я надеюсь, что кто-то еще сможет подтвердить это для будущей справки. – psApprentice

Смежные вопросы