it-swarm.com.de

Maxlength für mehrzeiliges Textfeld angeben

Ich versuche, asp zu verwenden:

<asp:TextBox ID="txtInput" runat="server" TextMode="MultiLine"></asp:TextBox>

Ich möchte eine Möglichkeit, die maxlength-Eigenschaft anzugeben, aber anscheinend gibt es keine Möglichkeit für einen multiline textbox. Ich habe versucht, JavaScript für das Ereignis onkeypress zu verwenden: 

onkeypress="return textboxMultilineMaxNumber(this,maxlength)"

function textboxMultilineMaxNumber(txt, maxLen) {
    try {
        if (txt.value.length > (maxLen - 1)) return false;
    } catch (e) { }
    return true;
}

Das Problem mit dieser JavaScript-Funktion besteht zwar darin, dass das Problem besteht, dass Sie nach dem Schreiben von Zeichen keine Zeichen löschen und ersetzen können. Dieses Verhalten ist jedoch nicht erwünscht.

Haben Sie eine Idee, was ich möglicherweise im obigen Code ändern könnte, um das oder andere Wege zu umgehen?

70
Blerta

probiere dieses Javascript:

function checkTextAreaMaxLength(textBox,e, length)
{

        var mLen = textBox["MaxLength"];
        if(null==mLen)
            mLen=length;

        var maxLength = parseInt(mLen);
        if(!checkSpecialKeys(e))
        {
         if(textBox.value.length > maxLength-1)
         {
            if(window.event)//IE
              e.returnValue = false;
            else//Firefox
                e.preventDefault();
         }
    }   
}
function checkSpecialKeys(e)
{
    if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
        return false;
    else
        return true;
}

Auf dem Steuerelement rufen Sie es so auf:

<asp:TextBox Rows="5" Columns="80" ID="txtCommentsForSearch" MaxLength='1999' onkeyDown="checkTextAreaMaxLength(this,event,'1999');"  TextMode="multiLine" runat="server"> </asp:TextBox>

Sie können auch einfach die Funktion checkSpecialKeys verwenden, um die Eingabe Ihrer Javascript-Implementierung zu überprüfen.

40
Raúl Roa

Verwenden Sie stattdessen einen regulären Ausdrucksprüfer . Dies funktioniert auf der Clientseite mit JavaScript, aber auch, wenn JavaScript deaktiviert ist (da die Längenprüfung auch auf dem Server durchgeführt wird).

Das folgende Beispiel überprüft, ob der eingegebene Wert zwischen 0 und 100 Zeichen lang ist:

<asp:RegularExpressionValidator runat="server" ID="valInput"
    ControlToValidate="txtInput"
    ValidationExpression="^[\s\S]{0,100}$"
    ErrorMessage="Please enter a maximum of 100 characters"
    Display="Dynamic">*</asp:RegularExpressionValidator>

Es gibt natürlich komplexere Regexen, die Sie verwenden können, um Ihren Zwecken besser zu entsprechen.

72
Alex Angas

Roll deinen eigenen:

function Count(text) 
{
    //asp.net textarea maxlength doesnt work; do it by hand
    var maxlength = 2000; //set your value here (or add a parm and pass it in)
    var object = document.getElementById(text.id)  //get your object
    if (object.value.length > maxlength) 
    {
        object.focus(); //set focus to prevent jumping
        object.value = text.value.substring(0, maxlength); //truncate the value
        object.scrollTop = object.scrollHeight; //scroll to the end to prevent jumping
        return false;
    }
    return true;
}

Rufe so an:

<asp:TextBox ID="foo" runat="server" Rows="3" TextMode="MultiLine" onKeyUp="javascript:Count(this);" onChange="javascript:Count(this);" ></asp:TextBox>
21
scottyboiler

halte es einfach. Die meisten modernen Browser unterstützen ein Maxlength-Attribut für einen Textbereich (einschließlich IE). Fügen Sie dieses Attribut daher einfach in Code-Behind hinzu. Kein JS, kein Jquery, keine Vererbung, eigener Code, kein Aufwand, kein Muss.

VB.Net:

fld_description.attributes("maxlength") = 255

C #

fld_description.attributes["maxlength"] = 255
20
Mike A.

verwenden Sie das benutzerdefinierte Attribut maxsize = "100".

<asp:TextBox ID="txtAddress" runat="server"  maxsize="100"
      Columns="17" Rows="4" TextMode="MultiLine"></asp:TextBox>
   <script>
       $("textarea[maxsize]").each(function () {
         $(this).attr('maxlength', $(this).attr('maxsize'));
         $(this).removeAttr('maxsize'); 
       });
   </script>

