logo

No Focus from onload event

Posted by tom shad in Visual Studio .NET

Wednesday, July 25, 2007 8:25:46 PM

I almost got this to work.
 
I can access the <body ID="myBody" runat="server"> tag from inside my User control and add an onLoad event to the tag.  When I add the onLoad event to the myBody tag - it is there, but the control still doesn't get focus.  I named the User Control to make sure I can get to it, but it still doesn't work.
 
I tried to use:
 
    a.Attributes.Add("onLoad","addForm.LoginID.UserName.focus()")
But got an error that said that LoginID wasn't a member of addForm.  I then tried to loop through the addForm elements and found the Name = LoginID:txtUserName.  I changed the line to:
 
    a.Attributes.Add("onLoad","addForm.LoginID:txtUserName.focus()")
 
I don't get the error now, but it still doesn't seem to work.  It is still not getting focus.
Here are the 2 files:
 
test.aspx:
**********************************************
<%@ Page Language="VB" trace="false" ContentType="text/html" ResponseEncoding="iso-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ Register TagPrefix="fts" TagName="Logon" src="test.ascx" %>
<html>
<head>
<title>Login</title>
</head>
<body id="myBody" runat="server" >
 <form id="addForm" runat="server">
   <fts:Logon ID="LoginID" runat="Server"/>     
 </form>
</body>
</html>
***********************************************
 
test.ascx:
***********************************************
<script runat="server" > 
 Sub Page_Load(sender as Object, e as EventArgs)
  dim IsCheckResumes as Boolean = true
  if not IsPostBack
    Dim a as htmlControl
    a = CType(Page.FindControl("myBody"),htmlControl)
    a.Attributes.Add("onLoad","addForm.LoginID:txtUserName.focus()")
  end if
 End Sub
  
 Public Property UserName AS String
  Get
   Return txtUserName.Text
  End Get
  Set
   txtUserName.Text = Value
  End Set   
 End Property
 
</script>
 
<asp:textbox id="txtUserName" TextMode="SingleLine" Columns="25" runat="server" />
 <asp:RequiredFieldValidator
 ControlToValidate="txtUserName"
 Text="User Name Required"
 runat="server" />
**********************************************
 
Here is the Tree from the Trace:
 
__PAGE ASP.test_aspx
    _ctl0 System.Web.UI.LiteralControl
    _ctl1 System.Web.UI.LiteralControl
    myBody System.Web.UI.HtmlControls.HtmlGenericControl
        _ctl2 System.Web.UI.LiteralControl
        addForm System.Web.UI.HtmlControls.HtmlForm
            _ctl3 System.Web.UI.LiteralControl
            LoginID ASP.test_ascx
                LoginID:txtUserName System.Web.UI.WebControls.TextBox
                LoginID:_ctl1 System.Web.UI.LiteralControl
                LoginID:_ctl0 System.Web.UI.WebControls.RequiredFieldValidator
                LoginID:_ctl2 System.Web.UI.LiteralControl
            _ctl4 System.Web.UI.LiteralControl
        _ctl5 System.Web.UI.LiteralControl
    _ctl6 System.Web.UI.LiteralControl
 
Thanks,
 
Tom

Biography
tom has not submitted biographical details.

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor
Peter Bromberg

Do a View Source on the rendered page in the browser.

Peter Bromberg replied to tom shad

Wednesday, July 25, 2007 8:57:19 PM

