2

テキスト ボックスavailableItemsFilterTextBoxがあります。これは、グリッド ビューavailableItemsGridViewのフィルタリング データを提供することを目的としています。

<asp:TextBox runat="server" ID="availableItemsFilterTextBox" AutoPostBack="True" OnTextChanged="availableItemsFilterTextBox_TextChanged"></asp:TextBox>

グリッド ビューavailableItemsGridViewは次の場所に配置されます。

  1. UpdatePanel で、UpdateMode を「Conditional」に設定し、Trigger を TextChanged イベントに設定し、
  2. および 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 回受け取る理由と、最初のポストバック要求がどのように、どこで中止されているのか理解できません。

4

1 に答える 1

0

Web メソッドを使用し、jQuery を使用して呼び出すことをお勧めします。パフォーマンスが大幅に向上し、二重のポストバックも回避できます。

良い例を次に示します: http://weblogs.asp.net/craigshoemaker/archive/2008/11/07/using-jquery-to-call-asp-net-ajax-page-methods-by-example.aspx

于 2013-01-29T18:26:27.260 に答える