Проблема с текстовым полем внутри панели обновления - не вызывает событие OnTextChanged - PullRequest
12 голосов
/ 05 мая 2009

У меня следующая ситуация: у меня есть текстовое поле внутри панели обновления ajax. Везде, где пользователь вводит текстовое поле, я должен отображать сообщение (другое сообщение, которое зависит от введенных пользователем данных).

     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
        <ContentTemplate>
            <asp:TextBox ID="txtMyTexbox" runat="server" Width="500px" OnTextChanged="txtMyTexbox_TextChanged" AutoPostBack="true"></asp:TextBox>
            <br />
            <asp:Label ID="lblMessage" runat="server" CssClass="errorMessage" Visible="false">Hello World</asp:Label>
         </ContentTemplate>
            <Triggers>
             <asp:AsyncPostBackTrigger ControlID="txtMyTexbox" />
            </Triggers>
      </asp:UpdatePanel>

На стороне сервера я написал следующее при загрузке страницы

ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(txtMyTexbox);           

и такой метод

protected void txtMyTexbox_TextChanged(object sender, EventArgs e)
    {           
            if (.....)
            {
                lblMessage.Visible = false;
            }
            else
            {
                lblMessage.Visible = true;
            }            
    }

Моя проблема сейчас заключается в следующем: когда пользователь вводит текстовое поле, это не вызывает событие OnTextChanged.

Я что-то упустил?

Ответы [ 6 ]

6 голосов
/ 22 октября 2009

Я не уверен, что ваша проблема имеет какое-либо отношение к UpdatePanel.

На самом деле, событие TextChanged не срабатывает при наборе . Он будет срабатывать только после , когда текстовое поле теряет фокус. Это происходит напрямую, если для AutoPostBack установлено значение True или когда происходит следующий постбэк. Пожалуйста, ознакомьтесь с документами для свойства AutoPostBack и события TextChanged .

Афаик, тебе лучше всего справиться с событием keyup в javascript.

Вот простой пример jQuery:

$(document).ready(function() {
    $(':text[id$=YourTextBox]').keyup(function() {
        if ($(this).val() === "your special value") {
            $('span[id$=YourLabel]').css('visibility', 'visible');
        }
        else {
            $('span[id$=YourLabel]').css('visibility', 'hidden');
        }
    });
});
5 голосов
/ 05 мая 2009

Установите свойство EventName для вашего txtMyTexbox AsyncPostBackTrigger на TextChanged

<Triggers>             
    <asp:AsyncPostBackTrigger ControlID="txtMyTexbox" EventName="TextChanged" />            
</Triggers>

Другое предложение:

Вы пытались просмотреть элемент управления AutoComplete , который является частью AjaxControlToolKit? Он ведет себя так же, как вы хотите, чтобы ваше решение работало.

1 голос
/ 26 июля 2010

важно знать, что даже после добавления панели обновления / AsyncPostBackTrigger TextBox ChangeEvent не работает должным образом. Некоторое время он работает, а иногда нет .. Так как это асинхронный вызов, нам нужно какое-то время обновить, подождать или непредсказуемо, Microsoft найдет компетентный вариант. Ниже приведен простой способ проверить имя пользователя довольно хорошо 1001 *

------ в Page_Load - aspx.cs -----------------------

this.TextBox1.Attributes.Add ("onKeyUp", "fnUNameSubmit (this);");

------- в сценарии aspx -add ----------------------------------- ----

<script language="javascript" type="text/javascript">

function fnUNameSubmit(urInput) {   
var inpt= urInput.value;
if (inpt.length > 21) { 
document.getElementById('<%= TextBox1.ClientID %>').style.backgroundColor = "green";
document.form1.submit();  // This is only trick we use here..
}
else {
document.getElementById('<%= TextBox1.ClientID %>').style.backgroundColor = "red";
}
  }
</script>

------- в сценарии aspx -add ----------------------------------- ---- ---------------- aspx.cs ------------------- if (TextBox1.Text.Length> 21) { CheckUsrName (); Label2.Text = ""; } еще { Label2.Text = "Длина меньше 21"; // давай сделаем что-нибудь } ------------------------------------------------- CheckUsername ()

public void CheckUsrName () {

  Call dB values

}
0 голосов
/ 12 апреля 2011

Элемент управления, идентификатор которого используется в AsyncPostBackTrigger, должен находиться за пределами панели обновления (вызывающей запуск вызова Async) следующим образом:

<tr>
    <td colspan="4"><asp:Label ID="lblEnter_Successfully"  Text="Enter Record SuccessFully" runat="server" Visible ="false" ForeColor ="Blue" Font-Size ="Larger" Font-Bold ="true"></asp:Label>
    </td>
</tr>                                           
</table>                
</ContentTemplate>

  <Triggers>
     <asp:AsyncPostBackTrigger ControlID = "Button_Save" EventName ="Click"/>
  </Triggers>                       

</asp:UpdatePanel>
            <table>
              <tr>
                <td width = "472px" align ="right">             
                    <asp:Button ID="Button_Save" runat="server" Text="Save"  OnClientClick ="return URLValidation();"/>
                    <asp:Button ID="Button_Clear" runat="server" Text="Clear"/>
                </td>
              </tr>
            </table>
0 голосов
/ 13 мая 2010

текстовое поле проверки обхода проблемы - вызывает свойство validation и присваивает ему значение true

0 голосов
/ 05 мая 2009

Вы не должны использовать RegisterAsyncPostBackControl для вашего TextBox. Этот метод действительно предназначен только для элементов управления, которые находятся за пределами UpdatePanels. Я бы попытался удалить эту строку кода и посмотреть, что произойдет.

См. Это для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerasyncpostbackcontrol.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...