Winform中的Textbox、NumericUpDown控件通常在单行的情况下,无法直接通过Height
属性修改高度,但很多时候我们需要调整其高度,使其显示的更加合理。下面主要介绍三种方法,推荐的做法是通过修改字体大小实现高度的修改。
以及后面禁止输入指定内容的两种实现。
介绍
Textbox默认为单行模式,无法调整高度,如果在使用中发现TextBox
文本框的高度不合适,就需要对单行模式的文本框修改高度。
新建TextBoxHeight
项目
比如,下面填入姓名和年龄信息,调整Label
提示文本的大小,明显可以看出大小不匹配。
要想修改Textbox
的高度,可以通过下面几种取巧的方式实现。
设置AutoSize为false,再设置高度【不推荐】
保持单行模式,设置AutoSize
为false,再设置高度。Textbox的AutoSize
属性是被隐藏起来的,需要在代码里直接修改。
textBox1.AutoSize = false;
textBox1.Height = 28;
numericUpDown1.AutoSize = false;
numericUpDown1.Height = 28;
可以看到高度确实调整了,但是会导致显示的文本与控件自身的高度不符合,会有很大的留白。
将Textbox改为多行模式,屏蔽Enter键【不推荐】
设置Textbox
的MutliLine
属性为true,允许修改Height
高度,然后在 KeyDown 按键事件中屏蔽Enter键,防止换行,形成单行的效果。
textBox1.Multiline = true;
textBox1.Height = 28;
textBox1.KeyDown += TextBox1_KeyDown;
////
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) // 或 e.KeyValue == 13 或 (int)e.KeyCode == 13
{
// 指示按键事件是否应传递到基础控件
// 如果为true,表示(Key)按键事件不应该发送到该控件
e.SuppressKeyPress = true;
}
}
可以看到,这种方式同样有着文字和高度不匹配的问题。
通过修改字体大小,间接改变Textbox、NumericUpDown的高度【推荐】
实际上,单行模式下可直接修改字体的大小,间接的实现高度的变化,NumericUpDown
控件也同样适用。
实际测试,可以看到,控件的高度、字体的大小显示等,有着很好的匹配。
NumericUpDown控件的一些常用属性
- Increment:指示每单击一下按钮时增加或减少的数量
- DecimalPlaces:指示要显示的小数位数
- Value:默认显示的数值
- Maximum:最大值(不能超过)
- Minimum:最小值(不能超过)
- RightToLeft:将上下箭头和数字左右调换
Hexadecimal
属性设置为true,用于在控件中显示十六进制值。
ThousandsSeparator
属性设置为true,可以在十进制数字中显示千位分隔符。
DecimalPlaces
属性设置要显示的小数的位数。
Textbox禁止输入数字的实现【利用e.SuppressKeyPress】
在 TextBox
的KeyDown
事件方法中,通过判断数字按键,设置e.SuppressKeyPress = true
取消数字key事件发送到该控件。
如下,禁止输入数字:
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 && e.Modifiers != Keys.Shift) || (e.KeyCode>=Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
{
e.SuppressKeyPress = true;
}
}
Winform的键盘按键(key
)事件中,可以通过e.KeyCode
表示当前的按键。
Keys
静态类的Keys.D0 ~ Keys.D9
表示键盘顶部的数字键,通常结合Shift可以按下数字键上方的特殊符号。
Keys.NumPad0 ~ Keys.NumPad9
表示键盘右侧的小的数字键盘上的数字。
因此需用对此进行判断,并阻止其按键事件,实现禁止输入数字。
Textbox禁止输入数字或其他字符【使用TextChanged事件】
禁止输入 数字或者某指定的文字字符 的方法是 在TextChanged
事件方法中,通过判断最新的字符是否为数字,如果是则删除该字符,否则保持不变。同样也可以实现禁止输入数字的功能。
在使用输入法时,一般不会触发Key按键事件,原则上按键事件被输入法程序捕获并转为对应的文字/字符内容,因此,使用输入法输入中文等字符时,基本就只能通过
TextChanged
事件实现一些禁止输入的功能。
如下,是简单实现禁止输入特定文本字符的代码。errProvider
作为窗体字段,用于错误提示;canNotInput
也可以改为其他需要禁止输入的内容文字。
errProvider = new ErrorProvider();
textBox1.TextChanged += TextBox1_TextChanged;
//// ...........
// 实现禁止输入特定文本字符
private void TextBox1_TextChanged(object sender, EventArgs e)
{
var txtBox= sender as TextBox;
// 取消错误提示
errProvider.SetError(txtBox, "");
// 不为空时
if (!string.IsNullOrWhiteSpace(txtBox.Text))
{
// "0123456789" 也可以改为其他需要禁止输入的内容文字
var canNotInput = "0123456789";
if (canNotInput.Contains(txtBox.Text[txtBox.Text.Length - 1]))
{
// 删除最后一个字符【两种方式】
// txtBox.Text = txtBox.Text.Remove(txtBox.Text.Length - 1);
txtBox.Text = txtBox.Text.Substring(0, txtBox.Text.Length - 1);
// 重新赋值后光标会出现在最前面
//txtBox.Focus(); // 通常需要设置文本框获取焦点再使用下面的Select到末尾,但是上面赋值已经有了光标,所以不需要
// 设置光标位置到文本末尾
txtBox.Select(txtBox.TextLength, 0);
// 滚动控件到光标处
txtBox.ScrollToCaret();
// 给定一个错误提示
//errProvider.BlinkStyle= ErrorBlinkStyle.AlwaysBlink;
errProvider.SetError(txtBox, $"不行允许输入此中的字符:{canNotInput}");
}
}
}
运行效果如下:
通过代码将光标移动(定位)到文本框文字的末尾:
// 设置文本框获取焦点 txtBox.Focus(); // 设置光标位置到文本末尾 txtBox.Select(txtBox.TextLength, 0); // 滚动控件到光标处 txtBox.ScrollToCaret();