Maxlength sur les textbox multiline

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 125 fois - Téléchargée 16 fois

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

Ajouter un commentaire

Commentaires

jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
Bonjour,

j'ai plusieurs remarques :-)

1. Plutot que de mettre ce code dans le page_load de chacune de tes pages, je t'invite à te renseigner au niveau des adapters de rendu qui te permettra de mettre ce code dans un endroit spécifique (une assembly=dll) et ensuite l'associer au site web via un fichier de config (dans app_browser)

2. Question perf évite les concaténations de String
String truc = "chose"
tryc += "pouet";
et ~équivalent à
String truc = @"
chose
pouet"
mais niveau perf c'est bien meilleur (sauf si le compilo C# optimise de lui meme le code)

3. Au niveau du code JavaScript je te conseille de faire du code unobstructive, c'est à dire de pas t'abonner aux events de l'élément HTML mais via du js. par exemple document.getElementById('idTruc').onEvent = function(){ pouet(); } Tu peux également aller plus loin en faisant une classe JavaScript voir encore plus loin en faisant un extender via ASP.net Ajax.

Bon courage ;-)
darktoto85
Messages postés
1
Date d'inscription
mardi 31 août 2004
Statut
Membre
Dernière intervention
20 février 2008
-
Merci beaucoup pour ce bout de code très très pratique !! Par contre pour ceux qui ont une erreur sur "ClientScript.RegisterClientScriptBlock" il suffit simplement de rajouter "Page." devant ou peut etre de la mettre en using?
ranouf
Messages postés
237
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
31 août 2009
-
jesusonline > c la 2e fois que je te vois expliquer ce genre de principe, aurais tu un exemple qui tourne la dessus ? Une source ? Un tutorial ?
L idee est bonne mais g besoin de plus d info pour la mettre en pratique.
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
quel principe ?
alpamcdlm
Messages postés
1
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2009
-
Ce code me plait beaucoup, et je m'en sers sans problème pour les texbox MultiLine!

Mais je n'arrive pas à m'en servir pour les texbox SingleLine, car le javascript ne reconnait pas le MaxLength de ces textbox...
N'y aurait-il pas un moyen de récupérer cette propriété en javascript?

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.