c# - 如何在 winrt 中按字节限制文本框最大长度?

标签 c# sql unicode windows-runtime winrt-xaml

对于TextBox,有一个属性“MaxLength”,但它把所有ascii和unicode都算作1个字符。
但是在数据库中,我们设置了字段 varchar(n) 。它处理ascii 1和unicode 2。

如何限制按字节输入的文本框?

因为在文本更改之前没有通知,所以解决方法是这样的。

public class TextBoxEx : TextBox
    {
    private bool bIsChanging;

    public TextBoxEx()
    {
        TextChanged += TextBoxEx_TextChanged;
    }

    public int MaxByteLength { private get; set; }

    private void TextBoxEx_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (bIsChanging || MaxByteLength == 0 || Text.Length*2 <= MaxByteLength)
            return;
        bIsChanging = true;
        int start = SelectionStart;
        Text = TruncateString(Text, MaxByteLength);
        SetLimit();
        SelectionStart = start;
        bIsChanging = false;
    }

    private void SetLimit()
    {
        MaxLength = MaxByteLength - Encoding.UTF8.GetBytes(Text).Length + Text.Length;
    }

    private static string TruncateString(string text, int max)
    {
        if (max == 0) return text;
        byte[] bytes = Encoding.UTF8.GetBytes(text);
        if (bytes.Length <= max) return text;
        char[] c = text.ToCharArray();
        var sb = new StringBuilder();
        int count = 0;
        foreach (char t in c)
        {
            count += Encoding.UTF8.GetByteCount(t.ToString());
            if (max >= count)
            {
                sb.Append(t);
            }
            else
            {
                break;
            }
        }
        return sb.ToString();
    }
}

最佳答案

ascii码也是十六进制的,也就是说一个字符代表2个字节的信息

例如:“A”是 41(Hx) 0100 0001 也就是 2 个字节等等

关于c# - 如何在 winrt 中按字节限制文本框最大长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366297/

相关文章:

c# - 报告/监控长流程进度的设计模式

c# - 在 MVC 中,对于具有多个构造函数的 Controller ,我如何指示要调用哪个构造函数?

c# - 为什么在 .NET 中没有保留一些相同的字符串?

sql - 在 Postgresql 中将记录数组转换为 JSON

sql - SINGLE_NCLOB 需要一个 UNICODE (widechar) 输入文件

c# - 打印带有字母的倒三角形

mysql - 如何从按降序排序的记录中找到最后5条记录?

sql - 使用 RAISERROR 指示 ACCESS DENIED 错误

带有度数符号的linux鞭尾

oracle - oracle 12.1 db sqlplus 错误乱码