das wird so rendern 

<textarea name="ctl00$BodyContentPlac
eHolder$txtAddress" rows="4" cols="17" id="txtAddress" maxlength="100"></textarea>
4
Ashwini Jindal

Eine andere Möglichkeit, das Problem bei Browsern (Firefox, Chrome, Safari) zu beheben, die Maxlength für Textbereiche (HTML5) ohne Javascript unterstützen, ist das Ableiten einer Unterklasse der System.Web.UI.WebControls.TextBox-Klasse und das Überschreiben der Render-Methode. Fügen Sie in der überschriebenen Methode das Maxlength-Attribut vor dem normalen Rendern hinzu.

protected override void Render(HtmlTextWriter writer)
{
    if (this.TextMode == TextBoxMode.MultiLine
        && this.MaxLength > 0)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
    }

    base.Render(writer);
}
4
Keith K
$('#txtInput').attr('maxLength', 100);
2
malinois

Ich habe verschiedene Ansätze ausprobiert, aber jeder hatte einige Schwachstellen (d. H. Mit Ausschneiden und Einfügen oder Browserkompatibilität). Dies ist die Lösung, die ich gerade verwende:

function multilineTextBoxKeyUp(textBox, e, maxLength) {
    if (!checkSpecialKeys(e)) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length) {
            textBox.value = textBox.value.substring(0, maxLength);
        }
    }
}

function multilineTextBoxKeyDown(textBox, e, maxLength) {
    var selectedText = document.selection.createRange().text;
    if (!checkSpecialKeys(e) && !e.ctrlKey && selectedText.length == 0) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length - 1) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            else {
                e.returnValue = false;
            }
        }
    }
}

function checkSpecialKeys(e) {
    if (e.keyCode != 8 && e.keyCode != 9 && e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 && e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40) {
        return false;
    } else {
        return true;
    }
}

In diesem Fall rufe ich multilineTextBoxKeyUp für key up und multilineTextBoxKeyDown für key down auf:

myTextBox.Attributes.Add("onkeyDown", "multilineTextBoxKeyDown(this, event, '" + maxLength + "');");
myTextBox.Attributes.Add("onkeyUp", "multilineTextBoxKeyUp(this, event, '" + maxLength + "');");
2
Sue Maurizio

Dinge haben sich in HTML5 geändert:

ASPX:

<asp:TextBox ID="txtBox" runat="server" maxlength="2000" TextMode="MultiLine"></asp:TextBox>

C #:

if (!IsPostBack)
{
    txtBox.Attributes.Add("maxlength", txtBox.MaxLength.ToString());
}

Gerendertes HTML:

<textarea name="ctl00$DemoContentPlaceHolder$txtBox" id="txtBox" maxlength="2000"></textarea>

Die Metadaten für Attributes:

Zusammenfassung: Ruft die Sammlung von beliebigen Attributen (nur zum Rendern) ab, die nicht den Eigenschaften des Steuerelements entsprechen. 

Rückgabe: Ein System.Web.UI.AttributeCollection von Name und Wert-Paaren.

2
Kristopher

Schauen Sie sich this an. Der einzige Weg, es zu lösen, ist durch Javascript, wie Sie es versucht haben. 

EDIT: Ändern Sie das Ereignis in Tastendruck. 

1
Christian13467

Verwenden Sie HTML-Textbereich mit runat="server", um auf der Serverseite darauf zuzugreifen. Diese Lösung hat weniger Schmerzen als die Verwendung von Javascript oder Regex.

<textarea runat="server" id="txt1" maxlength="100" />

Hinweis: Um auf die Text-Eigenschaft auf dem Server zuzugreifen, sollten Sie txt1.Value anstelle von txt1.Text verwenden.

1
Ali Gonabadi

Das folgende Beispiel in JavaScript/Jquery macht das

<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
<script type="text/javascript">
     function count(text, event) {

         var keyCode = event.keyCode;

         //THIS IS FOR CONTROL KEY
         var ctrlDown = event.ctrlKey;

         var maxlength = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val().length;

         if (maxlength < 200) {
             event.returnValue = true;
         }
         else {

             if ((keyCode == 8) || (keyCode == 9) || (keyCode == 46) || (keyCode == 33) || (keyCode == 27) || (keyCode == 145) || (keyCode == 19) || (keyCode == 34) || (keyCode == 37) || (keyCode == 39) || (keyCode == 16) || (keyCode == 18) ||
                 (keyCode == 38) || (keyCode == 40) || (keyCode == 35) || (keyCode == 36) || (ctrlDown && keyCode == 88) || (ctrlDown && keyCode == 65) || (ctrlDown && keyCode == 67) || (ctrlDown && keyCode == 86)) 

                  {
                 event.returnValue = true;
                  }

             else {

                 event.returnValue = false;
             }
         }

     }

     function substr(text)
      {
          var txtWebAdd = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val();
          var substrWebAdd;
          if (txtWebAdd.length > 200) 
          {                 
              substrWebAdd = txtWebAdd.substring(0, 200);                                  
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val('');
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val(substrWebAdd); 

          }
     }                  

