textbox两次触发TextChanged事件,并且在第一次回发状态中止时回发twise

时间:2012-11-15 12:10:09

标签: c# asp.net postback textchanged

我有一个文本框 availableItemsFilterTextBox ,其目的是为网格视图 availableItemsGridView 提供过滤数据。

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

网格视图 availableItemsGridView 位于:

  1. 一个UpdatePanel,UpdateMode设置为“Conditional”和Trigger 设置为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">
    
  3. 当在availableItemsFilterTextBox中更改文本时,没有区别 - 如何失去焦点或按下Enter,回发发生两次,事件TextChanged也会触发两次。

    更新面板已定义触发器

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

    在萤火虫中,我可以看到几个请求。其中第一个处于“中止”状态

    我已经通过设置AutoEventWireup="false"并在表单标记<form id="form2" runat="server" onload="Page_Load" >中对“Page_Load”进行隐式调用来尝试页面本身。我在想这可能是两次回发的原因。但没有成功......

    我试图在第一次回发期间在ViewState中保存文本框Text值,然后将其与viewState中的值进行比较。但不幸的是,我发现在第一次和第二次回发之间,我从viewstate中丢失了数据。

    我尝试使用会话制作相同的技巧。

                    string vsFilter = (string)Session[AvailableItemsFilterTypes_Text];
                if (vsFilter != filter)
                {
                    Session.Add(AvailableItemsFilterTypes_Text, filter);
    
                    this.LoadAvailableItems();
                }
    

    但是这只会阻止数据加载,因为第一次回调加载数据然后在没有渲染的情况下中止。第二个回发被阻止调用LoadAvailableItems();

    Inside 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以及第一个回发请求如何以及在哪里被中止?

1 个答案:

答案 0 :(得分:0)

我建议使用Web方法并使用jQuery调用它们。你会看到更好的表现并避免双回发。

这是一个很好的例子: http://weblogs.asp.net/craigshoemaker/archive/2008/11/07/using-jquery-to-call-asp-net-ajax-page-methods-by-example.aspx