テキスト ボックス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 キーを押すか、ポストバックが 2 回発生し、イベント TextChanged も 2 回発生します。
更新パネルにはトリガーが定義されています
<asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" />
firebug では、いくつかのリクエストを見ることができます。それらの最初は「中止」状態にあります
AutoEventWireup="false"
フォームタグで「Page_Load」への暗黙的な呼び出しを設定して配置することにより、ページ自体を実験しまし<form id="form2" runat="server" onload="Page_Load" >
た。それが2回のポストバックの理由かもしれないと思っていました。しかし成功せず…
最初のポストバック中にテキストボックスのテキスト値をViewStateに保存してから、viewStateの値と比較しようとしました。しかし、残念なことに、最初と 2 番目のポストバックの間にビューステートからデータが失われることがわかりました。
セッションを使用して同じトリックを作成しようとしました。
string vsFilter = (string)Session[AvailableItemsFilterTypes_Text];
if (vsFilter != filter)
{
Session.Add(AvailableItemsFilterTypes_Text, filter);
this.LoadAvailableItems();
}
ただし、これはデータの読み込みを妨げるだけです。最初のコールバックでデータが読み込まれ、レンダリングされずに中止されるためです。そして、2 番目のポストバックは 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 イベントを 2 回受け取る理由と、最初のポストバック要求がどのように、どこで中止されているのか理解できません。