【问题标题】:How to apply a textbox formatting method to all textbox controls如何将文本框格式化方法应用于所有文本框控件
【发布时间】:2015-08-23 11:14:35
【问题描述】:

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

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

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

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

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

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

感谢阅读。

【问题讨论】:

  • 如果会计真的很重要,我建议使用 Decimal 类型而不是 Double。 Double 会更快,但 Decimal 更精确。找出哪种权衡是有意义的,并据此做出决定。

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


【解决方案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 更精确。找出哪种权衡是有意义的,并据此做出决定。


按 cmets 编辑:

myTextBox.Leave -= control_Leave

如果您知道控件的名称,则上述方法将起作用。使用 SetProperty(this) 后,您需要执行此操作。如果您想在 SetProperty() 方法中处理此问题,请检查 control.Name == "myTextBox"。

【讨论】:

  • 效果很好!非常感谢您帮助我!
  • 现在,快速提问,如果我想要一个没有格式的文本框控件集怎么办?我试过了: Mytextbox.Text = String.Format("{0}",txbTrackingID.Text);尝试了上述的一些变体以及我在 MSDN 上的 CurrentCulture 上找到的一些其他信息,但没有成功。
  • 您需要一些方法来专门识别这个文本框并以不同的方式处理它。如果您知道控件,则可以解开偶数处理程序。查看我的编辑。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多