加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 带十进制数字的蒙面文本框

发布时间:2020-12-16 00:22:12 所属栏目:百科 来源:网络整理
导读:在我的窗口应用程序中,我需要屏蔽文本框,它接受真正的十进制数字. eg. 1) 1.56 2) 22.34 3) 123.34 4) 12312.34 This all value should be valid. 谁能告诉我怎么能这样做? 并且,如果有人有更好的解决方案的实际十进制数,而不是这个蒙版的TextBox 比我喜欢
在我的窗口应用程序中,我需要屏蔽文本框,它接受真正的十进制数字.

eg.
1) 1.56
2) 22.34
3) 123.34
4) 12312.34
This all value should be valid.

谁能告诉我怎么能这样做?
并且,如果有人有更好的解决方案的实际十进制数,而不是这个蒙版的TextBox
比我喜欢看到它.
谢谢…

解决方法

使用像这样的自定义控件(修改它以满足您的需求):

using System; 
using System.ComponentModel; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 

namespace CustomControls 
{ 
    public enum PasteRejectReasons 
    { 
        Unknown = 0,NoData,InvalidCharacter,Accepted 
    } 

    public class DecimalTextBox : TextBox 
    { 
        public const int WM_PASTE = 0x0302; 
        public event EventHandler<KeyRejectedEventArgs> KeyRejected; 
        public event EventHandler<PasteEventArgs> PasteRejected; 

        private bool _DecimalSeparator = false; 
        private int _Precision; 

        public new HorizontalAlignment TextAlign 
        { 
            get { return base.TextAlign; } 
            set { base.TextAlign = value; } 
        } 

        public int Precision 
        { 
            get { return _Precision; } 
            set { _Precision = value; } 
        } 

        public DecimalTextBox() 
        { 
            TextAlign = HorizontalAlignment.Right; 
            Precision = 3; 
        } 

        protected override void OnGotFocus(EventArgs e) 
        { 
            SelectAll(); 
            base.OnGotFocus(e); 
        } 

        protected override void OnKeyDown(KeyEventArgs e) 
        { 
            bool validate = true; 

            if (Text.Contains(".") || Text.Contains(",")) 
            { 
                int indexSep; 
                string[] split; 
                string partiDecimal = ""; 

                if (Text.Contains(".")) 
                    indexSep = Text.IndexOf('.'); 
                else 
                    indexSep = Text.IndexOf(','); 

                split = Text.Split(new char[] { ',','.' }); 
                partiDecimal += split[1]; 

                if (partiDecimal.Length >= Precision) 
                    if (SelectionStart > Text.Length - (partiDecimal.Length + 1)) 
                        validate = false; 
            } 

            bool result = true; 

            bool validateKeys = (e.KeyCode == Keys.Enter); 

            bool numericKeys = ( 
                ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || 
                (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)) 
                && e.Modifiers != Keys.Shift 
                && validate); 

            bool ctrlA = e.KeyCode == Keys.A && e.Modifiers == Keys.Control; 

            bool editKeys = ( 
                (e.KeyCode == Keys.Z && e.Modifiers == Keys.Control) || 
                (e.KeyCode == Keys.X && e.Modifiers == Keys.Control) || 
                (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) || 
                (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) || 
                e.KeyCode == Keys.Delete || 
                e.KeyCode == Keys.Back); 

            bool navigationKeys = ( 
                e.KeyCode == Keys.Up || 
                e.KeyCode == Keys.Right || 
                e.KeyCode == Keys.Down || 
                e.KeyCode == Keys.Left || 
                e.KeyCode == Keys.Home || 
                e.KeyCode == Keys.End); 

            bool decimalSeparator = (( 
                e.KeyCode == Keys.Decimal || 
                e.KeyValue == 190 || 
                e.KeyValue == 188)&& 
                TextLength != 0 && 
                SelectionLength == 0); 

