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.

Original source

Related problems