2009-05-05 46 views
12

Tôi có tình huống sau: Tôi có một hộp văn bản bên trong bảng cập nhật ajax. Bất cứ nơi nào người dùng gõ vào hộp văn bản tôi phải hiển thị một tin nhắn (thông báo khác nhau phụ thuộc vào dữ liệu người dùng đã nhập).Sự cố với hộp văn bản bên trong updatepanel - không gây ra sự kiện 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> 

Trong phía máy chủ tôi đã viết như sau tại tải trang

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

và phương pháp như thế này

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

Vấn đề của tôi bây giờ là: khi người dùng nhập vào textbox nó không gây ra sự kiện OnTextChanged.

Tôi có thiếu gì đó không?

+0

lưu ý: chỉ khi tôi nhấn 'Tab' hoặc 'Enter' nó gây ra sự kiện OnTextChanged – DaDa

Trả lời

0

Bạn không nên sử dụng RegisterAsyncPostBackControl cho TextBox của mình. Phương thức đó thực sự chỉ dành cho các điều khiển nằm bên ngoài UpdatePanels. Tôi sẽ cố gắng loại bỏ dòng mã đó và xem điều gì xảy ra.

Xem này cho biết thêm: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerasyncpostbackcontrol.aspx

+0

tôi đã xóa dòng đó o mã f. nó không thực hiện bất kỳ thay đổi nào. cảm ơn anyway – DaDa

5

Đặt EventName tài sản cho txtMyTexbox bạn AsyncPostBackTrigger để TextChanged

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

sugguestion khác:

Các bạn đã thử nhìn vào AutoComplete kiểm soát là một phần của AjaxControlToolKit? Hành vi của nó giống như cách bạn muốn giải pháp của bạn hoạt động.

+0

cảm ơn, nhưng tình hình vẫn như cũ. – DaDa

6

Tôi không chắc chắn rằng sự cố của bạn có liên quan đến UpdatePanel.

Thực tế, sự kiện TextChanged không kích hoạt khi nhập. Nó sẽ chỉ bắn sau hộp văn bản mất tiêu điểm. Điều này xảy ra trực tiếp nếu AutoPostBack được đặt thành True hoặc khi xảy ra postback tiếp theo. Vui lòng xem tài liệu cho số AutoPostBack propertyTextChanged event.

Afaik, đặt cược tốt nhất của bạn có lẽ là để xử lý sự kiện khóa trong javascript.

Dưới đây là một jQuery đơn giản ví dụ:

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

một tấm séc workaround textbox - tài sản CausesValidation và đặt nó vào đúng

1

strnage của nó để biết rằng ngay cả sau khi thêm bản cập nhật bảng/AsyncPostBackTrigger, TextBox ChangeEvent doesn' t làm việc đúng cách. Một số thời gian hoạt động của nó và một số lần nó không ... Kể từ khi cuộc gọi Asychronous của nó, chúng ta cần phải làm mới một số thời gian, hoặc chờ đợi hoặc không thể đoán trước, Hy vọng microsoft sẽ đến với một trong những có thẩm quyền .. Dưới đây là cách dễ dàng để kiểm tra tên người dùng khá tốt

------ Dưới Page_Load - aspx.cs -----------------------

this.TextBox1.Attributes.Thêm ("onKeyUp", "fnUNameSubmit (this);");

------- trong tập lệnh 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> 

------- trong tập lệnh aspx -add -------------------------- ------------- ---------------- aspx.cs ---------------- --- nếu (TextBox1.Text.Length> 21) { CheckUsrName(); Label2.Text = ""; } else { Label2.Text = "Độ dài nhỏ hơn 21"; // hãy thực hiện một số nội dung ..bla..bla } ----------------------------------- -------------- CheckUsername()

public void CheckUsrName() {

Call dB values 

} 
0

Ban kiểm soát mà id được sử dụng trong AsyncPostBackTrigger phải ngoài cập nhật Panel (nguyên nhân gây ra cuộc gọi Async) như sau:

<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> 
Các vấn đề liên quan