C# 带小数的屏蔽文本框
在我的窗口应用程序中,我需要接受真实数字的屏蔽文本框 例如C# 带小数的屏蔽文本框,c#,winforms,textbox,decimal,maskedtextbox,C#,Winforms,Textbox,Decimal,Maskedtextbox,在我的窗口应用程序中,我需要接受真实数字的屏蔽文本框 例如 1) 1.56 2) 22.34 3) 123.34 4) 12312.34 此all值应有效 有人能告诉我怎么做吗? 是的,如果有人有更好的办法来解决真正的十进制数,而不是这个蒙面的文本框 比我更喜欢看它。 谢谢…而不是使用MaskDeTabox框,而是考虑使用 NoigiUpDub>代码>。它支持System.Decimal数字,它支持您应该关心的大多数实数集数字 NumericUpDown.DecimalPlaces属性最多支持9
1) 1.56
2) 22.34
3) 123.34
4) 12312.34
此all值应有效 有人能告诉我怎么做吗?
是的,如果有人有更好的办法来解决真正的十进制数,而不是这个蒙面的文本框 比我更喜欢看它。
谢谢…而不是使用MaskDeTabox框,而是考虑使用<代码> NoigiUpDub>代码>。它支持
System.Decimal
数字,它支持您应该关心的大多数实数集数字
NumericUpDown.DecimalPlaces
属性最多支持99位小数。使用类似这样的自定义控件(修改它以满足您的需要):
使用系统;
使用系统组件模型;
使用系统文本;
使用System.Windows.Forms;
使用系统图;
命名空间自定义控件
{
公共枚举原因
{
未知=0,
野田,
残疾人士,
认可的
}
公共类文本框:文本框
{
公共常量int WM_PASTE=0x0302;
公共事件事件处理程序被拒绝;
公共事件事件处理程序被拒绝;
private bool_DecimalSeparator=false;
私人国际单位精度;
公共新水平对齐文本对齐
{
获取{return base.TextAlign;}
设置{base.TextAlign=value;}
}
公共整数精度
{
获取{return\u Precision;}
设置{u Precision=value;}
}
公共分词框()
{
text对齐=水平对齐。右;
精度=3;
}
受保护的覆盖无效OnGotFocus(事件参数e)
{
选择全部();
基地,昂戈特福克斯(e);;
}
受保护的覆盖无效OnKeyDown(KeyEventArgs e)
{
bool-validate=true;
if(Text.Contains(“.”)| Text.Contains(“,”)
{
int-indexep;
字符串[]拆分;
字符串partiDecimal=“”;
if(Text.Contains(“.”)
indexSep=Text.IndexOf('.');
其他的
indexSep=Text.IndexOf(',');
split=Text.split(新字符[]{',','..});
partiDecimal+=拆分[1];
if(partiDecimal.Length>=精度)
如果(选择Start>Text.Length-(partiDecimal.Length+1))
验证=假;
}
布尔结果=真;
bool validateKeys=(e.KeyCode==Keys.Enter);
布尔数字键=(
((e.KeyCode>=Keys.D0&&e.KeyCode=Keys.NumPad0&&e.KeyCode 1)
无效=真;
如果(无效)
{
Text=“”;
返回;
}
if(Text.Contains(“.”)| Text.Contains(“,”)
{
字符串charSep=“”;
字符串[]拆分;
字符串partiEntier=“”;
if(Text.Contains(“.”)
charSep=“.”;
其他的
charSep=“,”;
split=Text.split(新字符[]{',','..});
partiEntier+=split[0];
如果(partiEntier==“”)
Text=“0”+charSep+split[1];
}
base.OnTextChanged(e);
}
受保护的覆盖无效WndProc(参考消息m)
{
如果(m.Msg==WM_粘贴)
{
PasteEventArgs e=CheckPasteValid();
如果(例如RejectReason!=粘贴RejectReasons.Accepted)
{
m、 结果=IntPtr.0;
不合格品(e);
返回;
}
}
基准WndProc(参考m);
}
私有PasteEventArgs CheckPasteValid()
{
PasteRejectRejectReasures=PasteRejectReasures.Accepted;
字符串originalText=文本;
string clipboardText=string.Empty;
string textResult=string.Empty;
尝试
{
clipboardText=Clipboard.GetText(TextDataFormat.Text);
如果(clipboardText.Length>0)
{
text结果=(
Text.Remove(SelectionStart,SelectionLength)。Insert(SelectionStart,clipboardText));
foreach(剪贴簿文本中的字符c)
{
如果(!char.IsDigit(c))
{
rejectReason=粘贴RejectReasures.InvalidCharacter;
打破
}
}
}
其他的
rejectReason=PasteRejectReasons.NoData;
}
抓住
{
rejectReason=粘贴拒绝原因。未知;
}
返回新的PasteEventArgs(originalText、clipboardText、textResult、rejectReason);
}
受保护的虚拟无效OnKeyRejected(KeyRejectedEventArgs e)
{
EventHandler=KeyRejected;
if(处理程序!=null)
处理者(本,e);
}
受保护的虚拟无效OnPasteRejected(PasteEventArgs e)
{
EventHandler=PasteRejected;
if(处理程序!=null)
处理者(本,e);
}
}
}
您所有的示例都有两位小数。是否希望接受更多的数字?如何将NumericUpDown的最大值从100增加到100?单击向上/向下控件,按F4调出其属性,并将最大属性从100增加到100+
using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace CustomControls
{
public enum PasteRejectReasons
{
Unknown = 0,
NoData,
InvalidCharacter,
Accepted
}
public class DecimalTextBox : TextBox
{
public const int WM_PASTE = 0x0302;
public event EventHandler<KeyRejectedEventArgs> KeyRejected;
public event EventHandler<PasteEventArgs> PasteRejected;
private bool _DecimalSeparator = false;
private int _Precision;
public new HorizontalAlignment TextAlign
{
get { return base.TextAlign; }
set { base.TextAlign = value; }
}
public int Precision
{
get { return _Precision; }
set { _Precision = value; }
}
public DecimalTextBox()
{
TextAlign = HorizontalAlignment.Right;
Precision = 3;
}
protected override void OnGotFocus(EventArgs e)
{
SelectAll();
base.OnGotFocus(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
bool validate = true;
if (Text.Contains(".") || Text.Contains(","))
{
int indexSep;
string[] split;
string partiDecimal = "";
if (Text.Contains("."))
indexSep = Text.IndexOf('.');
else
indexSep = Text.IndexOf(',');
split = Text.Split(new char[] { ',', '.' });
partiDecimal += split[1];
if (partiDecimal.Length >= Precision)
if (SelectionStart > Text.Length - (partiDecimal.Length + 1))
validate = false;
}
bool result = true;
bool validateKeys = (e.KeyCode == Keys.Enter);
bool numericKeys = (
((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
(e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
&& e.Modifiers != Keys.Shift
&& validate);
bool ctrlA = e.KeyCode == Keys.A && e.Modifiers == Keys.Control;
bool editKeys = (
(e.KeyCode == Keys.Z && e.Modifiers == Keys.Control) ||
(e.KeyCode == Keys.X && e.Modifiers == Keys.Control) ||
(e.KeyCode == Keys.C && e.Modifiers == Keys.Control) ||
(e.KeyCode == Keys.V && e.Modifiers == Keys.Control) ||
e.KeyCode == Keys.Delete ||
e.KeyCode == Keys.Back);
bool navigationKeys = (
e.KeyCode == Keys.Up ||
e.KeyCode == Keys.Right ||
e.KeyCode == Keys.Down ||
e.KeyCode == Keys.Left ||
e.KeyCode == Keys.Home ||
e.KeyCode == Keys.End);
bool decimalSeparator = ((
e.KeyCode == Keys.Decimal ||
e.KeyValue == 190 ||
e.KeyValue == 188)&&
TextLength != 0 &&
SelectionLength == 0);
if (decimalSeparator)
{
if (!_DecimalSeparator)
_DecimalSeparator = true;
else
decimalSeparator = false;
}
if (!(numericKeys || editKeys || navigationKeys || decimalSeparator || validateKeys))
{
if (ctrlA)
SelectAll();
result = false;
}
if (!result)
{
e.SuppressKeyPress = true;
e.Handled = true;
if (!ctrlA)
OnKeyRejected(new KeyRejectedEventArgs(e.KeyCode));
}
else
base.OnKeyDown(e);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar == ';' || e.KeyChar == '?')
{
if (!(Text.Contains(",") || Text.Contains(".")))
_DecimalSeparator = false;
e.Handled = true;
}
}
protected override void OnTextChanged(EventArgs e)
{
bool invalid = false;
int i = 0;
foreach (char c in Text) // Check for any non digit characters.
{
if (!(char.IsDigit(c) || c == ',' || c == '.'))
{
invalid = true;
break;
}
if (c == ',' || c == '.')
i++;
}
if (i == 0)
_DecimalSeparator = false;
else if (i > 1)
invalid = true;
if (invalid)
{
Text = "";
return;
}
if (Text.Contains(".") || Text.Contains(","))
{
string charSep = "";
string[] split;
string partiEntier = "";
if (Text.Contains("."))
charSep = ".";
else
charSep = ",";
split = Text.Split(new char[] { ',', '.' });
partiEntier += split[0];
if (partiEntier == "")
Text = "0" + charSep + split[1];
}
base.OnTextChanged(e);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PASTE)
{
PasteEventArgs e = CheckPasteValid();
if (e.RejectReason != PasteRejectReasons.Accepted)
{
m.Result = IntPtr.Zero;
OnPasteRejected(e);
return;
}
}
base.WndProc(ref m);
}
private PasteEventArgs CheckPasteValid()
{
PasteRejectReasons rejectReason = PasteRejectReasons.Accepted;
string originalText = Text;
string clipboardText = string.Empty;
string textResult = string.Empty;
try
{
clipboardText = Clipboard.GetText(TextDataFormat.Text);
if (clipboardText.Length > 0)
{
textResult = (
Text.Remove(SelectionStart, SelectionLength).Insert(SelectionStart, clipboardText));
foreach (char c in clipboardText)
{
if (!char.IsDigit(c))
{
rejectReason = PasteRejectReasons.InvalidCharacter;
break;
}
}
}
else
rejectReason = PasteRejectReasons.NoData;
}
catch
{
rejectReason = PasteRejectReasons.Unknown;
}
return new PasteEventArgs(originalText, clipboardText, textResult, rejectReason);
}
protected virtual void OnKeyRejected(KeyRejectedEventArgs e)
{
EventHandler<KeyRejectedEventArgs> handler = KeyRejected;
if (handler != null)
handler(this, e);
}
protected virtual void OnPasteRejected(PasteEventArgs e)
{
EventHandler<PasteEventArgs> handler = PasteRejected;
if (handler != null)
handler(this, e);
}
}
}