2009-02-03 106 views
3

进出口新的节目,我不很懂,但我正在做一个计算器,我想用一个文本框,只有acepts数和小数,而当从剪贴板用户粘贴文本的文本框中删除任何文字字符,如MS计算。数字文本框

请花时间来解释每一个部分,所以我可以学习或写出来,并告诉我要搜索什么。

感谢

编辑:我会让它更加具体:

如何让C#中的数字文本框?我使用了蒙面文本框,但它不会带小数。

我读过的东西有关重载方法的OnKeyPress所以这将纠正任何错误的字符,但我不知道该怎么办了。

+0

除了印象,这听起来像一个典型的家庭作业的问题,它也出现利用回答的人(和他/她的时间)是理所当然的。 -1 – Cerebrus 2009-02-03 19:32:58

+0

这是一个足够公平的问题,我想。 +1 – GWLlosa 2009-02-03 19:45:14

+0

尽管我同意提问者应该更加注意,但没有清楚的迹象表明这是一个家庭作业问题。 – EBGreen 2009-02-03 19:59:53

回答

4

最简单的方法:)

的按键事件在你的文本框


if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8) 
{ 
} 
else 
{ 
    e.Handled = true; 
} 

0

这里如何在vb.net做这个

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 
    Dim reg As New System.Text.RegularExpressions.Regex("[^0-9_ ]") 
    TextBox1.Text = reg.Replace(TextBox1.Text, "") 
End Sub 

只要解决您的特定的正则表达式需要

0

研究的MaskedTextBox中。

这个问题有点宽泛来解释一切。如果你想要具体细节,试着重点关注这个问题,因为你要求很多社区“解释每个部分”。如果您问几个具体问题(并排除“请抽空解释......”),您会得到更好的答复。

0

据我所知,没有什么本地在.NET框架(2.0至少)来做到这一点。您的选择是:

  1. 创建一个自定义的控制,从文本框控件 继承和只允许数字输入。这个 的优点是控制 可以重新使用。
  2. 处理KeyPress事件并检查 charCode以仅允许数字 击键。这很容易,但很少重复使用。
0

我可能会使用一个正则表达式来筛选出非NUMERICS。

伪代码:

for (each item in the input string) { 
    if (!match(some regular expression, item)) { 
     toss it out 
    } else { 
     add item to text box or whatever you were going to do with it 
    } 

} 
7

如果你仔细观察,在Windows计算器,数字显示在标签中没有一个文本框(它不接收焦点)。该窗口接收键盘事件。

所以看看窗体上的KeyPressed和KeyDown事件。

0

你可以使用一个简单的文本框或标签的计算器显示屏和公正,确保值(一个字符串?)始终是一个数字。例如,您可以保留一个double,并在想要显示它时将其转换为一个字符串。

-1

作为一个新手,你可能会更适合投资一个优秀的第三方工具包。来自Telerik的Radcontrol例如有一个数字文本框,可以完成你正在寻找的东西。

2

有一个在框架控制,是专门为数字输入制作:NumericUpDown控件。它也管理十进制值。

11

添加的事件处理程序要只能是数字文本框,并添加以下代码:

private void textBoxNumbersOnly_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b') 
    { 
     e.Handled = false; 
    } 
    else 
    { 
     e.Handled = true; 
    } 
} 

这使得数字0到9,也只后退(有用恕我直言)允许通过'。'字符,如果你想支持小数十进制数字输入

1
 if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0) 
     { 
      e.Handled = false; 
     } 
     else 
     { 
      e.Handled = true; 
     } 
0

有用的,但有一些错误,如果(右击和粘贴)的其他文字。 :D

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     string original = (sender as TextBox).Text; 
     if (!char.IsDigit(e.KeyChar)) 
     { 
      e.Handled = true; 
     } 
     if (e.KeyChar == '.') 
     { 
      if (original.Contains('.')) 
       e.Handled = true; 
      else if (!(original.Contains('.'))) 
       e.Handled = false; 

     } 
     else if (char.IsDigit(e.KeyChar)||e.KeyChar=='\b') 
     { 
      e.Handled = false; 
     } 

    } 
0

这是我根据mahasen的答案制作的自定义控件。把它放在它自己的类文件中,并将命名空间修改为任何你想要的。一旦你重建你的解决方案,它应该显示为你的工具箱菜单标签中的一个新控件,你可以拖/放到Form

using System; 
using System.Linq; 
using System.Windows.Forms; 

namespace MyApp.GUI 
{ 
    public class FilteredTextBox : TextBox 
    { 
     // Fields 
     private char[] m_validCharacters; 
     private string m_filter; 
     private event EventHandler m_maxLength; 

     // Properties 
     public string Filter 
     { 
      get 
      { 
       return m_filter; 
      } 
      set 
      { 
       m_filter = value; 
       m_validCharacters = value.ToCharArray(); 
      } 
     } 

     // Constructor 
     public FilteredTextBox() 
     { 
      m_filter = ""; 
      this.KeyPress += Validate_Char_OnKeyPress; 
      this.TextChanged += Check_Text_Length_OnTextChanged; 
     } 

     // Event Hooks 
     public event EventHandler TextBoxFull 
     { 
      add { m_maxLength += value; } 
      remove { m_maxLength -= value; } 
     } 

     // Methods 
     void Validate_Char_OnKeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (m_validCharacters.Contains(e.KeyChar) || e.KeyChar == '\b') 
       e.Handled = false; 
      else 
       e.Handled = true; 
     } 
     void Check_Text_Length_OnTextChanged(object sender, EventArgs e) 
     { 
      if (this.TextLength == this.MaxLength) 
      { 
       var Handle = m_maxLength; 
       if (Handle != null) 
        Handle(this, EventArgs.Empty); 
      } 
     } 
    } 
} 

,只是作为奖金我也想自动标签到另一个箱子后,我进了3个字符,所以我把盒子的最大长度为3,在Form代码我迷上那TextBoxFull事件,并集中在它旁边的框。这是将4个过滤的框链接在一起以输入IP地址。前两个箱子形式的代码如下...

private bool ValidateAddressChunk(string p_text) 
    { 
     byte AddressChunk = new byte(); 
     return byte.TryParse(p_text, out AddressChunk); 
    } 
    private void filteredTextBox1_TextBoxFull(object sender, EventArgs e) 
    { 
     var Filtered_Text_Box = (FilteredTextBox)sender; 

     if (!ValidateAddressChunk(Filtered_Text_Box.Text)) 
      filteredTextBox1.Text = "255"; 
     else 
      filteredTextBox2.Focus(); 
    } 
    private void filteredTextBox2_TextBoxFull(object sender, EventArgs e) 
    { 
     var Filtered_Text_Box = (FilteredTextBox)sender; 

     if (!ValidateAddressChunk(Filtered_Text_Box.Text)) 
      filteredTextBox2.Text = "255"; 
     // etc. 
    }