65.9K
CodeProject is changing. Read more.
Home

List Validator

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (9 votes)

Apr 12, 2005

MIT
viewsIcon

92221

Validates a ListControl to ensure at least one RadioButton or CheckBox is checked.

Objective

This article has two goals.

  1. Implement a good ListValidator to validate whether at least one item in a CheckBoxList or RadioButtonList has been checked.
  2. Demonstrate a fully functional validator.

Common omissions / problems

Many validators seem to fall down in one area or another. This control is an attempt to demonstrate how a complete validator should look. As this is my first article, I'm sure I'll miss something or lots of things. Please let me know and I'll try to keep it up-to-date. Here are a few common problems. My example shows how to implement these features.

  • Validators that don't implement client script.
  • Validators that don't implement EnableClientScirpt="false".
  • Validator client scripts that don't work with multiple validators on a page.

Here's the code

/*

Author:        Murray Roke
Email:        murray@roke.co.nz

Features
 - ClientScript        works.
 - EnableClientScript    works.
 - Multiple Validators    works.

Change Log:
2006-02-17
Implemented fix for javascript validation 
of radio buttons.. Thanks to JCollum from TheCodeProject 

*/
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CompanyName.Web.Controls.Validators
{
    /// <summary>
    /// Validates if at least one item in a ListControl is checked.
    /// </summary>
    /// <remarks>
    /// Original javascript code came from this example, but 
    /// I've improved upon it. 
    /// to get multiple validators on a page working correctly.
    /// http://www.dotnetjunkies.com/
    /// Article/ECCCD6A6-B312-41CB-87A1-10BB5D641D20.dcik
    /// </remarks>
    [DefaultProperty("ErrorMessage")] // make the error message the default 
                                      // property to edit at design time 
                                      // for those using gui editor
    public class ListControlRequiredFieldValidator : BaseValidator 
    {
        /// <summary>
        /// Validator Requirement
        /// </summary>

        /// <returns>True if dependencies are valid.</returns>
        protected override bool ControlPropertiesValid()
        {
            Control controlToValidate = 
                FindControl(ControlToValidate) as ListControl;
            return (controlToValidate != null);
        }

        /// <summary>
        /// Validator Requirement
        /// </summary>
        /// <returns>true if ControlToValidate 
        /// has one item or more selected</returns>

        protected override bool EvaluateIsValid() 
        {
            return this.EvaluateIsChecked();
        }

        /// <summary>
        /// Return true if an item in the list is selected.
        /// </summary>
        /// <returns>true if ControlToValidate 
        ///      has one item or more selected</returns>
        protected bool EvaluateIsChecked() 
        {
            ListControl listToValidate = 
                ((ListControl) this.FindControl(this.ControlToValidate));

            foreach( ListItem li in listToValidate.Items ) 
            {
                if ( li.Selected == true ) 
                    return true;
            }
            return false;
        }

        /// <summary>

        /// Pre Render
        /// </summary>
        /// <param name="e"></param >
        protected override void OnPreRender( EventArgs e )
        {
            System.Web.HttpContext.Current.Trace.Write(
                                         "Override OnPreRender");
            if(this.DetermineRenderUplevel() && this.EnableClientScript)
            {
                Page.ClientScript.RegisterExpandoAttribute(this.ClientID, 
                    "evaluationfunction", "ListItemVerify");
                Page.ClientScript.RegisterExpandoAttribute(this.ClientID, 
                    "minimumNumberOfSelectedCheckBoxes", "1"); 
                    //TODO: imporove to allow variable number.
                this.RegisterClientScript();
            }
            else
            {
                this.Attributes.Remove("evaluationfunction");
            }
            base.OnPreRender( e );
        }

        /// <summary>
        /// Register the client script.
        /// </summary>

        protected void RegisterClientScript() 
        {
            string script = @"

            <script language=""javascript"">
            function ListItemVerify(val) 
            {
                var control = 
                    document.getElementById(val.controltovalidate);
                var minimumNumberOfSelectedCheckBoxes = 
                    parseInt(val.minimumNumberOfSelectedCheckBoxes);
                var selectedItemCount = 0;
                var liIndex = 0;
                var currentListItem = 
                    document.getElementById(control.id + 
                    '_' + liIndex.toString());
                while (currentListItem != null)
                {
                    if (currentListItem.checked) selectedItemCount++;
                    liIndex++;
                    currentListItem = 
                        document.getElementById(control.id + 
                        '_' + liIndex.toString());
                }
                return selectedItemCount >= 
                    minimumNumberOfSelectedCheckBoxes;
            }
            </script>
            ";

            this.Page.ClientScript.RegisterClientScriptBlock(
                typeof(ListControlRequiredFieldValidator), 
                "ListRequiredValidator_Script",script);
        }
    }
}

Example usage

Register the library.

<%@ Register TagPrefix="CompanyName" 
    NameSpace="CompanyName.Web.Controls.Validators"
    Assembly="CompanyName.Web" %>

Create the validator. Imagine that the CheckBoxList you wish to validate is called MyCheckList.

<CompanyName:ListControlRequiredFieldValidator
    ControlToValidate="MyCheckList" 
    display="Dynamic" 
    ErrorMessage="Select at least one item" 
    EnableClientScript="true" 
    runat="Server">
    Tick at least one box
</CompanyName:ListControlRequiredFieldValidator>

History

  • 12 April, 2005 -- Original version posted
  • 17 February, 2006 -- Updated
  • 24 July, 2007 -- Updated