2013-02-27 41 views
0

使用此ASP.Net LoginView用戶名文本框領域,我們想將焦點設置時,它加載的網頁上的用戶名文本框:焦點設置的一個ASP.Net LoginView

<asp:LoginView 
    ID="loginViewMain" 
    runat="server"> 

    <LoggedInTemplate> 
     <asp:LoginName 
      ID="loginName" 
      runat="server" 
      FormatString="Hello, {0}!<br/><br/> You have successfully<br/> logged onto the staff site." /> 

     <br/> 
     <br/> 

     (<asp:LoginStatus ID="loginStatus" runat="server" />) 

     <br/> 
     <br/> 

    </LoggedInTemplate> 

    <AnonymousTemplate> 
     <asp:LoginStatus 
      ID="loginStatus" 
      runat="server" /> 
    </AnonymousTemplate> 
</asp:LoginView> 

這是代碼隱藏在試圖將得到重點用戶名文本框:

Private Sub loginViewMain_Load(sender As Object, e As EventArgs) Handles loginViewMain.Load 

    Dim objContentPlaceHolder As ContentPlaceHolder 
    Dim objLoginView As LoginView 
    Dim objUserName As TextBox 

    objContentPlaceHolder = CType(Me.FindControl("ContentPlaceHolderBody"), ContentPlaceHolder) 

    If Not objContentPlaceHolder Is Nothing Then 

     objLoginView = CType(objContentPlaceHolder.FindControl("loginViewMain"), LoginView) 

     If Not objLoginView Is Nothing Then 
      objUserName = objLoginView.FindControl("UserName") 
      objUserName.Focus() 
     End If 
    End If 
End Sub 

執行不進入這個如果結構:

If Not objLoginView Is Nothing Then 

您能否告訴我還需要在此編碼的If結構中添加哪些內容才能獲取用戶名文本框?

回答

2

你可以做到這一點,而無需知道LoginView控件的細節。而是使用JavaScript來查找第一個文本框並關注它。

在代碼中添加以下代碼隱藏文件:

var script = string.Format(@" 
    var inputs = document.getElementById('{0}').getElementsByTagName('input'); 
    for (var i = 0; i < inputs.length; i++) {{ 
     var inp = inputs[i]; 
     if (inp.type.toUpperCase() !== 'TEXT') continue; 
     inp.focus(); 
     inp.select(); 
     break; 
    }}", this.LoginView.ClientID); 

// register the script 
ScriptManager.RegisterStartupScript(this, this.GetType(), "login focus", script, true); 

或VB.NET:

Dim script = String.Format(
    "var inputs = document.getElementById('{0}').getElementsByTagName('input');" & 
    "for (var i = 0; i < inputs.length; i++) {{" & 
    " var inp = inputs[i];" & 
    " if (inp.type.toUpperCase() !== 'TEXT') continue;" & 
    " inp.focus();" & 
    " inp.select();" & 
    " break;" & 
    "}}", Me.LoginView.ClientID) 

' register the script 
ScriptManager.RegisterStartupScript(Me, TypeOf(this), "login focus", script, True) 
+0

看起來不錯。你可以包含這個編碼的vb.net版本,我可以放在代碼隱藏的地方嗎? – 2013-02-27 15:53:00

+0

添加了vb.net代碼 – 2013-02-27 15:57:06

+0

感謝您的編碼,但我們在Google上查找並找不到如何將其放置在網頁的標記中。這種編碼是否應該進入代碼隱藏? – 2013-02-27 16:17:37

2

FindControl只搜索一個樹深度。

嘗試使用recursive function代替

例如:

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

接着,電話會

objLoginView = CType(FindControlRecursive(objContentPlaceHolder, "loginViewMain"), LoginView); 

希望有所幫助。

+0

感謝您的答覆。你能顯示我們需要的編碼嗎? – 2013-02-27 15:47:09

+0

檢查鏈接和帖子,如果你卡住 – happygilmore 2013-02-27 15:47:30

+0

我給了一個示例代碼(未經測試),應該工作。 – happygilmore 2013-02-27 15:53:20