C#帮助创建自定义控件

时间:2017-09-03 06:23:24

标签: c# custom-controls

我尝试制作一个自定义控件,该控件根据所选选项接受输入。我想将小数点限制为只有一个,这样用户就不会输入多个“。”我怎样才能做到这一点?

using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace DT_Controls
{
    public enum Options { Any, Alphabets, Alpha_Numeric, Numeric }

    public class TextBox_Pro : TextBox
    {
        Options _Opt = 0;
        bool _Flag = false;
        int Count = 0;

        [Category("Behavior")]
        [Description("If set as true will accept decimal values when SetOption is Numeric")]
        public bool AcceptDecimal
        {
            get { return _Flag; }
            set { _Flag = value; }
        }

        [Category("Behavior")]
        [Description("Controls the type of value being entered into the TextBox_Pro")]
        public Options SetOption
        {
            get { return _Opt; }
            set { _Opt = value; }
        }

        public TextBox_Pro()
        {
            this.KeyPress += TextBox_Pro_KeyPress;
        }

        private void TextBox_Pro_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Convert.ToInt32(e.KeyChar) == 8)
                return;
            switch (_Opt)
            {
                case Options.Numeric:
                    if (_Flag == true)
                        if (Convert.ToInt32(e.KeyChar) == 46)
                            return;
                    if (char.IsDigit(e.KeyChar) == false)
                    {
                        MessageBox.Show("Enter Numeric Values Only");
                        e.Handled = true;
                    }
                    break;
                case Options.Alphabets:
                    if(char.IsLetter(e.KeyChar)==false && Convert.ToInt32(e.KeyChar) != 32)
                    {
                        MessageBox.Show("Enter Only Aplhabets");
                        e.Handled = true;
                    }
                    break;
                case Options.Alpha_Numeric:
                    if (char.IsLetterOrDigit(e.KeyChar) == false)
                    {
                        MessageBox.Show("Enter Only Alphabets Or Numbers");
                        e.Handled = true;
                    }
                    break;
            }
        }
    }
}

示例我不希望用户输入12 ..... 123我希望用户输入12.123和之后。它应该禁用该标志,但是当我这样做时它不会让我允许输入任何“。”即使在删除“。”之后

2 个答案:

答案 0 :(得分:0)

比设置任何标志更容易检查TextBox是否已包含任何“。”具有内置功能。因此,请替换以下代码:

if (_Flag == true)
    if (Convert.ToInt32(e.KeyChar) == 46)
        return;

使用:

if (Convert.ToInt32(e.KeyChar) == 46)
    {
        if (this.Text.Contains("."))
            {
                e.Handled = true;
            }
            return;
    }

通过这种方式,您还可以检查其他不一致性,例如检查TextBox中的文本是否以“。”开头。

答案 1 :(得分:0)

不同的文化使用不同的数字小数分隔符,因此最好从CultureInfo.CurrentCulture.NumberFormat读取而不是硬编码值。由于您继承自TextBox,因此您可以覆盖OnKeyPress而不是订阅KeyPress事件。如果小数分隔符是第一个字符,以下示例也会自动显示 0。

[ToolboxBitmap(typeof(TextBox))]
public class TextBoxPro
    : TextBox
{
    static NumberFormatInfo       s_numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat;

    public static readonly string s_decimalSeparator = s_numberFormatInfo.NumberDecimalSeparator;

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);

        if (ReadOnly)
            return;

        var keyChar   = e.KeyChar;
        var keyString = keyChar.ToString();

        if (keyString == s_decimalSeparator)
        {
            if (IsAllSelected)
            {
                e.Handled      = true;
                Text           = "0.";
                SelectionStart = 2;
            }
            else if (Text.Contains(s_decimalSeparator))
                e.Handled = true;
        }
    }

    private bool IsAllSelected
    {
        get { return SelectionLength == TextLength; }
    }
}