            if (decimalSeparator)  
            { 
                if (!_DecimalSeparator) 
                    _DecimalSeparator = true; 
                else 
                    decimalSeparator = false; 
            } 

            if (!(numericKeys || editKeys || navigationKeys || decimalSeparator || validateKeys)) 
            { 
                if (ctrlA)
                    SelectAll();

                result = false; 
            } 

            if (!result)
            { 
                e.SuppressKeyPress = true; 
                e.Handled = true; 

                if (!ctrlA)
                    OnKeyRejected(new KeyRejectedEventArgs(e.KeyCode)); 
            } 
            else 
                base.OnKeyDown(e); 
        } 

        protected override void OnKeyPress(KeyPressEventArgs e) 
        { 
            if (e.KeyChar == ';' || e.KeyChar == '?') 
            { 
                if (!(Text.Contains(",") || Text.Contains("."))) 
                    _DecimalSeparator = false; 
                e.Handled = true; 
            } 
        } 

        protected override void OnTextChanged(EventArgs e) 
        { 
            bool invalid = false; 
            int i = 0; 
            foreach (char c in Text) // Check for any non digit characters. 
            { 
                if (!(char.IsDigit(c) || c == ',' || c == '.')) 
                { 
                    invalid = true; 
                    break; 
                } 

                if (c == ',' || c == '.') 
                    i++; 
            } 

            if (i == 0) 
                _DecimalSeparator = false; 
            else if (i > 1) 
                invalid = true; 

            if (invalid) 
            { 
                Text = ""; 
                return; 
            } 

            if (Text.Contains(".") || Text.Contains(",")) 
            { 
                string charSep = ""; 
                string[] split; 
                string partiEntier = ""; 

                if (Text.Contains(".")) 
                    charSep = "."; 
                else 
                    charSep = ","; 

                split = Text.Split(new char[] { ','.' }); 
                partiEntier += split[0]; 
                if (partiEntier == "") 
                    Text = "0" + charSep + split[1]; 
            } 
            base.OnTextChanged(e); 
        } 

        protected override void WndProc(ref Message m) 
        { 
            if (m.Msg == WM_PASTE) 
            { 
                PasteEventArgs e = CheckPasteValid(); 
                if (e.RejectReason != PasteRejectReasons.Accepted) 
                { 
                    m.Result = IntPtr.Zero; 
                    OnPasteRejected(e); 
                    return; 
                } 
            } 
            base.WndProc(ref m); 
        } 

        private PasteEventArgs CheckPasteValid() 
        { 
            PasteRejectReasons rejectReason = PasteRejectReasons.Accepted; 
            string originalText = Text; 
            string clipboardText = string.Empty; 
            string textResult = string.Empty; 

            try 
            { 
                clipboardText = Clipboard.GetText(TextDataFormat.Text); 
                if (clipboardText.Length > 0)
                { 

                    textResult = ( 
                        Text.Remove(SelectionStart,SelectionLength).Insert(SelectionStart,clipboardText)); 
                    foreach (char c in clipboardText)
                    { 
                        if (!char.IsDigit(c)) 
                        { 
                            rejectReason = PasteRejectReasons.InvalidCharacter; 
                            break; 
                        } 
                    } 
                } 
                else 
                    rejectReason = PasteRejectReasons.NoData; 
            } 
            catch 
            { 
                rejectReason = PasteRejectReasons.Unknown; 
            } 
            return new PasteEventArgs(originalText,clipboardText,textResult,rejectReason); 
        } 

        protected virtual void OnKeyRejected(KeyRejectedEventArgs e) 
        { 
            EventHandler<KeyRejectedEventArgs> handler = KeyRejected; 
            if (handler != null) 
                handler(this,e); 
        } 

        protected virtual void OnPasteRejected(PasteEventArgs e) 
        { 
            EventHandler<PasteEventArgs> handler = PasteRejected; 
            if (handler != null) 
                handler(this,e); 
        } 
    } 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读