2013-02-27 4 views
0

Используя этот ASP.Net LoginView, мы хотели бы установить фокус на имя пользователя TextBox, когда он загружен на веб-странице:Настройка фокуса на имя пользователя TextBox поле в 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> 

Это отделенный код мы попытались использовать, чтобы получить фокус на имя пользователя TextBox:

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 

Execution ли попасть в эту структуру, если:

If Not objLoginView Is Nothing Then 

Можете ли вы рассказать мне, что еще мне нужно добавить в структуру If этого кодирования, чтобы получить текстовое поле User Name?

ответ

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, которую я могу разместить в коде? –

+0

Код vb.net добавлен –

+0

Спасибо за кодировку, но мы посмотрели на Google и не смогли найти, как разместить это в разметке веб-страницы. Предполагается ли, что это кодирование входит в код? –

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

Спасибо за ответ. Можете ли вы показать необходимое кодирование, которое нам нужно сделать? –

+0

проверить ссылку и сообщение, если вы застряли – happygilmore

+0

Я дал пример кода (непроверенный), должен работать. – happygilmore