2009-05-05 4 views
12

J'ai la situation suivante: J'ai une zone de texte dans un ajax updatepanel. Chaque fois que l'utilisateur tape dans la zone de texte, je dois afficher un message (message différent qui dépend des données tapées par l'utilisateur).Problème avec la zone de texte à l'intérieur de updatepanel - ne provoquant pas l'événement OnTextChanged

 <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> 

En côté serveur, je l'ai écrit ce qui suit à la page charge

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

et la méthode comme celui-ci

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

Mon problème est maintenant que: lorsque les types d'utilisateur dans la zone de texte cela ne provoque pas l'événement OnTextChanged.

Ai-je raté quelque chose?

+0

Note: seulement quand je frappe 'Tab' ou 'Enter' il provoque l'événement OnTextChanged – DaDa

Répondre

0

Vous ne devriez pas utiliser RegisterAsyncPostBackControl pour votre TextBox. Cette méthode est vraiment seulement pour une utilisation pour les contrôles qui résident en dehors de UpdatePanels. J'essaierais de supprimer cette ligne de code et de voir ce qui se passe.

Voir ce pour plus d'infos: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerasyncpostbackcontrol.aspx

+0

i enlevé cette ligne o code f. ça ne fait aucun changement. merci quand même – DaDa

5

Définissez la propriété EventName pour votre txtMyTexbox AsyncPostBackTrigger à TextChanged

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

Autres sugguestion:

Avez-vous essayé de regarder le contrôle AutoComplete qui fait partie de l'AjaxControlToolKit? Il se comporte de la même manière que vous voulez que votre solution se comporte.

+0

merci, mais la situation reste la même. – DaDa

6

Je ne suis pas sûr que votre problème a quelque chose à voir avec le UpdatePanel.

En fait, l'événement TextChanged ne déclenche pas en tapant. Il tirera seulement après la zone de texte perd le focus. Cela se produit directement si AutoPostBack est défini sur True ou lorsque la publication suivante se produit. S'il vous plaît voir les documents pour le AutoPostBack property et le TextChanged event. Afaik, votre meilleur pari est probablement de gérer l'événement de clé en javascript.

Voici un exemple simple 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'); 
     } 
    }); 
}); 
0

un chèque de contournement textbox - propriété CausesValidation et mettre à true

1

son strnage de savoir que, même après avoir ajouté le panneau de mise à jour/AsyncPostBackTrigger, TextBox ChangeEvent n » t fonctionne correctement. Quelque temps ses travaux et quelques fois pas .. Depuis son appel asynchrone, nous avons besoin de rafraîchir le temps, ou d'attendre ou imprévisible, Microsoft espère trouver un compétent .. Ci-dessous sont faciles à vérifier le nom d'utilisateur plutôt bon

------ Sous Page_Load - aspx.cs -----------------------

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

------- dans le script 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> 

------- dans aspx -add script -------------------------- ------------- ---------------- aspx.cs ---------------- --- if (TextBox1.Text.Length> 21) { CheckUsrName(); Label2.Text = ""; } sinon { Label2.Text = "La longueur est inférieure à 21"; // laisse faire des trucs..bla..bla } ----------------------------------- -------------- CheckUsername()

public void CheckUsrName() {

Call dB values 

} 
0

le contrôle qui id est utilisé dans AsyncPostBackTrigger doit être en dehors du panneau de mise à jour (cette cause au feu l'appel) comme celui-ci 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> 
Questions connexes