2012-11-15 61 views
2

我有一個文本框availableItemsFilterTextBox,其目的是爲網格視圖availableItemsGridView提供過濾數據。文本框火災中止

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

網格視圖availableItemsGridView置於內:

  1. 一個UpdatePanel並用的UpdateMode設置爲 「條件」 和觸發 設置爲TextChanged事件,
  2. 和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"> 
    

當文本beeing在availableItemsFilterTextBox中改變時,沒有區別 - 它是否失去焦點或Enter被按下,回發發生兩次,並且事件TextChanged也觸發兩次。

更新面板觸發定義

<asp:AsyncPostBackTrigger ControlID="availableItemsFilterTextBox" EventName="TextChanged" /> 

在Firebug我可以看到夫婦的請求。其中第一個處於「中止」狀態

我已經通過設置AutoEventWireup="false"並將隱式調用置於表單標記<form id="form2" runat="server" onload="Page_Load" >中的「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是不兼容的與甲骨文工作...

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以及如何以及在哪裏和第一次回發請求beeing中止?

+0

我進一步的研究表明,從文本框雙回發是它在Firefox和IE中只有一個回發的行爲... – adikas

回答