如何将文本框格式设置方法应用于所有文本框控件

时间:2015-08-19 17:59:58

标签: c# textbox windows-forms-designer masking

好的,我正在尝试为我的表单上的所有文本框应用会计数字格式。

现在,我在这里做了一些研究,发现这篇帖子可以帮助我设置format

然后我发现另一篇文章在表单上应用了所有文本框controls的格式,而没有单独向所有控件添加format代码。

嗯,问题是format上的代码使用控件名称,它将绑定到单个文本框控件。我尝试了控件名称(TextoBox),它也失败了。

还有另一个需要考虑的问题,即使我设法克服了上述问题,format中的代码也是一个以控件名称命名的事件,所以如果我认为它不会起作用将它应用于类或方法并调用它。

虽然我已经找到了我想要的解决方案,但我想知道是否有更快的方法来应用它,这不会给我的代码添加太多行。试着学习如何让事情更容易阅读,少花钱多办事。有什么建议吗?

感谢阅读。

2 个答案:

答案 0 :(得分:1)

听起来你拥有所有的碎片,只需要帮助把它放在一起。对于ControlName,您可以将sender对象强制转换为控件并访问其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()方法中处理此问题,请检查control.Name ==“myTextBox”。

答案 1 :(得分:0)

您可以将多个控件事件(使用相同的args)订阅到同一个事件处理程序:

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;
}