Панель обновления - текстовое поле TextChanged Событие мешает событию DropDown SelectedIndexChanged - PullRequest
1 голос
/ 20 октября 2010

Основа:

  • У меня есть текстовое поле (txtDepositAmount), которое люди могут введите сумму вклада и выпадающий (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 голосов
/ 11 апреля 2011

Вы можете просто использовать Focus () в событии сервера. Например, если у вас есть txtBox1 и txtBox2 и вы хотите, чтобы фокус был в блоке 2 после записи чего-либо в блоке 1, и оба они на панели обновления.

Перейдите только к событию TextChange в блоке 1 и напишите txtBox2.Focus (), и после обновления панели фокус будет в блоке 2.:)

Надежда помогает ...

0 голосов
/ 15 марта 2017

Я разорвал UpdatePanel и только что сделал jquery.Винт Microsoft.

0 голосов
/ 20 октября 2010

autopostback = "true" в вашем текстовом поле вызывает это, так как оба элемента управления перезагружаются после того, как они покидают текстовое поле.Я сомневаюсь, что есть способ избежать этого, если они находятся в одной и той же UpdatePanel.

Возможно, вы могли бы установить фокус на раскрывающийся список после обратной передачи, инициируемой текстовым полем, или вы могли бы сделать это, поместив элементы управления в отдельные UpdatePanels.Но на самом деле это кажется неправильным путем.Я бы использовал 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 #, чтобы выполнить расчет, и обновите метку на 2-й панели обновления вМетод "Recalculate ()".

Это должно сработать и дать вам лучший контроль над макетом и меньше уродства потока кода, чем при использовании 3 панелей обновления.

...