C# 如何将textbox格式化方法应用于所有textbox控件

C# 如何将textbox格式化方法应用于所有textbox控件,c#,textbox,windows-forms-designer,masking,C#,Textbox,Windows Forms Designer,Masking,好的,我正在尝试为我表单上的所有文本框应用会计编号格式 现在,我在这里做了一些研究,发现这篇文章将帮助我设定目标 然后我找到了另一篇文章,在表单上应用所有文本框的格式,而不向所有控件单独添加代码 问题是,上的代码使用控件名,这将把它绑定到单个textbox控件。我尝试了控件名(TextoBox),但也失败了 还有另外一个问题要考虑,即使我设法克服了上面的问题,代码也是一个事件,它是以控件名命名的,所以如果我把它应用到一个类或方法并调用它,我认为它不会起作用。 虽然我已经有了我想要的解决方案,但我

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

现在,我在这里做了一些研究,发现这篇文章将帮助我设定目标

然后我找到了另一篇文章,在表单上应用所有文本框的格式,而不向所有控件单独添加代码

问题是,上的代码使用控件名,这将把它绑定到单个textbox控件。我尝试了控件名(TextoBox),但也失败了

还有另外一个问题要考虑,即使我设法克服了上面的问题,代码也是一个事件,它是以控件名命名的,所以如果我把它应用到一个类或方法并调用它,我认为它不会起作用。 虽然我已经有了我想要的解决方案,但我想知道是否有一种更快的方法来应用它,这不会给我的代码增加太多行。努力学习如何让事情更容易阅读,多做少做。有什么建议吗


谢谢你的阅读。

听起来你已经拥有了所有的部分,只是需要帮助才能把它们组合起来。对于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的评论来看:如果会计真的很重要,我建议使用十进制而不是双精度。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;
}
publicYourFormConstructor()
{
foreach(form.Controls.OfType()中的var textbox)
textbox.Leave+=FormatCurrencyText;
}
私有void FormatCurrencyText(对象发送方,事件参数e)
{
var textbox=发送方作为textbox;
双重价值;
if(Double.TryParse(textbox.Text,out值))
textbox.Text=String.Format(System.Globalization.CultureInfo.CurrentCulture,“{0:C2}”,值);
其他的
textbox.Text=String.Empty;
}

如果会计真的很重要,我建议使用十进制而不是双精度。Double会更快,但Decimal更精确。找出哪种权衡是有意义的,并据此做出决定。它非常有效!非常感谢你帮了我的忙!现在,快速提问,如果我想要一个没有格式设置的文本框控件怎么办?我尝试了:Mytextbox.Text=String.Format(“{0}”,txbTrackingID.Text);我在MSDN上的CurrentCulture上找到了上面的一些变体和一些其他信息,但没有成功。你需要一些方法来专门识别这个文本框,并以不同的方式处理它。如果您知道该控件,则可以解除偶数处理程序的挂钩。请参阅我的编辑。