If Statement über XML Datei für CheckBox

  • VB.NET

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

    If Statement über XML Datei für CheckBox

    Hallo,

    ich habe eine Frage, wenn ich Daten aus einer XML Datei lade, dann über die Auswahl von einer ComboBox die Elemente einlade bekomme ich in 1 bis 6 Textenboxen 1 und 0 (unterschiedlich).
    Null will ich diese 1 und 0 nicht extra in einer Textbox anzeigen lassen sondern direkt über ein If Statement überprüfen ob es 1 oder 0 ist und damit bestimmen, ob die dazu gehörige Checkbox (1 bis 6)
    enabled (1) oder nicht (0) ist. Ist sowas möglich?
    Bis jetzt habe ich das so gelöst...wie schaffe ich es ohne die TextBox Abfrage direkt über die XML Daten.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If mtb_z1.Text = "0" Then
    2. mckb_z1a.Enabled = False
    3. mckb_z1b.Enabled = False
    4. Else
    5. mckb_z1a.Enabled = True
    6. mckb_z1b.Enabled = True
    7. End If
    8. If mtb_z2.Text = "0" Then
    9. mckb_z2a.Enabled = False
    10. mckb_z2b.Enabled = False
    11. Else
    12. mckb_z2a.Enabled = True
    13. mckb_z2b.Enabled = True
    14. End If
    15. If mtb_z3.Text = "0" Then
    16. mckb_z3a.Enabled = False
    17. mckb_z3b.Enabled = False
    18. Else
    19. mckb_z3a.Enabled = True
    20. mckb_z3b.Enabled = True
    21. End If
    22. If mtb_z4.Text = "0" Then
    23. mckb_z4a.Enabled = False
    24. mckb_z4b.Enabled = False
    25. Else
    26. mckb_z4a.Enabled = True
    27. mckb_z4b.Enabled = True
    28. End If
    29. If mtb_z5.Text = "0" Then
    30. mckb_z5a.Enabled = False
    31. mckb_z5b.Enabled = False
    32. Else
    33. mckb_z5a.Enabled = True
    34. mckb_z5b.Enabled = True
    35. End If
    36. If mtb_z8.Text = "0" Then
    37. mckb_z8a.Enabled = False
    38. mckb_z8b.Enabled = False
    39. Else
    40. mckb_z8a.Enabled = True
    41. mckb_z8b.Enabled = True
    42. End If


    Also eine möglichkeit zum verkürzen wäre schon mal
    ABC.Enabled = (mtb.text = "0") <- Die Klammer ergibt True/False und kann somit das Enabled schalten.
    Da du aber schon 0 und 1 (true/false) hast wäre es sicher besser direkt damit zu arbeiten.

    Leider habe ich nicht ganz verstanden was dein Programm macht und wie die Quelle aussieht.
    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."
    @Schamash
    Die Quelle ist eine XML Datei und über eine ComboBox wähle ich ein Item aus. Über das Binding werden die Daten in den TextBoxen übertragen. Soweit so gut. Nun habe ich in 6 Textboxen 1 und 0 stehen, weil ich damit die Checkboxen steuern möchte.

    Diese Textboxen wollte ich mir sparen, in dem sofort erkannt wird ob 1 oder 0, wenn ich ein Item in der ComboBox auswähle und die Checkbox darauf reagiert. Also sollte dann der Code sich auf das Ergebnis im Binding beziehen, denke ich mal? Oder? :)
    Ist das etwas verständlicher?
    @Sam85
    die xml lädst du doch bestimmt in eine Datatable.
    Text |
    Text1 | 0
    Text2 | 1
    Text3 | 1
    Text4 | 0

    Dann könntest du bei der Auswahl einfach per SELECT die Auswahl deiner ComboBox ermitteln und die 0 und 1 lassen sich auf Boolean convertieren.

    edit: (hatte den Part mit Binding übersehen)
    Wenn du mit Binding arbeites empfiehlt es sich direkt das zu nehmen.
    Dann sparst du dir die Abfrage.
    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."
    @SpaceyX So ist der Aufbau, sind auch nicht sehr viele Daten. Das läuft soweit auch gut, unten befinden sich die 1 und 0.

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <EinlagenDS xmlns="xxx">
    3. <EinlagenDT>
    4. <ID>0</ID>
    5. <Bezeichnung>Test</Bezeichnung>
    6. <Gruppe>Test</Gruppe>
    7. <Artikel>4</Artikel>
    8. <Privatpreis>99.99</Privatpreis>
    9. <Kassenpreis>99.99</Kassenpreis>
    10. <Aufzahlung>99.99</Aufzahlung>
    11. <z1>1</z1>
    12. <z2>1</z2>
    13. <z3>0</z3>
    14. <z4>0</z4>
    15. <z5>0</z5>
    16. <z8>1</z8>


    @Schamash Ja genau habe es auch separt in einen DataGridView eingefügt. Das mit dem Select hieße dann im Code wie? (Bin leider noch zu neu und habe noch keine SQL Befehlserfahrung...SELECT z1 FROM ComboBox) :)?
    Das DataGridView dient ja nur der Anzeige nicht der Datenhaltung.


    VB.NET-Quellcode

    1. Dim DT as new Datatable
    2. DT.ReadXML(Pfad)
    3. Dim DR as Datarow() = DT.Select("ID = 0")
    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."
    @Sam85 Vielleicht lässt sich noch das Schreiben der XML optimieren, Dein Snippet ist leider nicht DataTable- oder SerializableClass-kompatibel.
    Mit welchem Code schreibst Du Deine XML?
    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!
    @RodFromGermany

    Das ist der Code für den DataGridView.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.DataSet
    2. Public Class frmEinlagenTable
    3. Private Datei As String = "\\rs-win1\ablage\ISO\Preislisten intern\Schuheinlagen\XML\Einlagen.xml"
    4. Private Sub frmEinlagenTable_Load(sender As Object, e As EventArgs) Handles Me.Load
    5. Me.EinlagenDS.ReadXml(Datei)
    6. End Sub
    7. Private Sub mbt_close_Click(sender As Object, e As EventArgs) Handles mbt_close.Click
    8. Me.Close()
    9. End Sub
    10. Private Sub mbt_save_Click(sender As Object, e As EventArgs) Handles mbt_save.Click
    11. Me.EinlagenDTBindingSource.EndEdit()
    12. Me.EinlagenDS.WriteXml(Datei)
    13. MsgBox("Datei gespeichert.")
    14. End Sub
    15. Private Sub mbt_add_Click(sender As Object, e As EventArgs) Handles mbt_add.Click
    16. Me.EinlagenDTBindingSource.AddNew()
    17. End Sub
    18. Private Sub mtb_up_Click(sender As Object, e As EventArgs) Handles mtb_up.Click
    19. Me.EinlagenDTBindingSource.MovePrevious()
    20. End Sub
    21. Private Sub mtb_down_Click(sender As Object, e As EventArgs) Handles mtb_down.Click
    22. Me.EinlagenDTBindingSource.MoveNext()
    23. End Sub
    24. Private Sub mtb_delete_Click(sender As Object, e As EventArgs) Handles mtb_delete.Click
    25. Me.EinlagenDTBindingSource.RemoveCurrent()
    26. End Sub
    27. End Class



    Und das der Code für die Form in der anhand der 6 Felder die 6 Checkboxen angesteuert werden sollen (nur halt ohne den gebrauch der 6 Felder, sondern irgendwie direkt über das Binding.)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.DataSet
    2. Public Class frmEinlagen
    3. Private Datei As String = "\\rs-win1\ablage\ISO\Preislisten intern\Schuheinlagen\XML\Einlagen.xml"
    4. Private Sub frmEinlagen_Load(sender As Object, e As EventArgs) Handles Me.Load
    5. 'Lesen XML Datei
    6. EinlagenDS.ReadXml(Datei)
    7. 'Anzeigen MetroComboBox als leer
    8. mcb_bezeichnung.SelectedItem = Nothing
    9. 'Anzeigen MetroTextBoxen als leer
    10. For Each mtb As MetroFramework.Controls.MetroTextBox In mpc_einlagen.Controls.OfType(Of MetroFramework.Controls.MetroTextBox)()
    11. mtb.Clear()
    12. Next
    13. End Sub
    14. Private Sub mcb_bezeichnung_SelectedIndexChanged(sender As Object, e As EventArgs) Handles mcb_bezeichnung.SelectedIndexChanged
    15. If mtb_z1.Text = "0" Then
    16. mckb_z1a.Enabled = False
    17. mckb_z1b.Enabled = False
    18. Else
    19. mckb_z1a.Enabled = True
    20. mckb_z1b.Enabled = True
    21. End If
    22. If mtb_z2.Text = "0" Then
    23. mckb_z2a.Enabled = False
    24. mckb_z2b.Enabled = False
    25. Else
    26. mckb_z2a.Enabled = True
    27. mckb_z2b.Enabled = True
    28. End If
    29. If mtb_z3.Text = "0" Then
    30. mckb_z3a.Enabled = False
    31. mckb_z3b.Enabled = False
    32. Else
    33. mckb_z3a.Enabled = True
    34. mckb_z3b.Enabled = True
    35. End If
    36. If mtb_z4.Text = "0" Then
    37. mckb_z4a.Enabled = False
    38. mckb_z4b.Enabled = False
    39. Else
    40. mckb_z4a.Enabled = True
    41. mckb_z4b.Enabled = True
    42. End If
    43. If mtb_z5.Text = "0" Then
    44. mckb_z5a.Enabled = False
    45. mckb_z5b.Enabled = False
    46. Else
    47. mckb_z5a.Enabled = True
    48. mckb_z5b.Enabled = True
    49. End If
    50. If mtb_z8.Text = "0" Then
    51. mckb_z8a.Enabled = False
    52. mckb_z8b.Enabled = False
    53. Else
    54. mckb_z8a.Enabled = True
    55. mckb_z8b.Enabled = True
    56. End If
    57. End Sub
    58. Private Sub mtb_reset_Click(sender As Object, e As EventArgs) Handles mtb_reset.Click
    59. 'Reset MetroCheckBox in mpc_kalkulation
    60. With mckb_befreit
    61. If .Checked = True Then .Checked = False
    62. End With
    63. 'Rest MetroTextBox in mpc_kalkulation
    64. For Each mtb As MetroFramework.Controls.MetroTextBox In mpc_kalkulation.Controls.OfType(Of MetroFramework.Controls.MetroTextBox)()
    65. mtb.Clear()
    66. Next
    67. 'Reset MetroCheckbox in mpc_zusätze
    68. Dim pan() = {mps_a, mps_b}
    69. For Each panel As MetroSuite.MetroPanelSelection In pan
    70. For Each mckb As MetroSuite.MetroCheckBox In panel.Controls.OfType(Of MetroSuite.MetroCheckBox)()
    71. With mckb
    72. .Enabled = True
    73. .Checked = False
    74. End With
    75. Next
    76. Next
    77. 'Reset MetroTextBox in mpc_einlagen
    78. For Each mtb As MetroFramework.Controls.MetroTextBox In mpc_einlagen.Controls.OfType(Of MetroFramework.Controls.MetroTextBox)()
    79. mtb.Clear()
    80. Next
    81. 'Reset MetroComboBox in mpc_einlagen
    82. mcb_bezeichnung.SelectedItem = Nothing
    83. End Sub
    84. End Class



    @SpaceyX Die Datei habe ich selber erzeugt, also es gab in dem Sinne nur die Vorgaben, die ich dafür als relevant gesehen habe.

    @Schamash Der Bezug auf die ID=0, kann ich den dann in die IF Abfrage einbauen?


    Nun habe ich festgestellt, dass das erste Element aus der XML nicht korrekt angezeigt wird (also es fehlen Daten die eingetragen sind). Aber lediglich bei dem ersten Eintrag und auch nicht alle. Habe ich beim Code vielleicht etwas unsauber veranstaltet, dass es zu diesem Fehler kommen kann? (PS: Nun habe ich mal weiter getestet und es wird auch erst angezeigt (nicht vollständiger Datensatz), wenn ich das zweite Element vorher einmal ausgewählt habe.)

    Habe auch mal ein paar Bilder eingefügt, damit so ein bisschen klar wird wie es aussieht und was mich stutzen lässt.

    Freue mich über Feedback.
    Bilder
    • DataTable.PNG

      6,36 kB, 202×310, 88 mal angesehen
    • DGV mit Daten.png

      46,98 kB, 951×498, 77 mal angesehen
    • Hauptform mit ersten Eintrag.png

      31,14 kB, 1.065×406, 100 mal angesehen
    • Hauptform mit zweiten Eintrag.png

      34,67 kB, 1.076×422, 101 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    hi,

    ich hab Dir ein kleines Video zur "Erklärung" erstellt:



    Du bindest Dein DataSet an eine BindingSource und die entsprechenden Properites Deiner Controls an die entsprechende Spalte der im DataSet enthaltenen DataTable via BindingSource. Geht alles im Designer.

    Wie Du im Video sehen kannst, wird die BindingSource automatisch von VS erzeugt, sobald Du die ComboBox an die DataTable bindest. So hast Du eine 2-Wege-Bindung. Sprich nicht mit den Controls, sondern immer mit der DataTable oder Binding-Source.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich hab da nochmal eine allgemeine Frage, wenn ich den ersten Eintrag in einer ComboBox leer lassen möchte (wenn ich aus einen DataTable lese), wie gehe ich da am besten vor?
    Ist es besser die erste Zeile bzw. die -1 leer zu lassen, oder im Code zu implementieren, dass die ComboBox mit "nothing" beginnen soll (bei letzten habe ich bisher immer das Problem gehabt, dass der erste Eintrag nicht mehr richtig übernommen wird).

    Freue mich über ein Feedback.
    @Sam85 Sieh Dir mal die Property .DropDownStyle im Designer an, und dann in Kombination mit SelectedIndex = -1.
    -1 macht, dass nix angezeigt wird,
    .DropDownStyle macht, dass editiert werden kann oder nicht.
    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!
    @RodFromGermany Vielen Dank. Noch eine Frage, nun habe ich zwar die ComobBox leer. Zusätzlich werden ja auch in TextBoxen Werte übertragen durch das Binding, zusammen mit dem ersten Item aus der ComboBox, wie bekomme ich diese ebenfalls leer?

    Vorher hatte ich diesen Code im Form Load drin, der hat aber nach etwas probieren vermutlich mein Problem überhaupt ausgelöst (Daten aus dem ersten Eintrag waren nicht vollständig).

    VB.NET-Quellcode

    1. 'Anzeigen MetroTextBoxen als leer
    2. For Each mtb As MetroFramework.Controls.MetroTextBox In mpc_einlagen.Controls.OfType(Of MetroFramework.Controls.MetroTextBox)()
    3. mtb.Clear()
    4. Next


    Eher sowas?

    VB.NET-Quellcode

    1. mtb_au.DataBindings.Clear()

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

    Sam85 schrieb:

    wie bekomme ich diese ebenfalls leer?
    Du musst die DataSource des Empfängers auf Nothing setzen.
    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!
    @RodFromGermany Wo finde ich die DataSource? Bzw. wie setze ich sie auf Nothing. In der ComboBox geht das ja mit SelectedItem = Nothing. Ist das ähnlich mit der TextBox?
    Mhh, scheint so, als hättest Du das Konzept der Daten-Bindung nicht so richtig umgesetzt, bzw. noch nicht verinnerlicht. Einfachste Lösung ist, Du fügst in Deine DataTable einen "Dummy-Eintrag" hinzu, welcher einfach leer ist. Bei einer eventuellen Auswertung der Daten in Deiner Table musst Du diesen Eintrag einfach ignorieren.

    Evtl. solltest Du darüber auch nachdenken, warum Du überhaupt einen leeren Eintrag willst und ob das überhaupt nötig ist.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX Der soll am Anfang einfach verhindern, dass jemand irritiert wird durch einen bereits vorhanden Eintrag. Notwendig ist er im eigentlichen Sinne vermutlich nicht.
    Sonst könnte ich doch bestimmt beim XML einlesen auch statt dem Load Event einfach das ComboBox SelectedItem Event ansprechen oder?
    Und ja du hast recht :) so 100% verinnerlicht habe ich das ganze noch nicht, ich arbeite noch daran.
    es ist meiner meinung nach vollkommen ok, wenn der erste eintrag bereits ausgewählt ist und das sollte wirklich niemanden irritieren. ich denke, Du solltest das so lassen und weiter machen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o