2009-05-05 3 views
12

Ho la seguente situazione: Ho una casella di testo all'interno di un pannello di aggiornamento Ajax. Ovunque l'utente digiti nella casella di testo, devo visualizzare un messaggio (messaggio diverso che dipende dai dati digitati dall'utente).Problema con la casella di testo all'interno dell'aggiornamento - non causa l'evento 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> 

Nel lato server che ho scritto quanto segue al caricamento della pagina

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

e il metodo come questo

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

Il mio problema ora è che: quando l'utente digita nella casella di testo non causa l'evento OnTextChanged.

Mi manca qualcosa?

+0

nota: solo quando mi ha colpito 'Tab' o 'Enter' provoca evento OnTextChanged – DaDa

risposta

0

Non dovresti utilizzare RegisterAsyncPostBackControl per il tuo TextBox. Questo metodo è in realtà solo per l'uso per i controlli che risiedono al di fuori di UpdatePanels. Vorrei provare a rimuovere quella riga di codice e vedere cosa succede.

vedere questo per ulteriori informazioni: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerasyncpostbackcontrol.aspx

+0

ho rimosso quella linea o codice f. non fa alcun cambiamento. grazie comunque – DaDa

5

Impostare la proprietà EventName per il vostro txtMyTexbox AsyncPostBackTrigger per TextChanged

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

Altro sugguestion:

Hai provato a guardare il controllo AutoComplete che fa parte di AjaxControlToolKit? Si comporta allo stesso modo in cui si desidera che la soluzione si comporti.

+0

grazie, ma la situazione rimane la stessa. – DaDa

6

Non sono sicuro che il problema abbia a che fare con lo UpdatePanel.

In effetti, l'evento TextChanged non viene attivato durante la digitazione di. Sparirà solo dopo la casella di testo perde lo stato attivo. Ciò accade direttamente se AutoPostBack è impostato su True o quando si verifica il successivo postback. Si prega di consultare i documenti per il AutoPostBack property e il TextChanged event.

Afaik, la soluzione migliore è probabilmente quella di gestire l'evento keyup in javascript.

Ecco un semplice esempio 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

una casella di testo di controllo soluzione - proprietà CausesValidation e impostarlo su true

1

sua strnage di sapere che anche dopo l'aggiunta di pannello di aggiornamento/AsyncPostBackTrigger, TextBox ChangeEvent doesn' t funziona correttamente. Qualche volta i suoi lavori e alcune volte no ... Dal momento che è una chiamata asincrona, abbiamo bisogno di un po 'di tempo per aggiornare, o aspettare o imprevedibile, speranze microsoft arriverà con uno competente .. Di seguito sono riportati i metodi semplici per controllare il nome utente

------ Sotto Page Load - aspx.cs -----------------------

this.TextBox1.Attributes.Aggiungi ("onKeyUp", "fnUNnameSubmit (questo);");

------- in aspx -add script ---------------------------------- -----

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

------- in aspx -add script -------------------------- ------------- ---------------- aspx.cs ---------------- --- if (TextBox1.Text.Length> 21) { CheckUsrName(); Label2.Text = ""; } altro { Label2.Text = "La lunghezza è inferiore a 21"; // lascia fare qualcosa..bla..bla } ----------------------------------- -------------- CheckUsername()

CheckUsrName public void() {

Call dB values 

} 
0

il controllo che id viene utilizzato in AsyncPostBackTrigger deve essere al di fuori del pannello di aggiornamento (che causano al fuoco la chiamata asincrona) come questo:

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