TextBox maximum amount of characters (it's not MaxLength)
.net, c#, winforms
Solution
- Sure. Override / shadow `AppendText` and `Text` in a derived class. See code below.
- The backing field for the `Text` property is a plain old string (private field `System.Windows.Forms.Control::text`). So the maximum length is the max length of a string, which is "2 GB, or about 1 billion characters" (see System.String).
- Why don't you try it and see?
- It depends on your performance requirements. You could use the `Lines` property, but beware that every time you call it your entire `text` will be internally parsed into lines. If you're pushing the limits of content length this would be a bad idea. So that faster way (in terms of execution, not coding) would be to zip through the characters and count the cr / lfs. You of course need to decide what you are considering a line ending.
Code: Enforce `MaxLength` property even when setting text programmatically:
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;
}
}
}
Problem
I'm using a `System.Windows.Forms.TextBox`. According to the docs, the `MaxLength` property controls the amount of characters enter a user can type or paste into the TextBox (i.e. more than that can be added programmatically by using e.g. the `AppendText` function or the `Text` property). The current amount of characters can be got from the `TextLength` property. - Is there any way to set the maximum amount of characters without making a custom limiter which calls `Clear()` when the custom limit is reached? - Regardless, what is the absolute maximum it can hold? Is it only limited by memory? - What happens when the maximum is reached / memory is full? Crash? Top x lines is cleared? - What would be the best way to manually clear only the top x lines? Substring operation? edit: I have tested it to hold more than 600k characters, regardless of `MaxLength`, at which point I manually stopped the program and asked this question.