A Quick Fix for the Validator SetFocusOnError Bug
Also see: SIGPLAN Workshop on Undergraduate Programming Language Curriculum
<%@ Page Language=”C#” %> <script runat=”server”> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) DataBind(); } </script> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head runat=”server”> <title></title> </head> <body> <form id=”_frm” runat=”server”> <asp:DetailsView ID=”dv1″ DefaultMode=”Edit” DataSource=’<%# new object[1] %>’ runat=”server” > <Fields> <asp:TemplateField HeaderText=”First Name:”> <EditItemTemplate> <asp:TextBox ID=”FirstNameTextBox” runat=”server” /> <asp:RequiredFieldValidator ID=”FirstNameValidator1″ ControlToValidate=”FirstNameTextBox” ErrorMessage=”First name is required.” Display=”Dynamic” EnableClientScript=”false” SetFocusOnError=”true” ValidationGroup=”bug” Text=”*” runat=”server” /> </EditItemTemplate> </asp:TemplateField> </Fields> <FooterTemplate> <asp:ValidationSummary ID=”vs1″ DisplayMode=”List” ValidationGroup=”bug” runat=”server” /> <asp:Button ID=”Button1″ Text=”Post Back” ValidationGroup=”bug” runat=”server” /> </FooterTemplate> </asp:DetailsView> </form> </body> </html>
<input name=”dv1$FirstNameTextBox” type=”text” id=”dv1_FirstNameTextBox” />
Also see: Win friends and influence your team
Also see: Binding to .NET Frameworks Assemblies
WebForm_AutoFocus(‘FirstNameTextBox’);
if ((!this.IsValid && (this.Page != null)) && this.SetFocusOnError) { this.Page.SetValidatorInvalidControlFocus(this.ControlToValidate); }
Also see: Microformats are like RFID tags for the Web
Also see: Startup, Shutdown and related matters
Also see: When Are Two Algorithms the Same?
Also see: ReflectionTypeLoadException
Also see: JSR-203 more New I/O APIs - NIO.2
public override void Validate(string group) { base.Validate(group); // find the first validator that failed foreach (IValidator validator in GetValidators(group)) { if (validator is BaseValidator && !validator.IsValid) { BaseValidator bv = (BaseValidator)validator; // look up the control that failed validation Control target = bv.NamingContainer.FindControl(bv.ControlToValidate); // set the focus to it if (target != null) target.Focus(); break; } } }
If your using C# 3 this is even easier using LINQ:
public override void Validate(string group) { base.Validate(group); // get the first validator that failed var validator = GetValidators(group) .OfType<BaseValidator>() .FirstOrDefault(v => !v.IsValid); // set the focus to the control // that the validator targets if (validator != null) { Control target = validator .NamingContainer .FindControl(validator.ControlToValidate); if (target != null) target.Focus(); } }
Also see: Startup, Shutdown and related matters
Also see: Binding to .NET Frameworks Assemblies
Also see: Silverlight 2 Beta 1 Cross Domain Bug
I hope this saves someone the headache of tracking this down.
http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx
