我有很多类都有一个字符串属性来保存IBAN。
出于显示目的,我想在每4个字符后显示一个空格的值,例如:
'GB29 NWBK 6016 1331 9268 19'
是否可以编写一个实现ICustomFormatter
的类,然后为文本框数据绑定指定这种新的自定义格式?
或者处理BindingComplete
的{{1}}事件会更好吗?
答案 0 :(得分:1)
一般方法是将自定义TypeConverter
与该类型的类属性相关联。
例如:
<强>格式化:强>
public static class IBAN
{
public static string Format(string value)
{
if (string.IsNullOrEmpty(value)) return value;
var sb = new StringBuilder();
for (int i = 0; i < value.Length; i++)
(i != 0 && (i % 4) == 0 ? sb.Append(' ') : sb).Append(value[i]);
return sb.ToString();
}
}
<强>转换器:强>
public class IBANTypeConverter : TypeConverter
{
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
return IBAN.Format(value as string);
return base.ConvertTo(context, culture, value, destinationType);
}
}
包含属性的示例数据类:
public class MyObject
{
[TypeConverter(typeof(IBANTypeConverter))]
public string IBAN { get; set; }
}
示例数据绑定:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var data = new MyObject { IBAN = "GB29NWBK60161331926819" };
var form = new Form();
var tbIBAN = new TextBox { Parent = form, Left = 8, Top = 8, Width = form.ClientSize.Width - 16, Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right };
tbIBAN.DataBindings.Add("Text", data, "IBAN", true);
Application.Run(form);
}
}