Redundanz bei 4 Radio-Button vermeiden

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Redundanz bei 4 Radio-Button vermeiden

    Hi, ich habe folgenden Quelltext. Es gibt 4 RadioButtons und je nachdem welcher aktiv ist, sollen 2 Werte in die entsprechende DataTable
    eingetragen werden.

    VB.NET-Quellcode

    1. If RadioButton1.Checked = True Then
    2. Dim row = DataSet01.DataTable1.NewDataTable1Row()
    3. row.Titel = TextBox1.Text
    4. row.Link = TmpLink
    5. DataSet01.DataTable1.AddDataTable1Row(row)
    6. ElseIf RadioButton2.Checked = True Then
    7. Dim row = DataSet01.DataTable2.NewDataTable2Row()
    8. row.Titel = TextBox1.Text
    9. row.Link = TmpLink
    10. DataSet01.DataTable2.AddDataTable2Row(row)
    11. ElseIf RadioButton3.Checked = True Then
    12. Dim row = DataSet01.DataTable3.NewDataTable3Row()
    13. row.Titel = TextBox1.Text
    14. row.Link = TmpLink
    15. DataSet01.DataTable3.AddDataTable3Row(row)
    16. ElseIf RadioButton4.Checked = True Then
    17. Dim row = DataSet01.DataTable4.NewDataTable4Row()
    18. row.Titel = TextBox1.Text
    19. row.Link = TmpLink
    20. DataSet01.DataTable4.AddDataTable4Row(row)
    21. End If


    Der Quelltext funktioniert so, allerdings habe ich 4mal fast identische Befehle. Mein Problem ist, dass ich die DataTables zwar in ein Array packen, diese aber nicht verwenden kann.

    VB.NET-Quellcode

    1. Dim row = DataSet01.DataTable1.NewDataTable1Row()
    In diesen Befehl bekomme ich auf Teufel komm raus keine Variable hinein.

    Hat jemand ne Idee, wie man den Quellcode mit identischer Funktion kürzen kann?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    die Zeilen 2-4, 7-9, 12-14,17-19 können weg, wenn du die jeweils andere AddDataTable<X>Row()-Überladung nimmst.
    Auch scheint das Datenmodell verfehlt, denn scheinbar hast du mehrere Tabellen mit exakt derselben Struktur.
    Bei richtig Modellierung gibt es in einem Datenmodell aber für eine Struktur nur eine Tabelle.
    Hast du dein Modell entsprechend umgebaut, dann kommt man auch mit nur einer Add-Methode aus, und obige Geschichte vereinfacht sich noch einmal.

    Und nebenbei: Boolean, Vergleiche und bedingte Verzweigungen
    Tatsache, ein Spalte zur welcher Liste der Eintrag gehört hätte 3 DataTables überflüssig gemacht. Da aber schon Daten drinne stehen
    stehen lässt sich im Nachhinein nichts mehr dran ändern. Die =True sind rausgestrichen.

    ErfinderDesRades schrieb:

    die Zeilen 2-4, 7-9, 12-14,17-19 können weg, wenn du die jeweils andere AddDataTable<X>Row()-Überladung nimmst.


    Könntest du bitte nochmal genau schreiben, wie der Befehl dann aussieht?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Hallo @Nils_Kr,
    also ich würde um es etwas übersichtlicher zu halten leiber Select Case als mehrere If abfragen nutzen

    kleines Beispiel:

    VB.NET-Quellcode

    1. Dim auswahl As Integer
    2. For i As Integer = 1 To 4
    3. If (Me.Controls("RadioButton" & i).ToString.Substring(Me.Controls("RadioButton" & i).ToString.Length - 4)) = "True" Then auswahl = i
    4. Next
    5. Select Case auswahl
    6. Case 1
    7. 'Was passiert wen RadioButton1 ausgewählt ist
    8. Case 2
    9. 'Was passiert wen RadioButton2 ausgewählt ist
    10. Case 3
    11. 'Was passiert wen RadioButton3 ausgewählt ist
    12. Case 4
    13. 'Was passiert wen RadioButton4 ausgewählt ist
    14. End Select

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Ruerte“ ()

    Nils_Kr schrieb:

    Tatsache, ein Spalte zur welcher Liste der Eintrag gehört hätte 3 DataTables überflüssig gemacht. Da aber schon Daten drinne stehen stehen lässt sich im Nachhinein nichts mehr dran ändern.
    Von dieser Denke rate ich dringend ab.
    Das Datenmodell ist das Fundament der Anwendung.
    Ist ein Fundament fehlerhaft, wird das korrigiert - egal wieviele Stockwerke bereits drauf aufgebaut sind.
    Das ist mühsam und teuer, aber unvergleichlich billiger als die Kosten, die entstehen, wenn man einfach weiter baut.
    Und je früher man den Umbau anpackt, desto billiger - das billigste also ist: sofort.
    (Und mach zuvor ein Gesamt-Backup, und teste das auf Lauffähigkeit, weil beim Umbau kann u.U. auch einiges irreversibel kaputt gehen)

    Nils_Kr schrieb:

    Könntest du bitte nochmal genau schreiben, wie der Befehl dann aussieht?
    könnte ich.
    Besser aber, du lernst, was eine "Überladung" ist (Grundlagen: Fachbegriffe), wie man im ObjectBrowser eine Methode in ihren vielen (in diesem Falle sinds jeweils 2) Überladungen auffindet, und wie man die im OB gemachten Angaben zur Aufrufe-Syntax praktisch in Code überträgt.
    Kurz und kränkend (leider, aber nicht so gemeint): Lern programmieren.

    zum OB: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    oder guck auch den Film "Inspection" auf vier Views-Videos, da wird ein typDataset im OB inspiziert, und werden auch die Add-Methoden kurz gefunden und erwähnt.

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

    Ruerte schrieb:

    VB.NET-Quellcode

    1. If (Me.Controls("RadioButton" & i).ToString.Substring(Me.Controls("RadioButton" & i).ToString.Length - 4)) = "True" Then auswahl = i

    @Nils_Kr Das ist suboptimal, da die Strings der Namen, wenn ein Control umbenannt wird, nicht mit umbenannt wird.
    Um solch Information zu übertragen, nutze die Property Control.Tag, die kannst Du als String im Designer vorgeben.

    VB.NET-Quellcode

    1. Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged, RadioButton4.CheckedChanged
    2. Dim value As Integer = 0
    3. If Not Integer.TryParse(DirectCast(sender, Control).Tag.ToString(), value) Then
    4. Return
    5. End If
    6. Select Case value
    7. '...
    8. End Select
    9. End Sub

    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!
    @Ruerte: Allgemein gilt ja, dass man lieber SelectCase als mehrere If-Abfragen benutzen soll. In diesem Fall hätte ich aber 4 Zeilen mehr und das Gebastel mit den Strings,
    da finde ich If RadioButtonX.checked Then eleganter. Aber danke für den Hinweis auf SelectCase.

    @EDR: Stimmt, das Datenmodell lässt sich auch im Nachhinein noch ändern. Das Programm läuft jetzt schon seit über einem Jahr ohne einen einzigen Ausfall und
    die abgelegten Daten sind relativ statisch. Aber bei der nächsten Optimierungsrunde werd ich mich dann nochmal mit dem DataSet befassen.

    Zum lern programmieren: Deshalb poste ich hier meinen (bereits funktionierenden) Quellcode, da mir klar ist, dass ich bisher nur einen Bruchteil der Möglichkeiten kenne.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    @Nils_Kr ich kenne mich zwar in Sachen Datenbank nicht wirklich aus, solltest du so was in der Art wie

    VB.NET-Quellcode

    1. Dim i as integer
    2. Dim row = DataSet01.DataTable(i).NewDataTable(i)Row()

    hinbekommen solltest du es um einiges kleiner bekommen :) (8Zeilen)

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @Ruerte: fail, in mehrfacher Hinsicht. Insbesondere sind untypisierte Zugriffe echt NoGo, wenn typisierte Zugriffe parat stehen, die man nur zu verwenden braucht.

    @Nils_Kr: Code posten ist gut, um einen funktionierenden Algo zu verbessern. Daraus ergibt sich ein unsystematisches, punktuelles Lernen, insbesondere von "Tricks" und Kniffen - ist durchaus wertvoll - aktuell hier etwa, dass man einen Boolean nicht mit True/False vergleicht.
    Aber Grundlagen, wie Fachbegriffe, oder das VisualStudio effektiv zu nutzen, lernt man nicht an Code-Snippets. Im Gegenteil - wenn man gewöhnt ist, immer nur passende Snippets einzupasten, wird man nie dahin kommen, eine Vorgehensweise mal allgemeingültig zu formulieren, und so für sich an vielen Stellen verfügbar zu haben.
    Ebensowenig kommt man über Snippet-Diskussionen dahin, ein fehlendes Detail, oder die Syntax einer Methode selbst nachgucken zu können.
    @ErfinderDesRades wie bereits erwähnt

    Ruerte schrieb:

    kenne mich zwar in Sachen Datenbank nicht wirklich aus

    Meine Rangehens weise an solchen Problemen ist:
    1. Eine laufähige Möglichkeit so schnell wie möglich mit den geringsten aufwand finden.
    2. Wenn zeit ist mich damit auseinander setzen und die Passenden stellen verbessern

    aus dem Grund hieß es in meinen ersten Post auch nicht "hier die lösung ist gut" sondern

    Ruerte schrieb:

    kleines Beispiel:
    Außerdem muss man dazu bedenken das nicht jeder 100% Zeit hat sich perfekt in eine Programmiersprache einzuarbeiten sondern nur als "kleines" Hobby an die Sache rangeht :)

    Deshalb für dich auch mal ein lieb gemeintes

    ErfinderDesRades schrieb:

    fail

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Ruerte“ ()

    @Nils_Kr
    ErfinderDesRades hat vollkommen recht, du solltest erst einmal dein Datenmodell überarbeiten. So wirst du dir früher oder später selbst ein Bein stellen bzw. hast es schon getan.
    Mit nur einer DataTable könntest du dir vermutlich die Radiobuttons und die ganze IF -Abfrage sparen.


    SelectCase Beispiel für radiobutton
    Spoiler anzeigen

    Select Case CType(sender, RadioButton).Checked
    Case RadioButton1.Checked
    ...
    End Select

    Fakiz schrieb:


    SelectCase Beispiel für radiobutton
    Spoiler anzeigen

    Select Case CType(sender, RadioButton).Checked
    Case RadioButton1.Checked
    ...
    End Select


    Zusätzliche Informationen: Das Objekt des Typs "System.Windows.Forms.Button" kann nicht in Typ "System.Windows.Forms.RadioButton" umgewandelt werden. ??
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    umgewandelt werden
    War alles schon da.
    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!
    nochmal zum Fundament:

    Nils_Kr schrieb:

    Das Programm läuft jetzt schon seit über einem Jahr ohne einen einzigen Ausfall und die abgelegten Daten sind relativ statisch.
    Jo, dann muss man wohl auch abwägen.
    Weil der Umbau kann u.U. einen Komplett-Rewrite bedeuten, evtl. sogar ohne für den User ersichtlichen Gewinn.
    Andererseits, wenn du das Teil noch eine Weile supporten willst, ist auch ein ReWrite evtl. nicht zu teuer.

    Ich für mein teil möchte nicht etwas supporten, wo im Datenmodell es ein Dataset1.DataTable1 gibt - allein solche Benamungen würden beständig meinen BlutDruck hochtreiben. ;)
    Der Sub triggert nicht bei RadioButton.CheckedChanged sondern es wird nur abgefragt, welcher Button gerade aktiv ist.

    Soll es wirklich besser sein über die Tag-Property ein Case zu bestimmen anstatt einfach abzufragen welcher RadioButton aktiv ist? Normalerweise ist doch kürzer & einfacher = besser. Select Case ist in diesem Fall nicht kürzer und zumindest für mich sieht es auch nicht einfacher aus.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Naja wenn du das beste aus der Situation machen willst wäre hier noch einmal ein Ansatz.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. AddHandler RadioButton1.CheckedChanged, AddressOf RadioButton_CheckedChanged
    3. AddHandler RadioButton2.CheckedChanged, AddressOf RadioButton_CheckedChanged
    4. AddHandler RadioButton3.CheckedChanged, AddressOf RadioButton_CheckedChanged
    5. AddHandler RadioButton4.CheckedChanged, AddressOf RadioButton_CheckedChanged
    6. End Sub
    7. Private Sub RadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged, RadioButton4.CheckedChanged
    8. Dim row = DataSet01.DataTable1.NewDataTable1Row()
    9. row.Titel = TextBox1.Text
    10. row.Link = TmpLink
    11. Select Case CType(sender, RadioButton).Checked
    12. Case RadioButton1.Checked
    13. DataSet01.DataTable1.AddDataTable1Row(row)
    14. Case RadioButton2.Checked
    15. DataSet01.DataTable2.AddDataTable2Row(row)
    16. ...
    17. End Select
    18. End Sub

    @Fakiz

    denn

    Fakiz schrieb:

    Dim row = DataSet01.DataTable1.NewDataTable1Row()

    stimmt nicht überall

    Nils_Kr schrieb:

    Dim row = DataSet01.DataTable1.NewDataTable1Row()
    ...
    Dim row = DataSet01.DataTable2.NewDataTable2Row()
    ...
    Dim row = DataSet01.DataTable3.NewDataTable3Row()
    ...
    Dim row = DataSet01.DataTable4.NewDataTable4Row()
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    So, nach einigen Mühen und gefühlt tausend Fehlermeldungen sind jetzt 3 DataTables gestrichen und das letzte um eine Spalte erweitert.

    VB.NET-Quellcode

    1. Dim RadioBtn() As RadioButton = {RadioButton1, RadioButton2, RadioButton3, RadioButton4}
    2. For i = 1 To 4
    3. If RadioBtn(i - 1).Checked Then
    4. Dim row = DS_Produkte.DT_Eintraege.NewDT_EintraegeRow()
    5. row.Titel = TextBox1.Text
    6. row.Link = TmpLink
    7. row.L_Zugehoerigkeit = i
    8. DS_Produkte.DT_Eintraege.AddDT_EintraegeRow(row)
    9. End If
    10. Next


    Die Voraussetzung ist, dass die Daten sich in 4 Gruppen gliedern, die in 4 Listboxen stehen. Jetzt greifen die 4 Listboxen nicht mehr auf einzelne DataTables zurück,
    sondern alle auf das gleiche und zeigen jeweils nur den relevanten Teil an.

    PS: Nach gut 4 Stunden Arbeit konnte ich den Quellcode um 10 Zeilen kürzen. Pure Effizienz 8)
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nils_Kr“ ()