我需要創建一個WinForms文本框,它允許十進制文本的獨佔或整數文本。另外,我不希望被要求指定掩碼中文本的長度;只要文本符合十進制或整數模型,用戶應該能夠輸入儘可能多的字符。然而,就我所知,MaskedTextBox不允許可變長度掩碼;我無法找到預先存在的控制器。WinForms - MaskedTextBox - 「可變寬度」屏蔽可能嗎?
建議?我想我可以繼承TextBox,重寫OnKeyPress並在那裏完成工作,但我不知道預先存在的控件是否會更優雅地執行操作。
我需要創建一個WinForms文本框,它允許十進制文本的獨佔或整數文本。另外,我不希望被要求指定掩碼中文本的長度;只要文本符合十進制或整數模型,用戶應該能夠輸入儘可能多的字符。然而,就我所知,MaskedTextBox不允許可變長度掩碼;我無法找到預先存在的控制器。WinForms - MaskedTextBox - 「可變寬度」屏蔽可能嗎?
建議?我想我可以繼承TextBox,重寫OnKeyPress並在那裏完成工作,但我不知道預先存在的控件是否會更優雅地執行操作。
NumericUpDown控件有一些內置的十進制/整數解析行爲 - 聽起來像它可能是你要找的東西。當然,你最終也會在文本框中使用updown控件。
這是一個解決方案。這並不完美 - 它可能會在某些情況下吃控制角色,並且不會乾淨地處理粘貼 - 但它運行得足夠好!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WinFormsTest
{
public partial class MaskedTextBox : TextBox
{
public enum EntryTypeEnum
{
Any,
Integer,
Decimal
}
[DefaultValue(EntryTypeEnum.Any)]
public EntryTypeEnum EntryType { get; set; }
public MaskedTextBox()
{
InitializeComponent();
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
var keyIsValid =
(EntryType == EntryTypeEnum.Any)
|| char.IsControl(e.KeyChar)
|| isValid(Text + e.KeyChar);
e.Handled = !keyIsValid;
base.OnKeyPress(e);
}
protected override void OnValidating(CancelEventArgs e)
{
e.Cancel = !isValid(Text);
base.OnValidating(e);
}
protected bool isValid(string textToValidate)
{
switch (EntryType)
{
case EntryTypeEnum.Any:
break;
case EntryTypeEnum.Decimal:
{
decimal result;
if (!decimal.TryParse(textToValidate, out result))
{
return false;
}
}
break;
case EntryTypeEnum.Integer:
{
int result;
if (!int.TryParse(textToValidate, out result))
{
return false;
}
}
break;
}
return true;
}
}
}
試試這個:
private void TextBox1_Validating(object sender, EventArgs e)
{
string expression = "^\d{1,8}(\.\d{2,2})?$";
if (System.Text.RegularExpressions.Regex.Match(this.txt_monto_total.Text, expression).Success)
this.label_total.Visible = false;
else
this.label_total.Visible = true;
}
這不是一個面具,但它會讓你告訴用戶,如果他們輸入了不正確的格式(我通過顯示的標籤做),你可以使用任何正則表達式,在我的情況下,我只想要「1」或「8」之前的數字。之後2個。
經過多次搜索,我能夠發現一個控制代碼項目,允許一個可變長度的數字。
這是Nullable Masked Edit, and a Better Masked Edit Also!項目。
請注意,您需要使用'EditMask'字段來設置Mask屬性。嘗試設置「蒙版」字段將不起作用。
我能夠設置999.9的掩碼,然後輸入1.1將無需添加前導空格即可工作。
我看了一下那個控件。有一種方法可以隱藏旋鈕(上/下按鈕),但它看起來不太乾淨。 NumericUpDown nud; ... nud.Controls [0] .Hide(); – lolwhat 2010-01-22 20:56:12