如何将文本框格式化方法应用于所有文本框控件
本文关键字:文本 控件 应用于 格式化 方法 | 更新日期: 2023-09-27 18:08:41
好的,所以我试图应用会计编号格式的所有文本框在我的表单。
现在,我在这里做了一些研究,发现这篇文章可以帮助我设置格式。
然后我找到了另一篇文章,将格式应用于表单上的所有文本框控件,而不需要为所有控件单独添加格式代码。
嗯,问题是格式上的代码使用控件名称,这将把它绑定到单个文本框控件。我尝试了控件名称(textbox)代替,它也失败了。
还有另一个问题要考虑,即使我设法克服了上述问题,format的代码也是一个事件,以控件名称命名,所以我认为如果我将其应用于类或方法并调用它,它将不起作用。
虽然我已经有了我想要的解决方案,但我想知道是否有一种更快的方法来应用它,这将不会为我的代码添加那么多行。试着学习如何让东西更容易阅读,少做多做。任何建议吗?
听起来你已经掌握了所有的部分,只是需要帮助把它们组合在一起。对于ControlName,您可以将发送方对象强制转换为控件并访问其Name属性。
void SetProperty(Control ctr)
{
foreach (Control control in ctr.Controls)
{
if (control is TextBox)
{
control.Leave += control_Leave;
}
else
{
if (control.HasChildren)
{
SetProperty(control);
}
}
}
}
void control_Leave(object sender, EventArgs e)
{
var textBox = sender as TextBox;
Double value;
if (Double.TryParse(textBox.Text, out value))
textBox.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value);
else
textBox.Text = String.Empty;
}
用法:
SetProperty(this);
另外,从我对OP的评论来看:如果会计真的很重要,我建议使用Decimal类型而不是Double类型。Double会更快,但Decimal更精确。弄清楚哪种交易是有意义的,并在此基础上做出决定。
按注释编辑:
myTextBox.Leave -= control_Leave
如果您知道控件的名称,则上述操作将有效。在使用SetProperty(this)之后,你需要这样做。如果您想在SetProperty()方法中处理这个问题,请对控件进行检查。Name == "myTextBox".
您可以将多个控件事件(使用相同的参数)订阅到相同的事件处理程序:
public YourFormConstructor()
{
foreach(var textbox in form.Controls.OfType<TextBox>())
textbox.Leave += FormatCurrencyText;
}
private void FormatCurrencyText(object sender, EventArgs e)
{
var textbox = sender as TextBox;
Double value;
if (Double.TryParse(textbox.Text, out value))
textbox.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value);
else
textbox.Text = String.Empty;
}