2010-06-15 20 views
16

Tôi đang cố gắng đặt tiêu điểm cho tên người dùng TextBox nằm bên trong kiểm soát Đăng nhập ASP.NET.Đặt trọng tâm vào hộp văn bản trong Kiểm soát đăng nhập ASP.NET khi tải trang

Tôi đã cố gắng thực hiện điều này theo một vài cách nhưng dường như không có cách nào hoạt động. Trang đang tải nhưng không được kiểm soát.

Đây là mã tôi đã thử.

SetFocus(this.loginForm.FindControl("UserName")); 

TextBox tbox = (TextBox)this.loginForm.FindControl("UserName"); 
if (tbox != null) 
{  
    tbox.Focus(); 
} // if 
+2

nếu bạn không chắc chắn về thành công của 'FindControl()' không 'cast'. Sử dụng toán tử 'as' vì nếu không' (TextBox) null' sẽ ném 'NullReferenceException'. Vì vậy, kiểm tra null của bạn sẽ không bao giờ đạt được. – abatishchev

+1

Bạn có chuyển đổi điều khiển đăng nhập asp.net của bạn thành mẫu không? – Aristos

+0

Có, tôi đã chuyển đổi điều khiển đăng nhập thành mẫu. – anD666

Trả lời

9

Bạn đang sử dụng một ScriptManager trên trang? Nếu vậy, hãy thử như sau:

public void SetInputFocus() 
{ 
    TextBox tbox = this.loginForm.FindControl("UserName") as TextBox; 
    if (tbox != null) 
    { 
     ScriptManager.GetCurrent(this.Page).SetFocus(tbox); 
    } 
} 

Cập nhật: Không bao giờ sử dụng một MultiView trước đó, nhưng cố gắng này:

protected void MultiView1_ActiveViewChanged(object sender, EventArgs e) 
{ 
    SetInputFocus(); 
} 
+0

@Aristos - Cảm ơn bạn đã chỉ ra điều đó, tôi vừa sao chép và dán phương thức SetInputFocus của riêng mình và quên thay đổi nó cho câu hỏi này. – GenericTypeTea

+0

Vẫn không có gì, nó nhận được câu lệnh 'ScriptManager.GetCurrent (this.Page) .SetFocus (tbox);' nhưng vẫn không đặt tiêu điểm – anD666

+0

@ anD666 - Cập nhật câu trả lời của tôi, hãy thử. Chỉ cần đoán, vì vậy nó chưa được kiểm tra. Tôi vừa cướp ý tưởng về kết quả tìm kiếm trên google. – GenericTypeTea

0

Bạn có thể thử làm như sau:

-Register hai kịch bản (một để tạo ra một chức năng để tập trung vào texbox của bạn khi trang được hiển thị, thứ hai để đăng ký id của hộp văn bản)

this.Page.ClientScript.RegisterStartupScript(this.GetType(), "on_load", 
       "<script>function window_onload() \n { \n if (typeof(idLoginTextBox) == \"undefined\" || idLoginTextBox == null) \n return; \n idLoginTextBox.focus();\n } \n window.onload = window_onload; </script>"); 

this.Page.ClientScript.RegisterStartupScript(this.GetType(), "Focus", String.Format("<script>var idLoginTextBox=document.getElementById(\"{0}\").focus();</script>", this.loginForm.ClientID));    

Theo kết quả bạn sẽ nhận được những điều sau trong mã của bạn:

 <script> 
      function window_onload() 
      { 
      if (typeof(idLoginTextBox) == "undefined" || idLoginTextBox == null) 
       return;  
      idLoginTextBox.focus(); 
     } 
     window.onload = window_onload;  
     </script> 



<script> 
     var idLoginTextBox=document.getElementById("ctl00_LoginTextBox").focus(); 
    </script> 
1
protected void Page_Load(object sender, EventArgs e) 
{ 
    SetFocus(LoginCntl.FindControl("UserName")); 
} 
+3

Khi tải trang, con trỏ được đặt trong hộp văn bản tên người dùng. Nó hoạt động. Hãy thử nó. – Rekha

0

Tôi đã đấu tranh với điều này quá và tôi đã tìm thấy một giải pháp mà dường như làm việc rất tốt ngay cả với các điều khiển lồng nhau (như AspDotNetStorefront aka ASPDNSF sử dụng). Lưu ý mã sau đây được gọi là từ thường lệ Page_PreRender. Tôi biết tên của TextBox tôi muốn tập trung vào và vì vậy tôi chỉ gọi là FocusNestedControl(Me, "UserName"). Tôi chỉ sử dụng Me ở đây vì tất cả các nhu cầu thông thường là phụ huynh của kiểm soát để lấy tiêu điểm; không quan trọng cha mẹ nào.

Public Function FocusNestedControl(ByVal ParentControl As Control, ByVal ControlNameToFocus As String) As Control 

     If ParentControl.HasControls Then 
      For Each childCtrl As Control In ParentControl.Controls 
       Dim goodCtrl As Control = FocusNestedControl(childCtrl, ControlNameToFocus) 
       If goodCtrl IsNot Nothing Then 
        goodCtrl.Focus() 
        Return goodCtrl 
       End If 
      Next 
     Else 
      If ParentControl.ID = ControlNameToFocus Then 
       ParentControl.Focus() 
       Return ParentControl 
      End If 
     End If 

     Return Nothing 
    End Function 
28

Tôi đang sử dụng Page.Form.DefaultFocus và nó hoạt động:

// inside page_load, LoginUser is the Login control 
Page.Form.DefaultFocus = LoginUser.FindControl("Username").ClientID; 
+1

Điều này làm việc cho tôi khi không có gì khác, cảm ơn! – KenD

+0

Đây phải là câu trả lời được chấp nhận. – Marcel

0

Bạn có thể thiết lập tập trung trực tiếp trên LoginControl và nó sẽ tự động thiết lập tập trung vào lĩnh vực đầu tiên trong tầm kiểm soát. Trong trường hợp của bạn:

this.loginForm.Focus(); 

Thông tin thêm trên MSDN: How to: Set Focus on ASP.NET Web Server Controls

0
protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     Login.FindControl("UserName").Focus(); 

} 
0

Vấn đề của tôi arrized khi tôi chuyển kiểm soát đăng nhập vào một điều khiển tùy chỉnh và cố gắng tìm UsernameTextBox tại() phương pháp OnInit. OnInit của một điều khiển được thực thi trước OnInit of Page và đây là lý do tại sao không có điều khiển Form nào được tạo.

Tôi đã chuyển cuộc gọi đến UsernameTextBox thành chức năng OnLoad và nó hoạt động chính xác.

0

Không ai trong số các câu trả lời ở trên làm việc cho tôi, vì vậy tôi chỉ đơn giản là cố gắng:

protected void Page_Load(object sender, EventArgs e) { 
    // This works for me 
    TxtMyTextBoxName.Focus(); 
} 

... và nó làm việc!
Với hộp văn bản ASP được định nghĩa là:

<asp:TextBox ID="TxtMyTextBoxName" type="search" runat="server"></asp:TextBox>