C# winform 自定义控件—文本框(Textbox)

一、前言

        在上位机软件开发过程中,文本框(Textbox)是使用最多的控件之一,但是系统自带的控件只有基础的显示和输入功能,针对一些特定的开发无法兼顾,所以本期我们自己基于textbox控件开发一些额外的基础功能。

二、创建控件类

        1.新建类库

        2.删除生成类

        3.新建自定义控件

        4.生成后转到代码视图,开始写代码

三、添加代码

        在构造函数传参,这里只传递了背景色值。

public mytextbox()
{
    InitializeComponent();
    baseColor = this.BackColor;
}

        1.添加属性

                此部分为属性,可以在界面的属性窗口看到。

#region 属性
Color baseColor = Color.Transparent;//背景色
Color errColor = Color.Red;//错误颜色
Color changeColor = Color.LimeGreen;//修改颜色
string LastText = string.Empty;//最后一次的值(焦点离开时)
double min = 0;
double max = 100;
double LastValue = double.PositiveInfinity;//最后一个值
double value = double.PositiveInfinity;//当前文本
       

[Category("Color")]
[Description("背景色")]
public Color BaseColor
{
    get { return baseColor; }
    set { baseColor = value; Refresh(); }
}

[Category("Color")]
[Description("错误颜色")]
public Color ErrorColor
{
    get { return errColor; }
    set {  errColor = value; Refresh(); }
}

[Category("Color")]
[Description("修改颜色")]
public Color ChangeColor
{
    get { return changeColor; }
    set { changeColor = value; Refresh(); }
}

[Category("Data")]
[Description("获取值double")]
public double Value
{
    get { return this.value; }
    set { this.value = value; Refresh(); }
}

[Category("Data")]
[Description("最小值")]
public double Min
{
    get { return min; }
    set { min = value; Refresh(); }
}

[Category("Data")]
[Description("最大值")]
public double Max
{
    get { return max; }
    set { max = value; Refresh(); }
}
#endregion

        2.添加功能

                1.这部分为文本变动功能,利用自带TextChange函数,补充变动后文本状态。这里包含两部分,一是手动点击后,焦点在文本框上,还有一种是软件启动自动赋值,这时焦点不在文本框上。

protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);

    if(this.Focus())//有焦点
    {
        //非数值
        if (this.Text != LastText)
        {
            this.BackColor = changeColor;
        }
        else
        {
            this.BackColor = baseColor;
        }

        //数值类型
        try { value = double.Parse(this.Text); }
        catch { value = double.PositiveInfinity; }

        if(/*(this.Text != "" && this.Text != "NaN") && */value != double.PositiveInfinity)
        {
            if(value >max || value < min)
            {
                this.BackColor = errColor;
            }
            else
            {
                if (value != LastValue)
                {
                    this.BackColor = changeColor;
                }
                else
                {
                    this.BackColor = baseColor;
                }
            }
        }
    }
    else//无焦点变值 只检测数值
    {
        //数值类型
        try { value = double.Parse(this.Text); }
        catch { value = double.PositiveInfinity; }

        if (value != double.PositiveInfinity)
        {
            if (value > max || value < min)
            {
                this.BackColor = errColor;
            }
        }
    }
}

                2.焦点离开,记录本次的值,用于与下次新值进行对比。

protected override void OnLeave(EventArgs e)
{
    base.OnLeave(e);

    if ( (value <= max && value >= min))
    {
        LastValue = value;
    }
    LastText = this.Text;

}

                3.单独的set函数,用于点击保存时自动更新文本状态,如果只是想显示颜色和状态,不需要此部分内容(为空时会显示红色)。

public void Set(bool Reset = false)
{
    OnLeave(null);
    //非数值
    if (this.Text != LastText)
    {
        this.BackColor = changeColor;
    }
    else
    {
        this.BackColor = baseColor;
    }

    if (value != double.PositiveInfinity)
    {
        if (value > max || value < min)
        {
            this.BackColor = errColor;
        }
        else
        {
            if (value != LastValue)
            {
                this.BackColor = changeColor;
            }
            else
            {
                this.BackColor = baseColor;
            }
        }
    }

    if(Reset||string.IsNullOrEmpty(this.Text))
    {
        this.BackColor = errColor;
    }
}

四、显示效果

        因根据自己实际情况添加的功能,所以各位可以根据自己的实际需求添加相应功能。

五、声明/结尾

         1.如有疑问或错误,可以在评论中提出;

         2.更新不易,点赞关注,谢谢。

         3.如有侵权,请告知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值