Liste von Datatypes

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von cl10k.

    Liste von Datatypes

    Hallo,

    ich möchte ein UserControl (hauptsächlich geht es dort um eine Textbox) auf eine von drei Möglichkeiten Datentypen beschränken: String, Single, Integer und die Eingabe dann auch Validieren können.

    Ich habe es bereits mit Überladen versucht, allerdings habe ich keine Idee wie man dann unterscheiden sollte, ob die Eingabe "123abc" ein String sein soll oder eine Zahl mit Tippfehler. Also möchte ich stattdessen in den Properties des UserControls im Designer auswählen können, welcher Datentyp gerade relevant ist.

    Ich benötige für die (Designer-)Properties eines UserControls also eine einfache Liste von DataTypes.

    Wie man ein Enum als Property erstellt, ist mir klar. Aber wie formuliere ich die Liste richtig? So wie unten geht es natürlich nicht...

    Quellcode

    1. Public Enum Typus as DataType
    2. String
    3. Single
    4. Integer
    5. End Enum


    lg

    VB.NET-Quellcode

    1. Public Enum Typus As Integer
    2. [String]
    3. [Single]
    4. [Integer]
    5. WasGutes_WasMalKeinReserviertesWortIst
    6. End Enum
    Die Rechteckigen Klammern sind erforderlich, weils sich jeweils um reservierte Worte handelt.

    Wenn du im Zusammenhang damit auf weitere Probleme stößt (bit-Operatoren, Vorränge etc.), bilde dich gründlich: dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) enthält ein erschlagendes Kapitel über Enums.

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

    cl10k schrieb:

    Aber wie formuliere ich die Liste richtig?
    Die Syntax mit dfen eckigen Klammern für reservierte Worte ist sicher schön, trotzdem empfehle ich Dir, solche Worte nicht zu verwenden, um Dich nicht zusätzlich zu verwirren. Außerdem halte ich persönlich diese Schreibweise mit den eckigen Klammern für lästig.

    VB.NET-Quellcode

    1. Public Enum DataType As Integer
    2. MyString
    3. MySingle
    4. MyInteger
    5. NochWasAnderes
    6. End Enum
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    die eckigen Klammern benötigt man normalerweise beim Zugriff eh nicht. Was es übrigens ebenfalls gibt ist TypeCode, wenn du die möglichen Werte nicht so stark reduzieren möchtest. Da die TypeCode-Einträge abgesehen von String alle aufeinanderfolgende Zahlen besitzen, kannst du sie einfach in ein Array packen und das Enum als Index verwenden.
    Hier noch das Enum (ohne eckige Klammern)

    Quellcode

    1. Empty = 0
    2. Object = 1
    3. DBNull = 2
    4. Boolean = 3
    5. Char = 4
    6. SByte = 5
    7. Byte = 6
    8. Int16 = 7
    9. UInt16 = 8
    10. Int32 = 9
    11. UInt32 = 10
    12. Int64 = 11
    13. UInt64 = 12
    14. Single = 13
    15. Double = 14
    16. Decimal = 15
    17. DateTime = 16
    18. String = 18


    @ErfinderDesRades: Wenn man das Enum importiert, muss man den Pfad nicht mehr angeben.

    Gruß
    ~blaze~
    Euch kann man auch nicht aus den Augen lassen, hier ging es ja noch weiter^^

    Ich probiere grad ein bisschen mit Enum-Alternativen herum. So richtig glücklich bin ich mit der bisherigen Lösung noch nicht.

    Anbei ein kurzer Ausschnitt aus meinem Usercontrol (reduziert auf die aktuelle Fragestellung):

    VB.NET-Quellcode

    1. Public Enum Datentypus As Integer
    2. [String]
    3. [Single]
    4. [Integer]
    5. End Enum
    6. Public Class SPK_Textbox
    7. Private pTypus As Datentypus
    8. Public Property Typus() As Datentypus
    9. Get
    10. Return pTypus
    11. End Get
    12. Set(ByVal value As Datentypus)
    13. pTypus = value
    14. End Set
    15. End Property
    16. 'hier dann mehrere andere Properties, u.a. eine Textbox "txt_Wert" die Single, Integer oder Strings aufnehmen soll
    17. 'Validierung der Textboxeingabe entsprechend des vorgewählten Datentyps
    18. Private Sub txt_Wert_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txt_Wert.Validating
    19. Validierung(txt_Wert.Text, pTypus)
    20. End Sub
    21. Sub Validierung(ByVal temp, ByVal pTypus)
    22. Select Case pTypus
    23. Case 0 'String
    24. If String.IsNullOrEmpty(temp.trim()) Then
    25. SPK_ErrorProvider.SetError(txt_Wert, "String ungültig")
    26. Else
    27. SPK_ErrorProvider.SetError(txt_Wert, "")
    28. End If
    29. Case 1 'Single
    30. If IsNumeric(temp) Then
    31. SPK_ErrorProvider.SetError(txt_Wert, "")
    32. Else
    33. SPK_ErrorProvider.SetError(txt_Wert, "Single ungültig")
    34. End If
    35. End Select
    36. End Sub
    37. End Class


    Die Case-Schleife nutze ich um eine Validierung der Textbox-Eingaben entsprechend des gewählten Datentypus vorzunehmen. Richtig elegant sieht das aber nicht aus. Aber ich bleibe am Ball. Erstmal gilt es genug Grundlagen zu lernen um endlich mal effizienter zu programmieren...

    lg

    ErfinderDesRades schrieb:

    das kompiliert doch garnet, was du uns hier vorsetzt.


    Darum schrieb ich:
    Anbei ein kurzer Ausschnitt aus meinem Usercontrol (reduziert auf die aktuelle Fragestellung)


    Unten also nun der komplette Code des UserControls. Ich konzentriere mich derzeit NUR auf die Auswahl des Datentyps der in das UC eingegeben werden soll. Alle weiteren Eigenschaften stehen vorerst hinten an...

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Enum Datentypus As Integer
    3. [String]
    4. [Single]
    5. [Integer]
    6. End Enum
    7. Public Class SPK_Textbox
    8. Private pTypus As Datentypus
    9. <Category("Eingaben")> _
    10. Public Property Typus() As Datentypus
    11. Get
    12. Return pTypus
    13. End Get
    14. Set(ByVal value As Datentypus)
    15. pTypus = value
    16. End Set
    17. End Property
    18. 'Bezeichnung (Text-Eigenschaft) des Eingabefeldes
    19. <Category("Eingaben"), Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    20. Overrides Property Text() As String
    21. Get
    22. Return lbl_Bezeichner.Text
    23. End Get
    24. Set(ByVal Value As String)
    25. lbl_Bezeichner.Text = Value
    26. End Set
    27. End Property
    28. 'Eingabe der aktuellen Variablen
    29. <Category("Eingaben")> _
    30. Public Property Wert() As Object
    31. Get
    32. Return txt_Wert.Text
    33. End Get
    34. Set(ByVal value As Object)
    35. txt_Wert.Text = value
    36. End Set
    37. End Property
    38. 'Anzeige des zulässigen Wertebereichs der aktuellen Variablen
    39. <Category("Eingaben")> _
    40. Public Property Bereich()
    41. Get
    42. Return lbl_Bereich.Text
    43. End Get
    44. Set(ByVal value)
    45. lbl_Bereich.Text = value
    46. End Set
    47. End Property
    48. 'Valierung der Eingaben; Textchanged-Event für JIT-Anpassung der TAGs, Validating-Event(bei Verlassen) um zu verhindern das jemand ohne Eingabe einfach weiterspringt
    49. Private Sub txt_Wert_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt_Wert.TextChanged
    50. Validierung(txt_Wert.Text, pTypus)
    51. End Sub
    52. Private Sub txt_Wert_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txt_Wert.Validating
    53. Validierung(txt_Wert.Text, pTypus)
    54. End Sub
    55. Sub Validierung(ByVal temp, ByVal pTypus)
    56. Select Case pTypus
    57. Case 0 'String
    58. If String.IsNullOrEmpty(temp.trim()) Then
    59. SPK_ErrorProvider.SetError(txt_Wert, "String ungültig")
    60. Else
    61. SPK_ErrorProvider.SetError(txt_Wert, "")
    62. End If
    63. Case 1 'Single
    64. If IsNumeric(temp) Then
    65. SPK_ErrorProvider.SetError(txt_Wert, "")
    66. Else
    67. SPK_ErrorProvider.SetError(txt_Wert, "Single ungültig")
    68. End If
    69. End Select
    70. End Sub
    71. End Class

    ErfinderDesRades schrieb:


    also bei dir steht tatsächlich

    Sub Validierung(ByVal temp, ByVal pTypus)


    Ja! Soweit scheint die Validierung auch zu funktionieren.

    Mit Option Strict On (benutze ich zum ersten Mal, dein Link ist aber sehr informativ):

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Public Enum Datentypus As Integer
    4. [String]
    5. [Single]
    6. [Integer]
    7. End Enum
    8. Public Class SPK_Textbox
    9. Private pTypus As Datentypus
    10. <Category("Eingaben")> _
    11. Public Property Typus() As Datentypus
    12. Get
    13. Return pTypus
    14. End Get
    15. Set(ByVal value As Datentypus)
    16. pTypus = value
    17. End Set
    18. End Property
    19. 'Bezeichnung (Text-Eigenschaft) des Eingabefeldes
    20. <Category("Eingaben"), Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    21. Overrides Property Text() As String
    22. Get
    23. Return lbl_Bezeichner.Text
    24. End Get
    25. Set(ByVal Value As String)
    26. lbl_Bezeichner.Text = Value
    27. End Set
    28. End Property
    29. 'Eingabe der aktuellen Variablen
    30. <Category("Eingaben")> _
    31. Public Property Wert() As Object
    32. Get
    33. Return txt_Wert.Text
    34. End Get
    35. Set(ByVal value As Object)
    36. txt_Wert.Text = CStr(value)
    37. End Set
    38. End Property
    39. 'Anzeige des zulässigen Wertebereichs der aktuellen Variablen
    40. <Category("Eingaben")> _
    41. Public Property Bereich() As String
    42. Get
    43. Return lbl_Bereich.Text
    44. End Get
    45. Set(ByVal value As String)
    46. lbl_Bereich.Text = value
    47. End Set
    48. End Property
    49. 'Valierung der Eingaben; Textchanged-Event für JIT-Anpassung der TAGs, Validating-Event(bei Verlassen) um zu verhindern das jemand ohne Eingabe einfach weiterspringt
    50. Private Sub txt_Wert_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt_Wert.TextChanged
    51. Validierung(txt_Wert.Text, pTypus)
    52. End Sub
    53. Private Sub txt_Wert_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txt_Wert.Validating
    54. Validierung(txt_Wert.Text, pTypus)
    55. End Sub
    56. Sub Validierung(ByVal temp As String, ByVal pTypus As Integer)
    57. Select Case pTypus
    58. Case 0 'String
    59. If String.IsNullOrEmpty(temp.Trim()) Then
    60. SPK_ErrorProvider.SetError(txt_Wert, "String ungültig")
    61. Else
    62. SPK_ErrorProvider.SetError(txt_Wert, "")
    63. End If
    64. Case 1 'Single
    65. If IsNumeric(temp) Then
    66. SPK_ErrorProvider.SetError(txt_Wert, "")
    67. Else
    68. SPK_ErrorProvider.SetError(txt_Wert, "Single ungültig")
    69. End If
    70. End Select
    71. End Sub
    72. End Class
    wow!
    glaub das erste mal, dassich sehe, wie jmd in strict On einsteigt, und gleich die Datentypen für sich arbeiten lässt, statt erstmal alles händisch zu casten. Da gebichmir mal Mühe, zu zeigen, wie Enums arbeiten können:

    VB.NET-Quellcode

    1. Public Enum Datentypus As Integer
    2. [String]
    3. [Single]
    4. [Integer]
    5. End Enum
    6. Public Class SPK_Textbox
    7. Private pTypus As Datentypus
    8. 'WithEvents txt_Wert As TextBox, SPK_ErrorProvider As ErrorProvider
    9. Private Sub txt_Wert_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles txt_Wert.Validating
    10. e.Cancel = Not IsValid()
    11. SPK_ErrorProvider.SetError(txt_Wert, If(e.Cancel, "", pTypus.ToString & " ungültig"))
    12. End Sub
    13. Function IsValid() As Boolean
    14. Select Case pTypus
    15. Case Datentypus.String
    16. Return True
    17. Case Datentypus.Integer
    18. Return Integer.TryParse(txt_Wert.Text, New Integer)
    19. Case Datentypus.Single
    20. Return Single.TryParse(txt_Wert.Text, New Single)
    21. Case Else
    22. Throw New NotSupportedException
    23. End Select
    24. End Function
    25. End Class
    Validierung bereits im TextChanged ist evtl. unerwünscht, dass halbfertige Eingaben bereits angemeckert werden.
    Gugge Control.Validating + ErrorProvider

    Man könnte sich auch was mit der Wert-Property überlegen - die muß ja bei Invalid Nothing zurückgeben. Ach das geht ja nicht, weil Integer und Single Structures sind. Also da hast du ein Design-Technisches Problem mit dieser Property


    Aber mach Option Strict On! lieber vollständig, also als Projekt-Einstellung und Einstellung der IDE.

    Und zu Enums enthält dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) ein hervorragendes Kapitel.

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