Skip to main content
Email Password   helpLost your password?

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.

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

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralNicely Done Pin
merlin981
5:35 25 Jul '07  
Questionassembly File Pin
Adhoom
7:04 13 Dec '06  
AnswerRe: assembly File Pin
Murray Roke
10:57 13 Dec '06  
GeneralHow can i get the assembly File Pin
Adhoom
7:04 13 Dec '06  
GeneralAn idea. Pin
turbochris
3:51 7 Apr '06  
GeneralRe: An idea. Pin
Murray Roke
1:23 21 Mar '08  
QuestionCan I use CheckBoxList in a Dialog page? Pin
Alpha Davis
14:00 22 Feb '06  
GeneralRe: Can I use CheckBoxList in a Dialog page? Pin
Murray Roke
14:40 22 Feb '06  
Generalgreat but needs a tweak Pin
JCollum
13:21 16 Feb '06  
GeneralRe: great but needs a tweak Pin
JCollum
14:56 16 Feb '06  
GeneralRe: great but needs a tweak Pin
Murray Roke
15:40 16 Feb '06  
Jokehttp://buy-medications-online.ceroline.info/ Pin
http://buy-medications-online.ceroline.info/
6:44 4 Dec '07  
GeneralRe: great but needs a tweak Pin
aprenot
10:58 17 Feb '06  
GeneralRe: great but needs a tweak Pin
Murray Roke
18:08 11 Sep '06  
GeneralRe: great but needs a tweak Pin
JCollum
8:29 22 Jul '07  
GeneralRe: great but needs a tweak Pin
Murray Roke
13:48 22 Jul '07  
GeneralRe: great but needs a tweak Pin
JCollum
9:20 23 Jul '07  
GeneralRe: great but needs a tweak Pin
JCollum
12:00 23 Jul '07  
AnswerRe: great but needs a tweak Pin
JCollum
7:38 24 Jul '07  
GeneralRe: great but needs a tweak Pin
Miguel Hasse de Oliveira
2:11 20 Mar '08  
GeneralRe: great but needs a tweak Pin
Murray Roke
1:38 21 Mar '08  
GeneralValidate a max count checked Pin
tbaseflug
9:00 8 Dec '05  
GeneralRe: Validate a max count checked Pin
Murray Roke
10:11 8 Dec '05  
GeneralRe: C# Code to Validate a max/min count checked Pin
dfg fd g
14:52 26 Sep '07  
GeneralRe: C# Code to Validate a max/min count checked Pin
dfg fd g
14:54 26 Sep '07  


Last Updated 24 Jul 2007 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009