0

Dieser Ausschnitt funktionierte in meinem Fall. Ich suchte nach der Lösung und dachte daran, diese zu schreiben, damit sie jedem zukünftigen Leser helfen kann. 

ASP

<asp:TextBox ID="tbName" runat="server" MaxLength="250" TextMode="MultiLine" onkeyUp="return CheckMaxCount(this,event,250);"></asp:TextBox>

Java Script

function CheckMaxCount(txtBox,e, maxLength)
{
    if(txtBox)
    {  
        if(txtBox.value.length > maxLength)
        {
            txtBox.value = txtBox.value.substring(0, maxLength);
        }
        if(!checkSpecialKeys(e))
        {
            return ( txtBox.value.length <= maxLength)
        }
    }
}

function checkSpecialKeys(e)
{
    if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
        return false;
    else
        return true;
}

@ Raúl Roa Answer hat im Falle von Copy/Paste für mich gearbeitet. während dies tut. 

0
Afnan Ahmad

So haben wir es gemacht (hält den gesamten Code an einem Ort):

<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"/>
<% TextBox1.Attributes["maxlength"] = "1000"; %>

Nur für den Fall, dass jemand 2018 noch Webforms einsetzt.

0
Alex
$("textarea[maxlength]").on("keydown paste", function (evt) {
            if ($(this).val().length > $(this).prop("maxlength")) {
                if (evt.type == "paste") {
                    $(this).val($(this).val().substr(0, $(this).prop("maxlength")));
                } else {
                    if ([8, 37, 38, 39, 40, 46].indexOf(evt.keyCode) == -1) {
                        evt.returnValue = false;
                        evt.preventDefault();
                    }
                }
            }
        });
0
Alex

sie können die maximale Länge für das mehrzeilige Textfeld in pageLoad Javascript Event angeben

function pageLoad(){
                     $("[id$='txtInput']").attr("maxlength","10");
                    }

Ich habe die Eigenschaft max length von txtInput multiline textbox auf 10 Zeichen in der PageLoad () - Javascript-Funktion festgelegt

0
Sumit Jambhale

Fast alle modernen Browser unterstützen jetzt die Verwendung des Attributs maxlength für Textbereichselemente. (https://caniuse.com/#feat=maxlength)

Um das Maxlength-Attribut in eine mehrzeilige TextBox aufzunehmen, können Sie einfach die Attributes-Auflistung im dahinterliegenden Code wie folgt ändern:

txtTextBox.Attributes["maxlength"] = "100";

Wenn Sie nicht den Code dahinter verwenden müssen, um dies anzugeben, können Sie einfach ein benutzerdefiniertes Steuerelement erstellen, das von TextBox abgeleitet wird:

public class Textarea : TextBox
{
    public override TextBoxMode TextMode
    {
        get { return TextBoxMode.MultiLine; }
        set { }
    }

    protected override void OnPreRender(EventArgs e)
    {
        if (TextMode == TextBoxMode.MultiLine && MaxLength != 0)
        {
            Attributes["maxlength"] = MaxLength.ToString();
        }

        base.OnPreRender(e);
    }
}
0
Daniel Arant

Dies ist dasselbe wie bei @ KeithKs Antwort, aber mit ein paar weiteren Details. Erstellen Sie zuerst ein neues Steuerelement basierend auf TextBox.

using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyProject
{
    public class LimitedMultiLineTextBox : System.Web.UI.WebControls.TextBox
    {
        protected override void Render(HtmlTextWriter writer)
        {
            this.TextMode = TextBoxMode.MultiLine;

            if (this.MaxLength > 0)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
            }

            base.Render(writer);
        }
    }
}  

Beachten Sie, dass der obige Code den Textmodus immer auf mehrzeilig setzt. 

Um dies zu verwenden, müssen Sie es auf der aspx-Seite registrieren. Dies ist erforderlich, da Sie mit dem TagPrefix darauf verweisen müssen. Andernfalls werden bei der Kompilierung benutzerdefinierte generische Steuerelemente angezeigt. 

<%@ Register Assembly="MyProject" Namespace="MyProject" TagPrefix="mp" %>

<mp:LimitedMultiLineTextBox runat="server" Rows="3" ...
0
BurnsBA