You need to look at the resultant id of the control - its probably a lot different than what your code thinks. Use control.ClientId from the server side to resolve this. Also, you can use the ClientScript.RegisterXXX set of methods to inject script directly (either from the control or from the Page itself.

Moreover, there are several methods that are built into the ASP.NET control and page framework that will let you set default focus on controls.


Biography
Peter Bromberg is a C# MVP, MCP, and .NET expert who has worked in banking, financial and telephony for over 20 years. Pete focuses exclusively on the .NET Platform, and currently develops SOA and other .NET applications for a Fortune 500 clientele. Peter enjoys producing digital photo collage with Maya,playing jazz flute, the beach, and fine wines. You can view Peter's UnBlog and IttyUrl sites. Pete Tweets at peterbromberg

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor

I did and did get it to work but not as I wanted

tom shad replied to Peter Bromberg

Wednesday, July 25, 2007 9:15:01 PM

I did that as well as the Trace that was in the original post and found the ID = LoginID:txtUserName.  So I don't need to make this variable public.

But I still couldn't get this to work directly from the <body> tag, as I would like.  Shail put me in the right direction to get it to work calling a function - but I would think I should be able to call it directly.

Ok, I got it to work.  But not the way I wanted.

I tried:

    a.Attributes.Add("onLoad","addForm.LoginID:txtUserName.focus();")

and

    a.Attributes.Add("onLoad","LoginID:txtUserName.focus();")

Neither one of these worked.  There was no error but there was no focus,
either.

I made a change by calling a Javascript function from the onload function
and this worked.  The LoginID:txtUserName is the correct name but why does
the above not work???

The files that work are:

test.aspx:
*************************************************
<%@ Page Language="VB" trace="true" ContentType="text/html"
ResponseEncoding="iso-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ Register TagPrefix="fts" TagName="Logon" src="test.ascx" %>
<html>
<head>
<title>Login</title>
<script language="JavaScript">
function GetFocus()
{
      if (document.getElementById("LoginID:txtUserName") != null)
   {
           document.getElementById("LoginID:txtUserName").focus();
   }
}
</script>
</head>
<body id="myBody" runat="server">
 <form id="addForm" runat="server">
   <fts:Logon ID="LoginID" runat="Server"/>
 </form>
</body>
</html>
*************************************************

test.ascx:
*************************************************
<script language="vb" runat="server" >
 Sub Page_Load(sender as Object, e as EventArgs)
  dim IsCheckResumes as Boolean = true
  if not IsPostBack
    Dim a as htmlControl
    a = CType(Page.FindControl("myBody"),htmlControl)
    a.Attributes.Add("onLoad","GetFocus();")
  end if
 End Sub

 Public Property UserName AS String
  Get
   Return txtUserName.Text
  End Get
  Set
   txtUserName.Text = Value
  End Set
 End Property

</script>

<asp:textbox id="txtUserName" TextMode="SingleLine" Columns="25"
runat="server" />
 <asp:RequiredFieldValidator
 ControlToValidate="txtUserName"
 Text="User Name Required"
 runat="server" />
*************************************************

This works but I would rather do the focus directly from the <body> tag and
not have to build an extra function for each page that needs to have focus.

Can anyone explain to me why this isn't working?  Does it have to do with
timing on when a control is put on the page?  I would assume this wouldn't
be the case as the page is built before the onload function is called (isn't
it?).

I don't know of the other methods that are built into asp.net control to set default focus.  When I was looking in this - this was the only method I was told about that worked when I wasn't dealing with a User Control.  I am using Asp.net 1.1, BTW.

Thanks,

Tom


Biography
tom has not submitted biographical details.

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor
SAM K

if you r using usercontrol then do as under

SAM K replied to tom shad

Wednesday, July 25, 2007 10:23:30 PM

on the pageload of your user control add below code

 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim str As String = "<script language=javascript>function SetControlfocus(){document.getElementById('" & Me.txtLogin.ClientID & "').focus();}</script>"

        If Not Page.IsStartupScriptRegistered("SetCtlFocus") Then
            Page.RegisterStartupScript("SetCtlFocus", str)
        End If

end sub

and after this on the page at the end (after the body's end tag) call the same javascript function like below:
<html>
<body>
    ...
</body>
<script language=javascript>
    SetControlfocus();
</script>
</html>

I hope this helps.


setcontrolfocus();

Biography
Senior .net developer

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor

Not sure why I need to do IsStartupScriptRegistered

tom shad replied to SAM K

Thursday, July 26, 2007 12:33:07 PM

Why do I need to do that if I can do:

<script language="JavaScript">
function GetFocus(ctrl)
{
      if (document.getElementById(ctrl) != null)
   {
           document.getElementById(ctrl).focus();
   }
}
...
    Dim a as htmlControl
    a = CType(Page.FindControl("myBody"),htmlControl)
    a.Attributes.Add("onLoad","GetFocus(LoginID:txtUserName);")

also -

I am confused as to why the following doesn't work

    a.Attributes.Add("onLoad","LoginID:txtUserName.focus();")

or

    a.Attributes.Add("onLoad","addFormLoginID:txtUserName.focus();")

(where addForm is the Form Name).

If it is on the same page and not part of the form, this does work:

    a.Attributes.Add("onLoad","addForm.email.focus();")

(Where email is a TextBox on the main page and not in a control)

So the problem seems to be that you can't do an inline focus if the object is part of a control - but you can if it is on the main page.

You can do use focus on an object control if you do it from inside a Javascript function.

Have no idea why.

Thanks,

Tom


Biography
tom has not submitted biographical details.

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor
SAM K

ok let me answer one by one

SAM K replied to tom shad

Thursday, July 26, 2007 7:24:55 PM

First thing, you can use the script block which you told me but you are hard coding id of the control. Now, when u use usercontrol its better to pass it through your page. that way in case if u r using multiple instance of the control or u change the textbox id u dont miss to change it on the page.

Secondly, IsStartupScriptRegistered() is basically used to avoid writing duplicate script blocks on page.

and Finally, onLoad is normally used with Body and window. I dont have a specific answer for that but microsoft says that it can be used with APPLET, BODY, EMBED, FRAME, FRAMESET, IFRAME, IMG, LINK, SCRIPT and window elements (http://msdn2.microsoft.com/en-us/library/ms536942.aspx). Although its not working with img at all.

I hope my answers helps you.

Biography
Senior .net developer

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor

Sounds Good

tom shad replied to SAM K

Friday, July 27, 2007 12:16:33 PM

But the onLoad is used with Body in my case and works textbox is on the page and not in a control.

If in a control it doesn't work - which doesn't make much sense as the textbox (input) is on the page at that point.  Obviously, it is there as it works if the onload calls a function that sets the focus doing exactly the same thing with exactly the same ID as the inline onload statement of the body tag.

Oh well, the subroutine is working fine and I can use it with multiple textboxes using the same code whether it is directly on the page or in a control.

Thanks for explanation,

Tom


Biography
tom has not submitted biographical details.

Site Rank:  Not applicable - Current Winnings:  $0.00

Reply Reply Using Power Editor
 

Didn't Find The Answer You Were Looking For?

EggHeadCafe has experts online right now that may know the answer to your question.  We pay them a bonus for answering as many questions as they can.  So, why not help them and yourself by becoming a member (free) and ask them your question right now?
Ask Question In Live Forum








  $1000    Adam Houldsworth - $173  |  Jonathan VH - $154  |  Kirtan Patel - $116  |  Mr. Khan - $99  |  F Cali - $94  |  more Neado  |  Free Icons  |  Privacy  |   (c) 2010