TextBox maximum amount of characters (it's not MaxLength)

前端 未结 3 1409
陌清茗
陌清茗 2020-12-16 04:14

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

相关标签:
3条回答
  • 2020-12-16 04:29

    The theoretical limit is that of a string, ~2GB. However, in reality, it depends upon the conditions in your running process. It equates to the size of the largest available contiguous section of memory that a string can allocate at any given time. I have a textbox in an application that is erroring at about 450MB.

    0 讨论(0)
  • 2020-12-16 04:36
    1. Sure. Override / shadow AppendText and Text in a derived class. See code below.
    2. 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).
    3. Why don't you try it and see?
    4. 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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-16 04:43

    The Text property of System.Windows.Forms.TextBox is a string, so in theory it can be the max length of a string

    0 讨论(0)
提交回复
热议问题