UserControl mit Databinding und Stringformatierung

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Vatter.

    UserControl mit Databinding und Stringformatierung

    Hallo liebe Gemeinde,
    ich bin dabei ein Usercontrol zu verbrechen, dass ausschließlich über eine Bindingsource mit Daten versorgt werden soll. Ais Propertys gibts halt die Datasource und ein Array mit den ColumnNamen, damit ich die Werte aus der Bindingsource.List auslesen kann.
    Nun können die gebundenen Daten ja alle möglichen Typen repräsentieren (Date, String, Double, Integer usw.) und werden deshalb als Object übergeben. Ich habe dann ein wenig im Datagrid spioniert und dort gibt es für jede Spalte ja noch die Format-Eigenschaft, welche die Ausgabe z.B. eines Datums in allen möglichen Formatierungen erlaubt. Und das möchte ich nachbauen.
    Allerdings steht die Überladung der XY.ToString-Methode mit einem Formatstring nicht in allen Datentypen zur Verfügung, weshalb ich die Typen vorher analysieren und entsprechen umwandeln muß.
    Ich habe das jetzt in einer Testform so simuliert:
    Nach Eingabe eines Wertes in eine Textbox wird ein gewünschter Datentyp mittels Button erzeugt und an ein Object übergeben.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles BtnString.Click, BtnDouble.Click, BtnDecimal.Click, BtnDateTime.Click, BtnDate.Click, BtnInteger.Click
    2. Dim O As Object
    3. Select Case True
    4. Case sender Is BtnString
    5. O = TextBox1.Text
    6. Case sender Is BtnInteger
    7. O = Integer.Parse(TextBox1.Text)
    8. Case sender Is BtnDouble
    9. O = Double.Parse(TextBox1.Text)
    10. Case sender Is BtnDecimal
    11. O = Decimal.Parse(TextBox1.Text)
    12. Case sender Is BtnDate
    13. O = Date.Parse(TextBox1.Text)
    14. Case sender Is BtnDateTime
    15. O = DateTime.Parse(TextBox1.Text)
    16. Case Else
    17. O = "Ist keins von alle"
    18. End Select
    19. Ausgabe(O)
    20. End Sub
    21. Sub Ausgabe(o As Object)
    22. Select Case True
    23. Case TypeOf o Is Integer
    24. Label1.Text = CType(o, Integer).ToString("# ist Integer")
    25. Case TypeOf o Is DateTime
    26. Label1.Text = CType(o, DateTime).ToString(TextBox2.Text) & "ist DateTime"
    27. Case TypeOf o Is Date
    28. Label1.Text = CType(o, Date).ToString("D hh:mm:ss ") & "ist Date"
    29. Case TypeOf o Is Decimal
    30. Label1.Text = CType(o, Decimal).ToString("#.## ist Dezimal")
    31. Case TypeOf o Is Double
    32. Label1.Text = CType(o, Double).ToString("#.## ist Double")
    33. Case TypeOf o Is String
    34. Label1.Text = CType(o, String).ToString() & " ist ein String"
    35. Case Else
    36. End Select
    37. End Sub

    Dieses Beispiel funktioniert problemlos.
    Ich frage mich aber, ob es noch eine allgemeinere Lösung gibt, da ich hier ja in der Sub Ausgabe alle zu erwartenden Datentypen "auflisten" müsste. Object.ToString() lässt ja keinen Formatstring zu. Und für die korrekte Darstellung ist ja auch die richtige Typumwandlung notwendig, da die jeweilige .ToString-Methode an den jeweiligen Datentypen gebunden ist.

    Fielen Dank

    Vatter

    Achso: Textbox 2 enthält einen zu Fuß eingebbaren Formatstring zum Testen...
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Ui, die Typconverterklasse ist (für mich) ziemlich starker Tobak. Ich habe aber nicht so den Dreh gefunden, dass abhängig vom Datentyp der Formatstring richtig angewendet werden würde. Ich fürchte, ich bleib bei meiner Codewurst. Ich mein, für ein Usercontrol, dass Daten lesbar darstellen soll (ähnlich einem DGV, nur anners), reichen ja i.d.R. die in meinem Beispiel dargelegten Typen aus.
    Ich wollt halt vermeiden, dass ich da sonen simplen 1-Zeiler übersehe.
    Aber was mir grad einfällt:
    Es gäbe natürlich die Möglichkeit, die Datagridviewcell-Klasse zu nutzen. Da gibbts die Value- und die FormattedValue-Eigenschaft. Den Formatstring kann man der Style.Format-Eigenschaft übergeben. Was mich daran stört, sind die vielen von mir ungenutzten Properties. Wird dann nen bisserl unübergesichtlich :).
    Ich werd das mal testen

    Edit:
    Mist, geht nich weil laut Objektkatalog unter Datagridviewcell.FormattedValue:
    Der formatierte Wert der Zelle oder null, wenn die Zelle keinem System.Windows.Forms.DataGridView-Steuerelement angehört.
    Schade...
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vatter“ ()