2016-06-09 26 views
1

我有一些类有一个字符串属性来容纳IBAN使用具有绑定源的自定义格式?

出于显示的目的,我想每4个字符后显示一个空值,例如:

'GB29 NWBK 6016 1331 9268 19' 

是否有可能编写实现ICustomFormatter一类,然后指定此新的自定义格式为文本框数据绑定?

或者会处理BindingComplete事件的BindingSource是更好的方法吗?

+0

如何写上字符串的扩展方法可能是回报格式化字符串?所以该方法将像字符串上的ToIBAN() – Dheeraj

+0

@Dheeraj一个扩展很容易编写,但我需要处理Parse和Format事件,而不是像'{0:I}'那样设置'I'是格式字符串 –

+0

如何使用“MaskedTextBox”进行显示? – DonBoitnott

回答

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

enter image description here

+0

当文本框获得焦点时,是否可以“解除格式化”字符串? –

+0

恐怕没有,除非你使用一个特殊的控制支持。数据绑定仅支持格式和解析。 –

+0

我正在使用自定义控件,因此很容易完成。 –