2012-04-04 25 views
5

Estoy usando System.Windows.Forms.TextBox. De acuerdo con los documentos, la propiedad MaxLength controla la cantidad de caracteres que un usuario puede ingresar o pegar en el TextBox (es decir, se puede agregar más que mediante programación mediante, por ejemplo, la función AppendText o la propiedad Text). La cantidad actual de caracteres se puede obtener de la propiedad TextLength.Cantidad máxima de caracteres de TextBox (no es MaxLength)

  1. ¿Hay alguna manera de establecer la cantidad máxima de caracteres sin hacer un limitador personalizado que llame al Clear() cuando se alcanza el límite personalizado?
  2. De todos modos, ¿cuál es el máximo absoluto que puede contener? ¿Está solo limitado por la memoria?
  3. ¿Qué sucede cuando se alcanza el máximo/la memoria está llena? ¿Choque? ¿Se borraron las líneas x superiores?
  4. ¿Cuál sería la mejor manera de limpiar manualmente solo las líneas x superiores? ¿Operación subcadena?

corregir: Lo he probado para almacenar más de 600k caracteres, independientemente de MaxLength, momento en el que paré manualmente el programa y le hice esta pregunta.

+0

¿has probado algo? – Virus

+0

@satish He intentado 4), textBox.Text = textBox.Text.Remove (0, charsToRemove) parece funcionar bien, pero causa un pequeño bloqueo cuando charsToRemove es grande (se intentó con 100k). Esto no es gran cosa. Los otros no puedo probar porque aún no he alcanzado ningún límite máximo. –

+0

¿Sería un RichTextBox una mejor opción para usted? [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.aspx) dice esto: "Las aplicaciones que ya usan controles TextBox se pueden adaptar fácilmente para hacer uso de controles RichTextBox .Sin embargo, el control RichTextBox no tiene el mismo límite de capacidad de caracteres 64K del control TextBox. " –

Respuesta

9
  1. Claro. Anular/sombrear AppendText y Text en una clase derivada. Vea el código a continuación.
  2. El campo de respaldo para la propiedad Text es una cadena antigua simple (campo privado System.Windows.Forms.Control::text). Por lo tanto, la longitud máxima es la longitud máxima de una cadena, que es "2 GB, o aproximadamente mil millones de caracteres" (consulte System.String).
  3. ¿Por qué no lo intentas y ves?
  4. Depende de sus requisitos de rendimiento. Puede usar la propiedad Lines, pero tenga en cuenta que cada vez que la llame, su entero text se analizará internamente en líneas. Si está superando los límites de la duración del contenido, sería una mala idea. Entonces, esa forma más rápida (en términos de ejecución, no de codificación) sería pasar por los personajes y contar los cr/lfs. Por supuesto, necesita decidir lo que está considerando un final de línea.

Código: Hacer cumplir MaxLength propiedad, incluso cuando se establece el texto mediante programación:

using System; 
using System.Windows.Forms; 
namespace WindowsFormsApplication5 { 
    class TextBoxExt : TextBox { 
     new public void AppendText(string text) { 
      if (this.Text.Length == this.MaxLength) { 
       return; 
      } else if (this.Text.Length + text.Length > this.MaxLength) { 
       base.AppendText(text.Substring(0, (this.MaxLength - this.Text.Length))); 
      } else { 
       base.AppendText(text); 
      } 
     } 

     public override string Text { 
      get { 
       return base.Text; 
      } 
      set { 
       if (!string.IsNullOrEmpty(value) && value.Length > this.MaxLength) { 
        base.Text = value.Substring(0, this.MaxLength); 
       } else { 
        base.Text = value; 
       } 
      } 
     } 

     // Also: Clearing top X lines with high performance 
     public void ClearTopLines(int count) { 
      if (count <= 0) { 
       return; 
      } else if (!this.Multiline) { 
       this.Clear(); 
       return; 
      } 

      string txt = this.Text; 
      int cursor = 0, ixOf = 0, brkLength = 0, brkCount = 0; 

      while (brkCount < count) { 
       ixOf = txt.IndexOfBreak(cursor, out brkLength); 
       if (ixOf < 0) { 
        this.Clear(); 
        return; 
       } 
       cursor = ixOf + brkLength; 
       brkCount++; 
      } 
      this.Text = txt.Substring(cursor); 
     } 
    } 

    public static class StringExt { 
     public static int IndexOfBreak(this string str, out int length) { 
      return IndexOfBreak(str, 0, out length); 
     } 

     public static int IndexOfBreak(this string str, int startIndex, out int length) { 
      if (string.IsNullOrEmpty(str)) { 
       length = 0; 
       return -1; 
      } 
      int ub = str.Length - 1; 
      int intchr; 
      if (startIndex > ub) { 
       throw new ArgumentOutOfRangeException(); 
      } 
      for (int i = startIndex; i <= ub; i++) { 
       intchr = str[i]; 
       if (intchr == 0x0D) { 
        if (i < ub && str[i + 1] == 0x0A) { 
         length = 2; 
        } else { 
         length = 1; 
        } 
        return i; 
       } else if (intchr == 0x0A) { 
        length = 1; 
        return i; 
       } 
      } 
      length = 0; 
      return -1; 
     } 
    } 
} 
+0

Vine aquí para la tercera pregunta y encontré esta respuesta muy útil -_- ... no. Al menos podría decir que realmente no sabe. –

+3

@ JorgeGalvão Mi punto es que probar esto es trivial: crear un cuadro de texto, establecer su valor en 'nueva cadena ('', int.MaxValue)' o algo similar, y ver qué pasa. La comunidad de StackOverflow anima a los carteles a probar primero , luego pide ayuda. –

2

La propiedad Text de System.Windows.Forms.TextBox es una cadena, así que en teoría puede ser el max length of a string

+1

Como [señalado en esta respuesta] (http://stackoverflow.com/a/13528057/1037948) si establece el' MaxLength 'property to 0 usará el límite más alto posible. – drzaus

0

El límite teórico es el de una cadena, ~ 2 GB. Sin embargo, en realidad, depende de las condiciones en su proceso de ejecución. Equivale al tamaño de la sección contigua más grande disponible de memoria que una cadena puede asignar en cualquier momento dado. Tengo un cuadro de texto en una aplicación que está cometiendo un error de aproximadamente 450 MB.

Cuestiones relacionadas