数据绑定期间自定义格式或转换 MaskedTextBox 中的数据

发布于 2024-12-29 23:30:01 字数 536 浏览 1 评论 0原文

我正在寻找一种方法来在 MaskedTextBox 中显示除它绑定到的数据(DataTable)之外的其他数据。

更具体地说:DataTable 包含一个 DateTime 列 (DateOfBirth)。每当年份为 1900 年时,我都希望在 MaskedTextBox 中将其显示为空,同时将其保留在基础数据表中,因为我使用 1900 表示“未知”。

示例:数据表中的值:1900-10-09 --[DataBinding]--> MaskedTextBox __-10-09

目前,我正在使用 BindingSource 的 CurrentItemChanged-Event 来修改 MaskedTextBox 的 Text-property。只要我简单地浏览数据表,就可以很好地工作。然而,当我开始编辑 MaskedTextBox 时,1900 年又回来了。

如果我能以某种方式拦截从 DataRow 传递到 MaskedTextBox 的值,而不是事后替换它,那就更好了。

或者也许有办法让 MaskedTextBox 将 1900 显示为空?

I am looking for a way to display other data in a MaskedTextBox than the data it is bound to (DataTable).

More specifically: The DataTable contains a DateTime column (DateOfBirth). Whenever the year is 1900, I would like to display it as empty in the MaskedTextBox while keeping it in the underlying DataTable, because I use 1900 for "unknown".

Example: Value in the DataTable: 1900-10-09 --[DataBinding]--> MaskedTextBox __-10-09

Currently, I am using the CurrentItemChanged-Event of the BindingSource, to modify the Text-property of the MaskedTextBox. That works nicely as long as I simply browse through the DataTable. However, as soon as I start editing the MaskedTextBox, 1900 is back.

It would be nicer if I could somehow intercept the value that is passed from the DataRow to the MaskedTextBox, instead of replacing it afterwards.

Or maybe there is a way to get the MaskedTextBox to display 1900 as empty?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情丝乱 2025-01-05 23:30:01

正如 Catalin 指出的,使用 Binding.Format 事件可以解决问题:

Binding mtbGebdatBinding = mtbGebdat.DataBindings.Add("Text", _bsPerson, (string)mtbGebdat.Tag, true);
mtbGebdatBinding.Format += new ConvertEventHandler(mtbGebdatBinding_Format);
void mtbGebdatBinding_Format(object sender, ConvertEventArgs e)
{
    if (DBNull.Value != e.Value)
    {
       string date = String.Format("{0:dd/MM/yyyy}", (DateTime)e.Value);
        if (date.Substring(6, 4) == "1900")
        {
            e.Value = date.Substring(0, 6);
        }
    }
}

As Catalin pointed out, using the Binding.Format event did the trick:

Binding mtbGebdatBinding = mtbGebdat.DataBindings.Add("Text", _bsPerson, (string)mtbGebdat.Tag, true);
mtbGebdatBinding.Format += new ConvertEventHandler(mtbGebdatBinding_Format);
void mtbGebdatBinding_Format(object sender, ConvertEventArgs e)
{
    if (DBNull.Value != e.Value)
    {
       string date = String.Format("{0:dd/MM/yyyy}", (DateTime)e.Value);
        if (date.Substring(6, 4) == "1900")
        {
            e.Value = date.Substring(0, 6);
        }
    }
}
和影子一齐双人舞 2025-01-05 23:30:01

我认为你需要一个 ValueConverter。创建一个从 IValueConverter 派生的类并在绑定中使用它。

I think that you need a ValueConverter. Create a class derived form IValueConverter and use it in your binding.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文