更新面板 - 文本框TextChanged事件正在干扰DropDown SelectedIndexChanged事件

时间:2010-10-20 15:06:24

标签: asp.net ajax asp.net-ajax updatepanel

基础:

  • 我有一个人们可以的文本框(txtDepositAmount) 输入存款金额和a 下拉(ddlSelectedTerm)设置术语。
  • 通过这两个值我计算 APY(lblCurrentApy)。

规则:

  • 如果只选择了其中一个值,我仍想对当前的APY标签进行更新并清除它。
  • 如果有任何值更改,我想更新当前的APY并重新计算。

问题:

只要我从文本框中单击并在下拉列表中选择我的术语,下拉就会闪烁并关闭,因为文本框TextChanged事件刚刚被触发。

我必须再次点击下拉列表才能选择任何内容!

我是否需要更改我正在查看的事件或是否需要将一些控件移到UpdatePanel之外?只有在某些业务规则发生变化时才会发生这种情况吗?我应该放弃并转到javascript吗?

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <table width="100%">
            <tr>
                <td align="left" style="width: 10%" class="LineAlign">
                    &nbsp;
                </td>
                <td align="left" style="width: 40%" class="LineAlign">
                    <asp:Label ID="lblDollarSymbol" runat="server" Text="$"/> 
                    &nbsp;
                    <asp:TextBox ID="txtDepositAmount" runat="server"
                     AutoPostBack="true" TabIndex="1" MaxLength="14" 
                     ontextchanged="txtDepositAmount_TextChanged"/>
                </td>
                <td align="left" style="width: 30%" class="LineAlign">
                    <asp:DropDownList ID="ddlSelectedTerm" runat="server" 
                     AutoPostBack="true" TabIndex="2"
                     onselectedindexchanged="ddlSelectedTerm_SelectedIndexChanged">
                    </asp:DropDownList>
                </td>
                <td align="center" style="width: 20%">
                    <asp:Label ID="lblCurrentApy" runat="server"/>
                    &nbsp;
                    <asp:Label ID="lblPercentSymbol" runat="server" Text="%"/>
                </td>
            </tr>
        </table>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlSelectedTerm" />
        <asp:AsyncPostBackTrigger ControlID="txtDepositAmount" />
    </Triggers>
</asp:UpdatePanel>

3 个答案:

答案 0 :(得分:0)

文本框上的

autopostback =“true”导致了这种情况,因为两个控件在离开文本框后都会重新加载。我怀疑只要它们在同一个UpdatePanel中就有办法避免这种情况。

也许您可以在文本框启动的回发后将焦点设置到下拉列表,或者您可以通过将控件放在单独的UpdatePanel中来实现此功能。但实际上这似乎是错误的方式。我会使用javascript(如果逻辑很复杂则使用ajax)来更新APY。或者只是添加一个“计算”按钮......

(编辑) 这是一个稍微丑陋的黑客,以避免ajax,三个更新面板,仍然能够做你的逻辑服务器端。我不赞成这种方法,但它很快而且很脏。

将包含计算结果的Label控件放在UpdatePanel中。输入控件不需要在UpdatePanel中。

在更新面板中(带结果)有一个隐藏的提交按钮:

    <asp:Button ID="DoCalculate" style="display:none;" UseSubmitBehavior="false"
 runat="server" OnClick="Recalculate()" />

这应该是UpdatePanel的触发器。然后让你的两个输入控件使用javascript单击该按钮,以导致部分回发到“结果”面板。以下是为下拉列表添加此javascript的代码,例如Page_Load

    ddSelectedTerm.Attributes.Add("onSelectedIndexChanged",
"document.getElementByID('" + DoCalculate.ClientID + "').Click()");

然后输入C#代码进行计算,并在“Recalculate()”方法中更新第二个更新面板中的标签。

这应该可行,并且使用3个更新面板为您提供更好的布局控制和更少的代码流程丑陋。

答案 1 :(得分:0)

您可以在服务器事件中使用Focus()。例如,如果您有txtBox1和txtBox2,并希望在第1个框中写入内容并在更新面板中写入内容后将焦点放在框2中。

只进入方框1的TextChange事件并写入txtBox2.Focus(),并在更新面板后,焦点将位于方框2中。:)

希望有帮助...

答案 2 :(得分:0)

我撕掉了UpdatePanel,只是做了jquery。微软。