我有一个文本框availableItemsFilterTextBox,其目的是为网格视图availableItemsGridView提供过滤数据。
<asp:TextBox runat="server" ID="availableItemsFilterTextBox" AutoPostBack="True"
OnTextChanged="availableItemsFilterTextBox_TextChanged"></asp:TextBox>
网格视图availableItemsGridView放置在:
- 一个 UpdatePanel,UpdateMode 设置为“Conditional”,Trigger 设置为 TextChanged 事件,
和带有 AutoPostBack="true" 的 TabControl
<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" />
在萤火虫中,我可以看到几个请求。其中第一个处于“中止”状态
我通过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 事件,以及第一个回发请求是如何以及在哪里中止的?