一、前言
在上位机软件开发过程中,文本框(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.如有侵权,请告知。