У меня есть текстовое поле availableItemsFilterTextBox, предназначенное для предоставления данных фильтрации для представления сетки availableItemsGridView.
<asp:TextBox runat="server" ID="availableItemsFilterTextBox" AutoPostBack="True"
OnTextChanged="availableItemsFilterTextBox_TextChanged"></asp:TextBox>
Представление сетки availableItemsGridView находится внутри:
- UpdatePanel и с UpdateMode, установленным на «Conditional» и Trigger, установленным на событие TextChanged,
и TabControl с AutoPostBack = "true"
<ajaxToolkit:TabContainer runat="server" ID="patternTabContainer" ActiveTabIndex="0" AutoPostBack="false" OnActiveTabChanged="Tabs_ActiveTabChanged"> <ajaxToolkit:TabPanel runat="server" ID="availableItemsTabPanel" meta:resourcekey="itemSelectionPanelResource"> <ContentTemplate> <asp:UpdatePanel ID="availableItemsUpdatePanel" runat="server" UpdateMode="Conditional"> <Triggers> <asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" /> </Triggers> <ContentTemplate> <asp:Panel ID="Panel1" runat="server" ScrollBars="Auto" Style="max-height: 400px; margin: 5px 5px 5px 5px;"> <asp:GridView ID="availableItemsGridView" runat="server" CssClass="dataGrid" ShowHeaderWhenEmpty="True" DataKeyNames="skuid,sku_desc,cat_desc,cls_desc" UseAccessibleHeader="False" AutoGenerateColumns="False" EmptyDataText="No data available qwe123." AllowPaging="True" AllowSorting="True" OnPageIndexChanging="availableItemsGridView_PageIndexChanging" OnSorting="availableItemsGridView_Sorting">
Когда текст изменяется в availableItemsFilterTextBox, нет разницы, как - он теряет фокус или нажимается Enter, обратная передача выполняется дважды, а событие TextChanged также запускается дважды.
На панели обновлений определен триггер
<asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" />
В firebug я вижу пару запросов. первый из них находится в состоянии «Прервано»
Я экспериментировал с самой страницей, установив AutoEventWireup="false"
и разместив неявный вызов «Page_Load» в теге формы <form id="form2" runat="server" onload="Page_Load" >
. Я подумал, что это могло быть причиной двойной обратной передачи. Но безуспешно ...
Я попытался сохранить текстовое значение текстового поля в ViewState во время первой обратной передачи, а затем сравнить его со значением из viewState. Но, к сожалению, я понял, что между первой и второй обратной передачей я теряю данные из состояния просмотра.
Я попытался проделать тот же трюк с помощью сеанса.
string vsFilter = (string)Session[AvailableItemsFilterTypes_Text];
if (vsFilter != filter)
{
Session.Add(AvailableItemsFilterTypes_Text, filter);
this.LoadAvailableItems();
}
Но это только предотвращает загрузку данных, поскольку первый обратный вызов загружает данные, а затем прерывается без отрисовки. И вторая обратная передача не может вызвать LoadAvailableItems ();
Внутри LoadAvailableItems () я использую OracleAdapter, и мне нужно вызвать хранимую процедуру с выходным параметром OracleDbType.RefCursor
. И чтобы включить сортировку и разбиение на страницы availableItemsGridView, мне нужно получить представление данных из набора данных. А затем привяжите его к availableItemsGridView. Насколько я понял, SqlDataSource недостаточно совместим для работы с Oracle ...
DataView dataview = availableItemsDataSet.Tables[0].DefaultView;
//dataview is required only to specify sorting
dataview.Sort = sortExpression + sortDirection;
availableItemsGridView.DataSource = dataview;
availableItemsGridView.PageIndex = NewPageIndex;
availableItemsGridView.DataBind();
Пожалуйста, помогите мне решить эту головоломку. Я не могу понять, почему я получаю событие TextCahnged twise и как и где прерывается первый запрос обратной передачи?