2016-06-09 4 views
1

Ich habe eine Reihe von Klassen, die eine String-Eigenschaft haben, um die IBAN zu halten.Verwenden eines benutzerdefinierten Formats mit Bindungsquelle?

Zur Anzeige, würde Ich mag den Wert mit einem Raum angezeigt werden nach jeweils 4 Zeichen, zum Beispiel:

'GB29 NWBK 6016 1331 9268 19' 

Ist es möglich, eine Klasse zu schreiben, die ICustomFormatter implementiert und dann dieses neue benutzerdefinierte Format angeben für die Textbox Datenbindungen?

Oder wäre die Handhabung des BindingComplete Ereignisses der BindingSource ein besserer Weg?

+0

Wie über eine Erweiterungsmethode auf Zeichenfolge zu schreiben sein kann, dass die Renditen String formatiert? Also ist die Methode wie ToIBAN() auf String – Dheeraj

+0

@Dheeraj Eine Erweiterung ist einfach zu schreiben, aber ich würde die Parse-und Format-Ereignisse behandeln, anstatt etwas wie '{0: I}', wo 'I' ist die format string –

+0

Wie wäre es mit einer 'MaskedTextBox' für die Anzeige? – DonBoitnott

Antwort

1

Der allgemeine Ansatz besteht darin, benutzerdefinierte TypeConverter mit den Klasseneigenschaften dieses Typs zu verknüpfen.

Zum Beispiel:

Formatter:

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

Converter:

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

Beispieldatenklasse mit Eigenschaft:

public class MyObject 
{ 
    [TypeConverter(typeof(IBANTypeConverter))] 
    public string IBAN { get; set; } 
} 

Beispieldatenbindung:

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

Ist es möglich, die Zeichenfolge zu "unformatieren", wenn das Textfeld den Fokus erhält? –

+0

Ich habe Angst nein, außer wenn Sie eine spezielle Steuerung verwenden, die das unterstützt. Datenbindung unterstützt nur Format und Syntaxanalyse. –

+0

Ich benutze ein benutzerdefiniertes Steuerelement, so dass es leicht gemacht wird. –