Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

CheckBoxListValidator - CheckBoxList validieren

Ich hatte neulich die Anforderung ein CheckBoxList Control zu validieren.
Mit den Validatoren die mit ASP.NET mitkommen, lässt sich da nichts machen ausser dem Einkassieren einer Exception. Das ist auch gut so, denn diese sind nicht dafür gedacht.

Es gibt im Prinzip 3 Möglichkeiten wie dieses Problem gelöst werden kann:

  1. CustomValidator schreiben, der die Überprüfung durchführt
  2. Überprüfung manuell im Code vornehmen
  3. Eigener Validator erstellen, der von BaseValidator ableitet

Wie in vielen Fällen, ist hier Möglichkeit 1. die beste, vorallem wenn es um Wiederverwendung geht.
Ich habe einen relative einfachen aber wirkungsvollen Validator implementiert, dieser arbeitet im Moment noch rein serverseitig. Clientseitige Validierung könnte noch zusätzlich implementiert werden.
Es bestehen 3 Eigenschaften und zwei davon können kombiniert werden:

  • MinChecked (Es müssen mindestens soviele Optionen markiert werden)
  • MaxChecked (Es dürfen maximal soviele Optoinen markiert werden)
  • MinChecked und MaxChecked kombiniert (mindestens und maximal)
  • EqualsChecked (Genau soviele Einträge müssen markiert werden)

Wenn von BaseValidator bzw. einem anderen Validator der davon erbt, abgeleitet wird, hat das den Vorzug dass sich die Benutzung eines selbsterstellten Validator Controls nahtlos an die Benutzung der vorhandenen anknüpft.

Folgender Code reicht aus, um eine CheckBoxList dahingehend zu validieren, das genau zwei Einträge ausgewählt werden müssen, damit das Control valid ist:

<asp:CheckBoxList ID="chkListTest" runat="server">
    <asp:ListItem Text="Eintrag Eins" />
    <asp:ListItem Text="Eintrag Zwei" />
</asp:CheckBoxList>
<t4m:CheckBoxListValidator
    ID="valGeschlecht"
    ControlToValidate="chkListTest"
    ErrorMessage="Bitte genau zwei Optionen auswählen"
    EqualsChecked="2"
    runat="server" />

 

Es folgt der Quelltext des Controls:

namespace t4m.Controls
{
    /// <summary>
    /// Validiert ein CheckBoxList Control
    /// </summary>
    public class CheckBoxListValidator : BaseValidator
    {
        #region Private Members


        private int _equalsChecked;
        private int _minChecked;
        private int _maxChecked;

        #endregion

        #region Constructor

        public CheckBoxListValidator()
        {
            base.EnableClientScript = false;
        }

        #endregion

        #region Properties

        /// <summary>
        /// Genau diese Anzahl muss angekreuzt werden
        /// </summary>
        public int EqualsChecked
        {
            get { return this._equalsChecked; }
            set { this._equalsChecked = value; }
        }

        /// <summary>
        /// Minimal angekreuzte Optionen
        /// </summary>
        public int MinChecked
        {
            get { return this._minChecked; }
            set { this._minChecked = value; }
        }

        /// <summary>
        /// Maximal angekreuzte Optionen
        /// </summary>
        public int MaxChecked
        {
            get { return this._maxChecked; }
            set { this._maxChecked = value; }
        }

        #endregion

        #region Overrides

        /// <summary>
        /// Führt die Gültigkeitsprüfung durch
        /// </summary>
        /// <returns></returns>
        protected override bool EvaluateIsValid()
        {
            CheckBoxList control = (CheckBoxList)this.FindControl(
                                    base.ControlToValidate);
            int counter = 0;

            foreach (ListItem item in control.Items)
            {
                if (item.Selected)
                    counter++;
            }

            bool minFlag = counter >= this._minChecked;
            bool maxFlag = counter <= this._maxChecked;

            if (this._equalsChecked != 0)
            {
                return counter == this._equalsChecked;
            }
            else
            {
                if (this._minChecked != 0 && this._maxChecked != 0)
                {
                    if (minFlag && maxFlag)
                        return true;
                }
                else
                {
                    if (this._minChecked != 0 && minFlag)
                        return true;

                    if (this._maxChecked != 0 && maxFlag)
                        return true;
                }
            }

            return false;
        }

        protected override bool ControlPropertiesValid()
        {
            // Überschrieben und durch eigene Prüfung ersetzt.
            // Die Basisklasse lässt keine CheckBoxList Controls zu
            CheckBoxList control = (CheckBoxList)this.FindControl(
                                                 this.ControlToValidate);
            return control != null;
        }

        #endregion
    }
}

Ich habe ein Beispielprojekt erstellt, das die Benutzung demonstriert und den Quelltext enthält:

Veröffentlicht Mittwoch, 22. August 2007 23:57 von Peter Bucher

Kommentare

# Alles neu oder was?

Info &amp; Statistiken Ja, es gibt Neuigkeiten auf meinem Blog, aber es ist nicht alles neu ;-) Unter

Sonntag, 29. Juni 2008 06:16 by Peter Bucher
Anonyme Kommentare sind nicht zugelassen