TextBox按字节长度限制输入

2019-09-10 15:58栏目:最大平台
TAG:

前两日做一个品类的时候,由于页面未有范围Text博克斯的输入长度,所以,后台向来报错了,高出数据库最大的长短。

数据库的长度是根据字节来计量的,并且分歧的编码格式,汉字占用的字节长度又不一致样,举个例子,大家用的是UTF8,一个中华人民共和国字是3个字节,而暗中同意的Default,二个汉字是2个字节。

TextBox有个马克斯Length属性,不过那个本性是不太适合要求的,因为那一个尺寸,是限量了输入的长短,比方设置20,则无论数字、字母、汉字最大的尺寸都以十几个,但是,对于数据库来讲,长度却不平等了,

所以,不能够利用那几个性情。

为了,统一化解下这一个难题,所以给TextBox写了增大属性。

 

一、想要的遵从

用了增大属性,想到达一个哪些效果呢,就是像设置马克斯Length一样,一旦到了数据库的字节长度,就不再能输入了。

据此,最开头想找叁个限量输入的脾性,可惜小编学的太浅薄,没有找到有关的品质,由此,最终在同事的提醒下,能够记下上贰次的剧情,然后,假若超长,就用上二次的开始和结果打开赋值

图片 1

图片 2

二、附加属性

既然如此要用附加属性,而且方便使用,那肯定要给开拓者暴暴露来至少五个:MaxByteLength用来安装最大的字节数,EncodeModel用来安装编码格式

EncodeModel是用Menu类型来做的,方便使用时直接敲内容

图片 3

自然上边是直接想用Encoding来做的,奈何它是抽象类,只能,写个法子开展了一部转化,何况把Encoding类型的品质实行private。

 

粗粗上也正是那般多个思路,上面上代码,给须要的人利用。 

public class MaxByteAttachedProperty : DependencyObject
    {
        public enum Encode
        {
            Default,
            ASCII,
            UTF8,
            UTF32,
            UTF7,
            BigEndianUnicode,
            Unicode
        }


        private static string GetPreText(DependencyObject obj)
        {
            return (string)obj.GetValue(PreTextProperty);
        }

        private static void SetPreText(DependencyObject obj, string value)
        {
            obj.SetValue(PreTextProperty, value);
        }

        // Using a DependencyProperty as the backing store for PreText.  This enables animation, styling, binding, etc...
        private static readonly DependencyProperty PreTextProperty =
            DependencyProperty.RegisterAttached("PreText", typeof(string), typeof(MaxByteAttachedProperty), new PropertyMetadata(""));


        public static int GetMaxByteLength(DependencyObject obj)
        {
            return (int)obj.GetValue(MaxByteLengthProperty);
        }

        public static void SetMaxByteLength(DependencyObject obj, int value)
        {
            obj.SetValue(MaxByteLengthProperty, value);
        }

        // Using a DependencyProperty as the backing store for MaxByteLength.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MaxByteLengthProperty =
            DependencyProperty.RegisterAttached("MaxByteLength", typeof(int), typeof(MaxByteAttachedProperty), new PropertyMetadata(OnTextBoxPropertyChanged));

        private static void OnTextBoxPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TextBox tb = d as TextBox;
            if (tb == null)
            {
                return;
            }
            tb.PreviewTextInput += Tb_PreviewTextInput;
        }
        private static void Tb_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            TextBox tb = sender as TextBox;
            if (IsOutMaxByteLength(tb.Text, tb))
            {
                tb.Text = GetPreText(tb);
                tb.Select(tb.Text.Length, 0);
                return;
            }
        }
        public static Encode GetEncodeModel(DependencyObject obj)
        {
            return (Encode)obj.GetValue(EncodeModelProperty);
        }

        public static void SetEncodeModel(DependencyObject obj, Encode value)
        {
            obj.SetValue(EncodeModelProperty, value);
        }

        // Using a DependencyProperty as the backing store for EncodeM.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty EncodeModelProperty =
            DependencyProperty.RegisterAttached("EncodeModel", typeof(Encode), typeof(MaxByteAttachedProperty), new PropertyMetadata(Encode.UTF8, OnEncodeModelChanged));
        private static void OnEncodeModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            SetEM(d, GetEncodeModel(d));
        }

        private static Encoding GetEncodingModel(DependencyObject obj)
        {
            return (Encoding)obj.GetValue(EncodingModelProperty);
        }

        private static void SetEncodingModel(DependencyObject obj, Encoding value)
        {
            obj.SetValue(EncodingModelProperty, value);
        }

        // Using a DependencyProperty as the backing store for EncodingModel.  This enables animation, styling, binding, etc...
        private static readonly DependencyProperty EncodingModelProperty =
            DependencyProperty.RegisterAttached("EncodingModel", typeof(Encoding), typeof(MaxByteAttachedProperty), new PropertyMetadata(Encoding.UTF8));

        private static void SetEM(DependencyObject obj, Encode e)
        {
            switch (e)
            {
                case Encode.Default:
                    SetEncodingModel(obj, Encoding.Default);
                    break;
                case Encode.ASCII:
                    SetEncodingModel(obj, Encoding.ASCII);
                    break;
                case Encode.UTF8:
                    SetEncodingModel(obj, Encoding.UTF8);
                    break;
                case Encode.UTF32:
                    SetEncodingModel(obj, Encoding.UTF32);
                    break;
                case Encode.UTF7:
                    SetEncodingModel(obj, Encoding.UTF7);
                    break;
                case Encode.BigEndianUnicode:
                    SetEncodingModel(obj, Encoding.BigEndianUnicode);
                    break;
                case Encode.Unicode:
                    SetEncodingModel(obj, Encoding.Unicode);
                    break;
                default:
                    break;
            }
        }

        private static bool IsOutMaxByteLength(string txt, DependencyObject obj)
        {
            int txtLength = GetEncodingModel(obj).GetBytes(txt).Length;//文本长度
            if (GetMaxByteLength(obj) >= txtLength)
            {
                SetPreText(obj, txt);
                return false;
            }
            return true;
        }
    }

 

 使用方法如下:

图片 4

马克斯ByteLength是必得设置的远非张开默许,EncodeModel能够不设置但是由于是咱们自身用,所以私下认可是UTF8,能够自动修改代码,依照你们公司的编码格式,那样也就绝不赋值了。

 代码已校订,感激Presia发现的BUG,疏忽了

版权声明:本文由澳门萄京官网最大平台发布于最大平台,转载请注明出处:TextBox按字节长度限制输入