Pessimists, we're told, look at a glass containing 50% air and 50% water and see it as half empty. Optimists, in contrast, see it as half full. Engineers, of course, understand the glass is twice as big as it needs to be. --Bob Lewis

Set Initial Focus on an ASP.NET Page

Easily generate the Javascript to set focus to any control on your ASP.NET page

Summary

Setting the cursor focus to a particular element of a web page when it loads is a pretty common little feature, but it can be annoying to implement. Here I automated the process in a C# method. You only need to pass the Control to the method and it will register the Javascript and set focus on page load.

This code was adapted from work by Fons.Sonnemans@reflectionit.nl.

Setup a couple of text boxes to test by adding the following to your aspx page.

Example: How to use the SetInitialFocus method
<P><asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<P><INPUT id="htmlTextBox" type="text" runat="server">

Then call the following method from the Page_Load in the code behind file. Notice that this works for WebControls and HtmlControls.

Example: How to use the SetInitialFocus method
public void TestSetInitialFocus()
{
   //Snippets00004.SetInitialFocus(TextBox1);
   Snippets00004.SetInitialFocus(htmlTextBox);
}

If you load the test aspx page in your browser, you should see that the selected control has the cursor focus.

Here's the class:

The SetInitialFocus method embedded in a class.
namespace Cambia.CoreLib
{
   using System;
   using System.Text;
   using System.Web.UI;
   using System.Web.UI.WebControls;

   /// <summary>
   /// Useful C# snippets from CambiaResearch.com
   /// </summary>
   public class Snippets00004
   {

      public Snippets00004()
      {
      }

      public static void SetInitialFocus(Control control) 
      {
         if (control.Page.IsClientScriptBlockRegistered("InitialFocus"))
            return;

         if (control.Page == null) 
         {
            throw new ArgumentException(
               "The Control must be added to a Page before "
               + "you can set the IntialFocus to it.");
         }
         if (control.Page.Request.Browser.JavaScript == true) 
         {
            // Create JavaScript
            StringBuilder s = new StringBuilder();
            s.Append("\n<SCRIPT LANGUAGE='JavaScript'>\n");
            s.Append("<!--\n");
            s.Append("function SetInitialFocus()\n");
            s.Append("{\n");
            s.Append("   document.");

            // Find the Form
            Control p = control.Parent;
            while (!(p is System.Web.UI.HtmlControls.HtmlForm))
               p = p.Parent;
            s.Append(p.ClientID);

            s.Append("['");
            s.Append(control.UniqueID);

            // Set Focus on the selected item of a RadioButtonList
            RadioButtonList rbl = control as RadioButtonList;
            if (rbl != null) 
            {
               string suffix = "_0";
               int t = 0;
               foreach (ListItem li in rbl.Items) 
               {
                  if (li.Selected) 
                  {
                     suffix = "_" + t.ToString();
                     break;
                  }
                  t++;
               }
               s.Append(suffix);
            }

            // Set Focus on the first item of a CheckBoxList
            if (control is CheckBoxList) 
            {
               s.Append("_0");
            }

            s.Append("'].focus();\n");
            s.Append("}\n");

            if (control.Page.SmartNavigation)
               s.Append("window.setTimeout(SetInitialFocus, 500);\n");
            else
               s.Append("window.onload = SetInitialFocus;\n");

            s.Append("// -->\n");
            s.Append("</SCRIPT>");

            // Register Client Script
            if (!control.Page.IsClientScriptBlockRegistered("InitialFocus"))
               control.Page.RegisterClientScriptBlock("InitialFocus", 
                  s.ToString());
         }
      }

   }
}
 

Version: 6.0.20200920.1535