Я видел много тем форума по этой проблеме; но никто, кажется, не исправил это в моем случае. У меня есть 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 был асинхронным.
Если у кого-то есть идеи о том, что происходит, мы будем очень благодарны, если вы сможете поделиться ими. Благодаря!
Примечание: Наличие столбца с кнопками «Выбор» не является приемлемым решением (очевидно, я знаю это, прежде чем задавать этот вопрос). Строки должны быть интерактивными.
Спасибо за ваш ответ. Ваша идея очень логична. Однако, когда я это пробовал, он все равно не работает. Это работает при полной обратной передаче, но что-то в асинхронной обратной передаче позволяет избежать вызова обработчика события GridView по какой-то причине. Как и в предыдущих примерах, строка вызывает частичную обратную передачу, но не вызывает обработчики событий. Я даже пытался сделать кнопки видимыми и нажимать на них как тест, но это приводит к такому же результату. – psApprentice
Он хорошо работает с UpdatePanel в моих собственных тестах. Вызывается обработчик события SelectedIndexChanged, как и другие. – ConnorsFan
Кажется, он должен работать, как вы описали. Моя текущая настройка довольно сложная, так что, вероятно, что-то мешает этому работать так, как должно. В это время я просто пошел к обходному пути, поскольку я отстаю от своего срока. +1 для вашего ответа, но я надеюсь, что кто-то еще сможет подтвердить это для будущей справки. – psApprentice