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

时间:2012-01-29 19:58:26

标签: c# events data-binding format maskedtextbox

我正在寻找一种方法来显示MaskedTextBox中的其他数据,而不是绑定到的数据(DataTable)。

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

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

目前,我正在使用BindingSource的CurrentItemChanged-Event来修改MaskedTextBox的Text-property。只要我浏览DataTable,那就很好用了。但是,一旦我开始编辑MaskedTextBox,1900就会回来。

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

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

3 个答案:

答案 0 :(得分:1)

为了完整性:Solution at codeproject

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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