如何将文本框格式化方法应用于所有文本框控件
How to apply a textbox formatting method to all textbox controls
好的,所以我正在尝试为我的表单上的所有文本框应用会计编号格式。
现在,我在这里做了一些研究,发现这个 post 可以帮助我设置 format。
然后我发现另一个 post 可以为表单上的所有文本框 控件 应用格式,而无需将 format 代码单独添加到所有控件。
嗯,问题是 format 上的代码使用了控件名称,它将把它绑定到单个文本框控件。我尝试了控件名称 (TextoBox),但也失败了。
还有一个问题需要考虑,即使我设法解决了上述问题,format 中的代码是一个事件,以控件名称命名,所以我认为它不会起作用如果我将它应用于 class 或方法并调用它。
虽然我已经有了我想要的解决方案,但我想知道是否有更快的应用方法,不会在我的代码中添加太多行。努力学习如何让事情更容易阅读,事半功倍。有什么建议吗?
感谢阅读。
听起来你已经准备好了,只是需要帮助将它们组合起来。对于 ControlName,您可以将发送者对象转换为控件并访问其名称 属性.
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() 方法中处理此问题,请检查 control.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;
}
好的,所以我正在尝试为我的表单上的所有文本框应用会计编号格式。
现在,我在这里做了一些研究,发现这个 post 可以帮助我设置 format。
然后我发现另一个 post 可以为表单上的所有文本框 控件 应用格式,而无需将 format 代码单独添加到所有控件。
嗯,问题是 format 上的代码使用了控件名称,它将把它绑定到单个文本框控件。我尝试了控件名称 (TextoBox),但也失败了。
还有一个问题需要考虑,即使我设法解决了上述问题,format 中的代码是一个事件,以控件名称命名,所以我认为它不会起作用如果我将它应用于 class 或方法并调用它。
虽然我已经有了我想要的解决方案,但我想知道是否有更快的应用方法,不会在我的代码中添加太多行。努力学习如何让事情更容易阅读,事半功倍。有什么建议吗?
感谢阅读。
听起来你已经准备好了,只是需要帮助将它们组合起来。对于 ControlName,您可以将发送者对象转换为控件并访问其名称 属性.
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() 方法中处理此问题,请检查 control.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;
}