我已经在这里检查了其他问题,但答案与我的问题无关。如果按下物理键盘(笔记本电脑),以下代码允许textbox1仅接受数字:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char ch = e.KeyChar;
if ( !char.IsDigit(ch))
{
e.Handled = true;
}
}
但这不是我想要的(我不使用实体笔记本键盘)。
如屏幕截图所示,我有带按钮和文本框的窗体。我设计了这个键盘,它运行良好,但我希望textbox1只接受数字和“。”。
每个按钮内只有两行代码(只有项目中的代码):
private void buttonName_Click(object sender, EventArgs e)
{
// each button only has this code.
textBox1.Focus();
SendKeys.Send(buttonName.Text);
}
我知道如果按下物理(笔记本电脑)键,如何设置txtbox接受数字,但在这种情况下,我有windwos形式的控制按钮,我想将textBox1设置为仅接受数字和“。”。请帮助我们如何实现这一目标。谢谢
答案 0 :(得分:2)
在表单级别声明一个字符串变量,用它来存储最后一个有效文本,并在文本框的@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem prefs = menu.findItem(R.id.prefs); // your item identifier
prefs.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
doThis();
return false;
}
});
}
事件中输入无效文本时将其恢复。
TextChanged
string previousText;
public Form1()
{
InitializeComponent();
previousText = String.Empty;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
int dummy, changeLenght, position;
if (!String.IsNullOrWhiteSpace(textBox1.Text) && !int.TryParse(textBox1.Text, out dummy))
{
position = textBox1.SelectionStart;
changeLenght = textBox1.TextLength - previousText.Length;
textBox1.Text = previousText;
textBox1.SelectionStart = position - changeLenght;
}
else
{
previousText = textBox1.Text;
}
}
和position
用于在恢复文本之前将光标保持在原位。
如果您想接受带小数或大于2147483647的数字,只需将changeLenght
更改为dummy
并使用double
代替double.TryParse
。
int.TryParse
答案 1 :(得分:1)
假设button1
是你的按钮控件,你可以这样做:
private void allButtons_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
char c = btn.Text[0]; //assuming all buttons have exactly 1 character
if(Char.IsDigit(c) || c == '.')
{
//process
textBox1.Focus();
SendKeys.Send(btn.Text);
}
//otherwise don't
}
我假设你把它放在一个普通的处理程序中,你已经连接了所有按钮(即allButtons_Click
)。
这种方法存在问题,它允许您输入0.0.1
之类的值,这些值很可能在您的上下文中无效。处理此问题的另一种方法是处理TextChanged
事件,存储以前的值,如果新值无效,则还原旧值。不幸的是,TextBox类没有TextChanging
事件,这可能是一个更清晰的选择。
您确定无效值的好处是模块化。例如,如果您以后决定您的用户可以输入任何值,但只有数字可以通过验证,您可以将支票从TextChanged
移至验证按钮点击或类似。
为什么用户可能需要 - 假设其中一个输入选项是复制/粘贴 - 他们希望粘贴无效数据并将其编辑为有效,例如abc123.5
。如果你在条目中限制它们,那么这个值根本就不存在,因此它们现在需要手动粘贴到记事本中,剪切出无效字符,然后重新粘贴,这会影响生产力。
通常,在实现任何用户界面限制之前,请阅读“我不允许我的用户......”,请仔细考虑,是否足够合理。通常情况下,您不需要限制用户,即使是为了保持您的数据库有效等目的。如果可能的话,永远不要在他们面前放置混凝土墙,您只需要在工作流程中正确引导它们。您希望用户站在您一边,而不是反对您。