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

本文关键字:MaskedTextBox 转换 数据 格式化 数据绑定 自定义 | 更新日期: 2023-09-27 18:21:53

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

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

示例:DataTable中的值:1900-10-09--[DataBinding]->MaskedTextBox__-10-09

目前,我正在使用BindingSource的CurrentItemChanged事件来修改MaskedTextBox的Text属性。只要我简单地浏览DataTable,它就可以很好地工作。然而,当我开始编辑MaskedTextBox时,1900就回来了。

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

或者有一种方法可以让MaskedTextBox将1900显示为空?

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

为了完整性:代码项目的解决方案

您尝试过Binding::Format和Binding::Parse吗?http://msdn.microsoft.com/en-US/library/system.windows.forms.binding_members(v=vs.80).aspx

正如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);
        }
    }
}

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