TextBox的最大字符数(它不是MaxLength)

本文关键字:MaxLength 字符 TextBox | 更新日期: 2023-09-27 18:29:55

我使用的是System.Windows.Forms.TextBox。根据文档,MaxLength属性控制用户可以键入或粘贴到TextBox中的字符数(即,可以通过使用AppendText函数或Text属性以编程方式添加的字符数)。当前的字符数可以从TextLength属性中获取。

  1. 是否有任何方法可以设置最大字符数,而不需要在达到自定义限制时调用Clear()的自定义限制
  2. 不管怎样,它能保持的绝对最大值是多少?它只受记忆的限制吗
  3. 当达到最大值/内存已满时会发生什么?崩溃顶部x行已清除
  4. 手动清除顶部x行的最佳方式是什么?基板操作

edit:我已经测试过它可以容纳超过600k个字符,而不考虑MaxLength,这时我手动停止了程序并问了这个问题。

TextBox的最大字符数(它不是MaxLength)

  1. 当然。重写/阴影派生类中的AppendTextText。请参阅下面的代码
  2. Text属性的后备字段是一个普通的旧字符串(专用字段System.Windows.Forms.Control::text)。因此,最大长度是字符串的最大长度,即"2GB,约10亿个字符"(请参阅System.string)
  3. 你为什么不试试看
  4. 这取决于您的性能要求。您可以使用Lines属性,但要注意,每次调用它时,整个text都会在内部解析为行。如果你正在突破内容长度的限制,这将是一个坏主意。因此,更快的方法(就执行而言,而不是编码而言)是快速浏览字符并计算cr/lf。当然,你需要决定你认为一行的结尾是什么

代码:即使以编程方式设置文本,也要强制执行MaxLength属性:

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;
        }
    }
}

理论极限是字符串的极限,~2GB。然而,实际上,这取决于您运行过程中的条件。它相当于字符串在任何给定时间都可以分配的最大可用连续内存段的大小。我在一个应用程序中有一个文本框,错误大约为450MB。

System.Windows.Forms.TextBox的Text属性是一个字符串,因此理论上它可以是字符串的最大长度