Maxlength sur les textbox multiline

Contenu du snippet

J'avais besoin de limiter le nombre de caractères saisis dans ces zones de texte pour l'application qu'on m'a donné à maintenir à mon Taf...
J'ai eu la surprise de voir que MaxLength ne fonctionnait pas si le TextBox était "Multiline".
Ma connexion à Internet au bureau étant inexistante, j'ai écumé le net toute la soirée (merci GG) à la recherche de LA solution. (cette précision est pour revendiquer ce code source comme étant le mien et pouvoir vous l'offrir, désolé si je suis rude il est 1h30 du mat')
Je n'ai trouvé que des solutions partielles qui ne me convenaient pas, j'ai donc compilé toutes les techniques en une pour avoir "THE Ultimate Solution".

Utilisation très simple :
copier coller la definition de la variable MLTextBoxCount, la fonction PatchMLTextBox et le contenu de mon PageLoad à placer au début du vôtre...
Et hop ! Mâââgique !!! vos TextBox Multiline reconnaitront la valeur mise dans la propriété MaxLength...

Source / Exemple :


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    static protected int MLTextBoxCount = 0;

    protected void PatchMLTextBox(Control parent)
    {

        foreach (Control c in parent.Controls)
        {
            if (c.HasControls()) PatchMLTextBox(c);
            if (c is TextBox)
            {
                if (((TextBox)c).TextMode == TextBoxMode.MultiLine)
                {
                    if (((TextBox)c).MaxLength > 0)
                    {
                        MLTextBoxCount++;
                        // Ajout en dur de la propriété MaxLength car ASP.NET le vire dans ce cas là
                        ((TextBox)c).Attributes.Add("MaxLength", ((TextBox)c).MaxLength.ToString());
                        // Ajout des evenements à intercepter pour verifier les longueurs
                        ((TextBox)c).Attributes.Add("onkeypress", "return verifyMaxLengthOnKey(this);");
                        ((TextBox)c).Attributes.Add("onpaste", "return verifyMaxLengthOnPaste(this);");
                        ((TextBox)c).Attributes.Add("ondrop", "return verifyMaxLengthOnDragDrop(this);");
                    }
                }
            }

        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        MLTextBoxCount = 0;
        PatchMLTextBox(this);
        if (MLTextBoxCount > 0)
        {
            // Si c'est utile on ajoute le corps des fonctions Javascript

            ClientScript.RegisterClientScriptBlock(this.GetType(), "txtVarAlert", "var ShowAlertIfMaxLength = true;", true);
            
            String  OnKeyFunction  = "function verifyMaxLengthOnKey(ref) {\n";
                    OnKeyFunction += "  var SelText;\n";
                    OnKeyFunction += "  var Range;\n";
                    OnKeyFunction += "  if (ref.MaxLength != null) {\n";
                    OnKeyFunction += "    Range = window.document.selection.createRange();\n";
                    OnKeyFunction += "    SelText = Range.text;\n";
                    OnKeyFunction += "    if (SelText != null && SelText != '' && SelText != undefined) {\n";
                    OnKeyFunction += "      return true;\n";
                    OnKeyFunction += "    }\n";
                    OnKeyFunction += "    if (ref.value.length >= ref.MaxLength) {\n";
                    OnKeyFunction += "      return false;\n";
                    OnKeyFunction += "    }\n";
                    OnKeyFunction += "    return true;\n";
                    OnKeyFunction += "  }\n";
                    OnKeyFunction += "}\n";
            ClientScript.RegisterClientScriptBlock(this.GetType(), "txtOnKey", OnKeyFunction, true);

            String  OnPasteFunction  = "function verifyMaxLengthOnPaste(ref) {\n";
                    OnPasteFunction += "  var Data = window.clipboardData.getData('Text');\n";
                    OnPasteFunction += "  var SelText;\n";
                    OnPasteFunction += "  var Range; \n";
                    OnPasteFunction += "  var msg; \n";
                    OnPasteFunction += "\n";
                    OnPasteFunction += "  if (ref.MaxLength != null) {\n";
                    OnPasteFunction += "    Range = window.document.selection.createRange();\n";
                    OnPasteFunction += "    SelText = Range.text; \n";
                    OnPasteFunction += "    if (SelText != null && SelText != '' && SelText != undefined) {\n";
                    OnPasteFunction += "      if ((ref.value.length - SelText.length) + Data.length < ref.MaxLength) {\n";
                    OnPasteFunction += "        return true; \n";
                    OnPasteFunction += "      }\n";
                    OnPasteFunction += "    }\n";
                    OnPasteFunction += "    if (ref.value.length + Data.length >= ref.MaxLength) {\n";
                    OnPasteFunction += "      if (ShowAlertIfMaxLength == true) {\n";
                    OnPasteFunction += "        msg = 'Le texte à coller ne peut être contenu ';\n";
                    OnPasteFunction += "        msg += 'dans cette zone de saisie \\n'; \n";
                    OnPasteFunction += "        msg += 'limitée à ' + ref.MaxLength + ' caractères ';\n";
                    OnPasteFunction += "        alert(msg); \n";
                    OnPasteFunction += "      }\n";
                    OnPasteFunction += "     // return false;\n";
                    OnPasteFunction += "      window.clipboardData.setData('Text',Data.substring(0,ref.MaxLength-ref.value.length));\n";
                    OnPasteFunction += "    }\n";
                    OnPasteFunction += "    return true;\n";
                    OnPasteFunction += "  }\n";
                    OnPasteFunction += "}\n";

            ClientScript.RegisterClientScriptBlock(this.GetType(), "txtOnPaste", OnPasteFunction, true);

            String  OnDropFunction  = "function verifyMaxLengthOnDragDrop(ref) {\n";
                    OnDropFunction += "    var seltext;\n";
                    OnDropFunction += "    var range;\n";
                    OnDropFunction += "    var data;\n";
                    OnDropFunction += "    var msg;\n";
                    OnDropFunction += "\n";
                    OnDropFunction += "    if (ref.MaxLength != null) {\n";
                    OnDropFunction += "        data = window.event.dataTransfer.getData('Text');\n";
                    OnDropFunction += "        range = window.document.selection.createRange();\n";
                    OnDropFunction += "        seltext = range.text;\n";
                    OnDropFunction += "        if (seltext != null && seltext != '' && seltext != undefined) {\n";
                    OnDropFunction += "            if ((ref.value.length - seltext.length) + data.length <= ref.MaxLength) {\n";
                    OnDropFunction += "            return true;\n";
                    OnDropFunction += "            }\n";
                    OnDropFunction += "        }\n";
                    OnDropFunction += "        if (ref.value.length + data.length > ref.MaxLength) {\n";
                    OnDropFunction += "            if (ShowAlertIfMaxLength == true) {\n";
                    OnDropFunction += "                msg = 'Le texte à déposer ne peut être contenu ';\n";
                    OnDropFunction += "                msg += 'dans cette zone de saisie \\n'; \n";
                    OnDropFunction += "                msg += 'limitée à ' + ref.MaxLength + ' caractères ';\n";
                    OnDropFunction += "                alert(msg);\n";
                    OnDropFunction += "            }\n";
                    OnDropFunction += "            return false; // Si la ligne suivante fonctionnait il faudrait virer celle là\n";
                    OnDropFunction += "            // window.event.dataTransfer.setData('Text',data.substring(0,ref.MaxLength-ref.value.length));\n";
                    OnDropFunction += "        }\n";
                    OnDropFunction += "        return true;\n";
                    OnDropFunction += "    }\n";
                    OnDropFunction += "}\n";

            ClientScript.RegisterClientScriptBlock(this.GetType(), "txtOnDrop", OnDropFunction, true);
        }

        // ==================================================================
        // = Ici débute votre PageLoad
        // ==================================================================

}

Conclusion :


Les differents sources qui m'ont inspirés sont (c) by leurs auteurs respectifs...
Merci à eux.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.