0

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

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

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

目前,我正在使用 BindingSource 的 CurrentItemChanged-Event 来修改 MaskedTextBox 的文本属性。只要我简单地浏览 DataTable,它就可以很好地工作。但是,一旦我开始编辑 MaskedTextBox,1900 又回来了。

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

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

4

3 回答 3

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);
        }
    }
}
于 2012-02-03T20:34:02.040 回答
1

为了完整性:codeproject 的解决方案

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

于 2012-02-02T10:14:17.907 回答
0

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

于 2012-01-29T20:11:01.323 回答