gpt4 book ai didi

c# - 文本框两次触发 TextChanged 事件并两次回发,第一次回发状态中止

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:44 38 4
gpt4 key购买 nike

我有一个文本框availableItemsFilterTextBox,目的是为 GridView availableItemsGridView提供过滤数据。

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

GridView 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,回发发生两次,事件 TextChanged 也触发两次。

更新面板已定义触发器

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

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

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

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

我尝试使用 session 来实现同样的技巧。

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

this.LoadAvailableItems();
}

但这只会阻止数据加载,因为第一次回调加载数据然后在未呈现的情况下中止。第二次回发被阻止调用 LoadAvailableItems();

在 LoadAvailableItems() 内部,我正在使用 OracleAdapter 并且必须调用输出参数为 OracleDbType.RefCursor 的存储过程并启用排序和分页 availableItemsGridView 我必须从数据集中获取数据 View 。然后将其绑定(bind)到 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 事件,以及第一个回发请求如何以及在何处中止?

最佳答案

我建议使用 Web 方法并使用 jQuery 调用它们。您将看到更好的性能并避免双重回发。

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

关于c# - 文本框两次触发 TextChanged 事件并两次回发,第一次回发状态中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13397282/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com