Code vereinfachen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Code vereinfachen

    Hallo,

    Kann mir bitte jemand zeigen wie man diesen Code vereinfachen kann?

    Ich habe unter My.Settings ca. 100 Boolean Werte. Rated0 bis Rated100

    Aktuell habe ich noch 100 mal den gleichen Code


    If My.Settings.Rated0 = True And Treeview1.SelectedNode.Tag = 0 Then
    btnRate.Enabled = False
    End If

    If My.Settings.Rated1 = True And Treeview1.SelectedNode.Tag = 1 Then
    btnRate.Enabled = False
    End If


    usw... bis 100

    Wie vereinfache ich es, damit ich mit ein paar Zeilen alle Settings überprüfen kann?

    Und dann noch das hier:

    If My.Settings.Rated0 = False And Treeview1.SelectedNode.Tag = 0 Or My.Settings.Rated1 = False And Treeview1.SelectedNode.Tag = 1 Or ...
    btnRate.Enabled = True
    End If

    usw. bis 100

    Wie vereinfache ich das, damit ich mit ein paar Zeilen alle Settings überprüfen kann?

    Danke für eure Hilfe!

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

    Würde helfen, wenn du etwas über Dein Programm erzählst, was es machen soll. Evtl. ein bisschen mehr Code und nen Screenshot, damit man ne Vorstellung bekommt. So sieht es nach einem ziemlichen "Programmdesign-Fehler" aus. Sinnvolle Hilfe braucht etwas mehr Info.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Also ich habe ein Treeview in dem man Sachen auswählen und anschließend bewerten kann. Allerdings soll man dies nur einmal können. Deshalb speichere ich beim Klick auf den Bewerten Button in My.Settings Booleans für die jeweilige Sache ab, die ich dann später wieder überprüfe.

    Sache 10 => Rated10 usw.

    Wenn Rated10 True ist, dann wird der Bewertenbutton deaktiviert, wenn Rated10 False ist, dann wird der Bewertenbutton aktiviert.

    Die Sachen identifiziere ich über die Node Tags, in denen die ID steht (0-100).

    If My.Settings.Rated1 = True And Treeview1.SelectedNode.Tag = 1 Then
    btnRate.Enabled = False
    End If


    Heißt zum Beispiel: Wenn die 2. Sache im Treeview schon bewertet wurde und die 2. Sache ausgewählt ist, dann deaktiviere den Bewertungsbutton.


    If My.Settings.Rated0 = False And Treeview1.SelectedNode.Tag = 0 Or My.Settings.Rated1 = False And Treeview1.SelectedNode.Tag = 1 Or ...
    btnRate.Enabled = True
    End If


    Heißt zum Beispiel: Wenn die 1. oder 2. Sache im Treeview noch nicht bewertet wurde und die 1. oder 2. Sache ausgewählt ist, dann aktiviere den Bewertungsbutton.

    Mir ist bewusst, dass die Methode nicht das Gelbe vom Ei ist. Ursprünglich wollte ich es innerhalb von wenigen Zeilen mit PHP und MySQL abhandeln, aber leider bin ich auf ein Problem gestoßen, das noch niemand lösen konnte, deshalb habe ich nun versucht es lokal zu lösen.

    Danke für eure Hilfe.

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

    Ist das TreeViewControl unbedingt erforderlich? Ich hab das nie benutzt und kann darüber kaum was sagen. Ich glaube nicht, dass dieses Control DataBinding richtig unterstützt. Pefekt wäre es, wenn Du Dich für ein DataGridView entscheiden würdest, dann könntest die ganzen Vorteile von Databinding nutzen, ohne überhaupt viel Code schreiben zu müssen.

    Ansonsten. Erstelle Dir z. B. eine Klasse "RatingItem", kapsle dort Deine gewünschten Properties und speichere Deine Daten in einer Textdatei, XML-Datei... oder sonst wo. Der Weg über My.Settings ist hier in meinen Augen nicht der Richtige.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Was soll bei Neustart des Programms passieren?
    Sind die vielen Settings überhaupt erforderlich?
    Pack die Dir in eine DataTable, die Du q&e speichern und laden kannst, in die Settings kannst Du da ggf. eine Prüfsumme eintragen.
    Oder Du hältst die Daten nur im Spaicher, ohne sie abzulegen.
    Wie genau ist Dein Plan?
    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!
    jo, Treeview ist gemein, weil nicht Databindeable.
    Ich hab mal Treeview-Sachen in einem Xml-Document gespeichert (NodeText, IsExpanded).
    Fandich passend, weil Xml ja auch eine Baumstruktur anlegt: Xml+DragnDrop
    Ist leider nicht ganz einfach, und du müsstest das Datenmodell dahingehend erweitern, dass zu einem TreeNode auch eine Bewertung abgespeichert und gelesen werden kann.
    Das hat mir gestern iwi keine Ruhe gelassen. Wie gesagt, das TreeView habe ich nie wirklich verwendet, habs aber trotzdem mal versucht, halbwegs, mit DataBinding aufzustellen. Muss auch dazu sagen, dass ich, was DataBinding angeht, auch nicht wirklich viel Ahnung hab, darum soll es ein Denkanstoss sein, keine gültige Lösung. Ist halt auch kein richtiges DataBinding, sondern so ein DrumRum.... Aber trotzdem zeigt es Dir vielleicht, dass man sein Datenmodell richtig aufstellen sollte, sonst endet es in endlosen "IF-Abfragen".

    In wie weit, dieser Code brauchbar ist, weiss ich nicht.

    Du brauchst ein DataSet, leg dort eine DataTable an (siehe Screenshot).

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _savePath As String = "items.xml"
    3. Private Sub LoadItems()
    4. 'DataSet füllen.
    5. If IO.File.Exists(_savePath) Then
    6. Me.DataSet11.ReadXml(_savePath)
    7. End If
    8. 'Für jede Row im DataSet einen neuen TreeNode erzeugen
    9. For Each r As DataSet1.RatingItemRow In Me.DataSet11.RatingItem.Rows
    10. AddItem(r)
    11. Next
    12. End Sub
    13. Private Sub AddNewItem()
    14. 'Neue Zeile für das DataSet erzeugen.
    15. Dim r As DataSet1.RatingItemRow = DirectCast(Me.DataSet11.Tables("RatingItem").NewRow, DataSet1.RatingItemRow)
    16. 'Neue Zeile in DataSet einfügen.
    17. Me.DataSet11.RatingItem.AddRatingItemRow(r)
    18. 'Werte für die DataSet-Zeile festlegen.
    19. r.Description = "test" & r.ID.ToString()
    20. r.IsRated = False
    21. r.Rating = 0
    22. 'DataSet speichern
    23. Me.DataSet11.WriteXml(_savePath)
    24. 'Neue Zeile ins TreeView einhängen.
    25. AddItem(r)
    26. End Sub
    27. Private Sub AddItem(ByVal r As DataSet1.RatingItemRow)
    28. 'TreeNode erzeugen
    29. Dim tN As New TreeNode(r.Description)
    30. 'Name (=Key) für den ersten TreeNode festlegen
    31. tN.Name = r.ID.ToString()
    32. 'Als Tag wird die Zeile im DataSet festgelegt
    33. tN.Tag = r
    34. 'Hier prüfen, ob bereits gevoted wurde
    35. If r.IsRated Then
    36. 'wenn ja, einen ChildTreeNode anhängen, welcher als Tag wieder die aktuelle Zeile im DataSet erhält.
    37. Dim tN1 As New TreeNode(r.Rating.ToString())
    38. tN1.Tag = r
    39. tN.Nodes.Add(tN1)
    40. End If
    41. 'TreeNode ins TreeView einhängen.
    42. Me.TreeView1.Nodes.Add(tN)
    43. End Sub
    44. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    45. LoadItems()
    46. End Sub
    47. 'In dieser Sub wird abgestimmt.
    48. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    49. Dim rating As Integer = 0
    50. 'Rating aus der TextBox holen, nur wenn gültiger Integer
    51. If Not Integer.TryParse(Me.TextBox1.Text, rating) Then
    52. Exit Sub
    53. End If
    54. If Not IsNothing(Me.TreeView1.SelectedNode) Then
    55. 'Aus dem Tag die Zeile im DataSet holen.
    56. Dim r As DataSet1.RatingItemRow = DirectCast(Me.TreeView1.SelectedNode.Tag, DataSet1.RatingItemRow)
    57. 'Rating festlegen.
    58. r.Rating = rating
    59. 'Hier abfragen, ob bereits gevoted wurde. Ich finde es besser, wenn man auch bereits gevotete Werte
    60. 'in Nachhinein ändern kann. Also die Sache mit dem Button disablen ist nicht schön in meinen Augen.
    61. 'Jedoch kannst hier, falls Du es wünscht, den Button disablen.
    62. If Not r.IsRated Then
    63. 'Wenn noch nicht gevoted, eine neues Child einhängen.
    64. Dim tN As New TreeNode(r.Rating.ToString())
    65. 'Das Child bekommt auch wieder den Tag der akutellen Zeile im DataSet
    66. tN.Tag = r
    67. 'Festlegen, dass bereits gevoted wurde
    68. r.IsRated = True
    69. 'Child einhängen
    70. Me.TreeView1.SelectedNode.Nodes.Add(tN)
    71. Else
    72. 'Wenn bereits gevoted wurde, das Rating entsprechend aktualisieren.
    73. Me.TreeView1.Nodes.Find(r.ID.ToString(), False)(0).Nodes(0).Text = r.Rating.ToString()
    74. End If
    75. 'DataSet speichern.
    76. Me.DataSet11.WriteXml(_savePath)
    77. End If
    78. End Sub
    79. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    80. 'Hier können Einträge wieder gelöscht werden.
    81. If Not IsNothing(Me.TreeView1.SelectedNode) Then
    82. 'Tag der selektierten Node in die Zeile des DataSets casten.
    83. Dim r As DataSet1.RatingItemRow = DirectCast(Me.TreeView1.SelectedNode.Tag, DataSet1.RatingItemRow)
    84. 'Eintrag aus dem TreeView löschen. ID = eindeute Bezeichnung der Node.
    85. Me.TreeView1.Nodes.RemoveByKey(r.ID.ToString())
    86. 'Zeile aus dem DataSet löschen
    87. Me.DataSet11.RatingItem.Rows.Remove(r)
    88. 'DataSet speichern.
    89. Me.DataSet11.WriteXml(_savePath)
    90. End If
    91. End Sub
    92. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    93. 'Ein neues, leeres, Item hinzfügen.
    94. AddNewItem()
    95. End Sub
    96. End Class


    Ich hab Dir jede Menge Kommentare in den Code geschrieben.
    Bilder
    • Unbenannt.JPG

      11,73 kB, 151×105, 165 mal angesehen
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o