文本框格式
本文关键字:格式 文本 | 更新日期: 2023-09-27 18:33:31
一个模糊的问题,但我正在尝试找到一个将表单上的所有文本框设置为货币格式的函数。在我的表格上,我有一些预设框,但许多框只需按一下按钮即可动态显示。这些文本框中的信息将来自 Access。我有一个用于清除文本框的示例函数,我很好奇我所问的内容是否有类似的东西。
private void txtMaxDiscount_TextChanged(object sender, EventArgs e)
{
double amount = 0.0d;
if (double.TryParse(txtMaxDiscount.Text, NumberStyles.Currency, null, out amount))
{
txtMaxDiscount.Text = amount.ToString("C");
}
}
您可以根据此堆栈溢出帖子创建自己的控件。您可以创建自己的文本框,该文本框派生自基控件。因此,您可以指定自己的数据源和格式,也可以使用其他功能在控件上进行扩展。同样,这将允许重复使用,无需重复。
public class TextBoxEx : TextBox
{
public string Format { get; set; }
private object datasource = new object();
public object Datasource
{
get { return datasource; }
set
{
datasource = value;
if (datasource == null)
base.Text = string.Empty;
else if(string.IsNullOrWhiteSpace(Format))
base.Text = datasource.ToString();
else
base.Text = string.Format("{0:"+ Format + "}",datasource);
}
}
}
用法:
textbox.Format = "c";
textbox.Datasource = DataSet.DataView[0].Amount;
我明白你的要求。 您希望自动设置表单上所有文本框的格式,包括动态添加的新文本框。
为此,第一步是在焦点丢失到任何货币文本框时设置泛型事件处理程序:
void OnCurrencyTextBoxLeave(object sender, EventArgs e)
{
if (sender is TextBox)
{
decimal value;
var textBox = (TextBox)sender;
if (decimal.TryParse(textBox.Text, out value))
{
textBox.Text = value.ToString("C");
}
else textBox.Text = string.Empty;
}
}
然后我们可以在表单中添加两个函数,这些函数将文本框订阅到此事件处理程序以自动处理格式。 第一个仅在创建表单时调用一次,并处理在设计时(或首次创建表单时(添加的任何文本框:
private void SubscribeCurrencyTextboxes(Control container)
{
foreach (Control control in container.Controls)
{
if (!(control is TextBox)) continue;
((TextBox)control).Leave += OnCurrencyTextBoxLeave;
}
}
要使用这个函数,我们可以简单地在表单加载事件中调用它,或者覆盖OnLoad
如下所示:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SubscribeCurrencyTextboxes(this);
}
我们应该再添加一个函数来订阅运行时动态创建的文本框:
private void SubscribeCurrencyTextboxes(params TextBox[] textBoxes)
{
foreach (var textBox in textBoxes) textBox.Leave += OnCurrencyTextBoxLeave;
}
现在,当您动态创建文本框时,添加另一个调用 SubscribeCurrencyTextboxes
并为其提供实例列表,例如:
SubscribeCurrencyTextboxes(textBox1, textBox2, ... textBox20);
当用户在表单上留下每个文本框时,它将自动格式化为货币!
实现相同结果的另一种方法(也许是更好的方法(——特别是如果你需要此行为的可重用性——是从TextBox
继承并扩展它。(请在此处查看您的问题的其他答案,建议相同。 我们可以调用继承的控件CurrencyTextBox
,而不是动态地向窗体添加普通文本框,您可以添加此自定义类型的文本框。
为了帮助您入门,您可以声明:
public class CurrencyTextBox : TextBox
{
// Apply currency formatting when text is set from code:
public override string Text
{
get { return base.Text; }
set
{
base.Text = Format(RemoveCurrencyFormatting(value));
}
}
// Expose decimal currency value to code:
public decimal Value
{
get { return this.value; }
set { this.value = value; }
}
private decimal value = 0m;
// Remove currency formatting dollar signs and commas on focus:
protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
this.Text = RemoveCurrencyFormatting(this.Text);
this.SelectAll();
}
// Apply currency formatting when focus is lost:
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
Format(this.Text);
}
// Perform actual formatting:
private string Format(string text)
{
if (!decimal.TryParse(text, out this.value))
{
return value.ToString("C");
}
else return string.Empty;
}
// Remove currency formatting dollar signs and commas:
private string RemoveCurrencyFormatting(string value)
{
if (!string.IsNullOrEmpty(value))
{
return value
.Replace(NumberFormatInfo.CurrentInfo.CurrencySymbol, string.Empty)
.Replace(NumberFormatInfo.CurrentInfo.NumberGroupSeparator, string.Empty);
}
else return string.Empty;
}
}
此示例利用NumberFormatInfo
来处理货币符号(如北美的美元符号和千位分隔符逗号(,这些符号可能会使任何类型的货币格式出错。 请务必将 using
指令添加到 System.Globalization:
using System.Globalization;
您可以在此 MSDN 页上找到有关NumberFormatInfo
的详细信息。