String aus mehreren Gegebenheiten erzeugen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    String aus mehreren Gegebenheiten erzeugen

    Hallo zusammen!

    Ich stehe vor folgendem Problem:

    Auf einer Form habe ich Filtermöglichkeiten eingebaut (siehe Bild). Die Textboxen und Datepicker werden erst nach Anhaken der CheckBox aktiv.
    Jenachdem, was dort angewählt wird soll eine Bindingsource gefiltert werden. -> es muss dazu ein String (z.B. FilterString = STRING) erzeugt werden:


    D.h. die Auswahl kann nichts, alles oder diverse sein. Je nach Auswahl soll dann der String zusammengesetzt werden für BindingSource.Filter
    BindingSource.Filter = FilterString
    Lässt sich das sinnvoll zusammenfassen, ohne für jede denkbare Variante eine If-Klausel zu basteln? (Dann wird das ein sehr sehr langer Code)

    Zur Steuerung hab ich gedacht, dass man abfangen könnte, welche Checkbox(en) aktiviert ist(sind) - sind keine aktiviert dann
    wäre der String schonmal FilterString = ""

    Also für eine einzige Auswahl (im Beispiel Mitarbeiter) wäre das wie folgt:

    VB.NET-Quellcode

    1. Private Sub btn_Click(sender As Object, e As EventArgs) Handles btnAusgabe.Click
    2. Select Case True
    3. Case sender Is btnAusgabe
    4. Dim FilterString As String = Nothing
    5. If CbMitarbeiter.Checked = True Then
    6. FilterString = $"Mitarbeiter = {TbMitarbeiter.Text}"
    7. Else
    8. FilterString = ""
    9. End If
    10. BindingSource.Filter = FilterString
    11. End Select
    12. End Sub


    Für 2 angehakte CheckBoxen:

    VB.NET-Quellcode

    1. Private Sub btn_Click(sender As Object, e As EventArgs) Handles btnAusgabe.Click
    2. Select Case True
    3. Case sender Is btnAusgabe
    4. Dim FilterString As String = Nothing
    5. If CbMitarbeiter.Checked = True Then
    6. If CbStandort.Checked = True Then
    7. FilterString = $"Mitarbeiter = {TbMitarbeiter.Text} AND Standort = {TbStandort.Text}"
    8. Else
    9. FilterString = $"Mitarbeiter = {TbMitarbeiter.Text}"
    10. End If
    11. Else
    12. FilterString = ""
    13. End If
    14. BindingSource.Filter = FilterString
    15. End Select
    16. End Sub


    usw.

    Ich bin noch recht neu in der Programmierung und mit meiner Lektüre noch nicht soweit, dass ich das schon könnte. Allerdings glaube ich,
    dass man so ein Konstrukt (wenn überhaupt möglich) auch nicht mit Basiswissen beherrscht ^^

    Wenn noch Angaben fehlen, dann lasst es mich bitte wissen.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Probierma folgendes:
    Gib allen Controls denselben Eventhandler.
    In diesem Eventhandler gehst Du alle Möglichkeiten durch und baust Deinen String zusammen.
    Feddich.
    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!
    @tragl Mal als Ansatz, Pseudo-Code:
    Spoiler anzeigen

    Quellcode

    1. Sub Handler(...) Handles CheckBox1.CheckChange, Button1.Click
    2. Dim MyString = "bla"
    3. If CheckBox1.Checked Then
    4. MyString = MyString + "Checked"
    5. Else
    6. MyString = MyString + "Not Checked"
    7. End If
    8. ' ...
    9. MessageBox(MyString)
    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!
    Vielen Dank, wusste garnicht, dass man Strings "einfach" addieren kann. 8o
    Hab das so gelöst:

    VB.NET-Quellcode

    1. Private Sub btn_Click(sender As Object, e As EventArgs) Handles btnAusgabe.Click
    2. Select Case True
    3. Case sender Is btnAusgabe
    4. Dim strFilter As String = Nothing
    5. If CbDatum.Checked = True Then
    6. strFilter = $"Datum >= {dtpVon.Value.ToShortDateString} AND <= {dtpBis.Value.ToShortDateString}"
    7. End If
    8. If CbMitarbeiter.Checked = True Then
    9. If strFilter = Nothing Then
    10. strFilter = $"Mitarbeiter = {TbMitarbeiter.Text}"
    11. Else
    12. strFilter = strFilter + $" AND Mitarbeiter = {TbMitarbeiter.Text}"
    13. End If
    14. End If
    15. If CbFahrzeug.Checked = True Then
    16. If strFilter = Nothing Then
    17. strFilter = $"Fahrzeug = {TbFahrzeug.Text}"
    18. Else
    19. strFilter = strFilter + $" AND Fahrzeug = {TbFahrzeug.Text}"
    20. End If
    21. End If
    22. If CbStandort.Checked = True Then
    23. If strFilter = Nothing Then
    24. strFilter = $"Standort = {TbStandort.Text}"
    25. Else
    26. strFilter = strFilter + $" AND Standort = {TbStandort.Text}"
    27. End If
    28. End If
    29. msgInformation(strFilter)
    30. End Select
    31. End Sub


    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    man muss halt datenbänkerisch denken (die Welt ist ein Nagel!).
    Schaffe dir Datensätze, die eine Checkbox, ein Control, ein Filtersegment zusammenfassen.
    Dann kannste die DAtensätze durchlaufen und je nachdem das Filtersegment mit in den GesamtFilter mit aufnehmen.

    So in der Art.

    die Datensätze sollen auch keine DataRows sein - eine kleine Klasse mit 3 Feldern reicht dafür.

    Das Konzept geht aber nur für Und-Verknüpfungen.
    Oder aber nur für Oder-Verknüpfungen.

    Kombinationen aus Und und Oder werden deutlich komplizierter.

    Ups - zu spät.

    Addieren sollte man Strings auch nicht. In VB.Net ist der &-Operator für String-Verkettungen vorgesehen.

    ErfinderDesRades schrieb:

    man muss halt datenbänkerisch denken (die Welt ist ein Nagel!).
    Schaffe dir Datensätze, die eine Checkbox, ein Control, ein Filtersegment zusammenfassen.
    Dann kannste die DAtensätze durchlaufen und je nachdem das Filtersegment mit in den GesamtFilter mit aufnehmen.


    kannst du das genauer erklären? Ich hänge hier teilweise mit etlichen Zeilen Code, um jede mögliche Variante an Filtern abzugreifen.
    Teilweise möchte ich 4 Filter setzen können, das gibt ja 30 Zeilen Code oder so, um alles abzufangen. Eine "kurze" Methode wäre mir ganz recht :)

    mit 4 Filterkriterien sieht das bei mir aktuell so aus (grausam!):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. #Region "Filter"
    2. Private Sub btnAusgabe_Click(sender As Object, e As EventArgs) Handles btnAusgabe.Click
    3. Dim Filter = ""
    4. 'TODO Filter dürfen hier nicht deklariert werden, ergeben teilweise Nothing weil kein Eintrag da ist
    5. 'Dim filterGesellschaft = $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}'"
    6. 'Dim filterStandort = $"Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}'"
    7. 'Dim filterAbteilung = $"Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    8. 'Dim filterMitarbeiter = $"MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    9. Select Case True
    10. Case cbGesellschaft.Checked And cbStandort.Checked And cbAbteilung.Checked And cbMitarbeiter.Checked : Filter =
    11. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    12. AND Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    13. AND Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}' _
    14. AND MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    15. Case cbGesellschaft.Checked And cbStandort.Checked And cbAbteilung.Checked : Filter =
    16. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    17. And Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    18. And Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    19. Case cbGesellschaft.Checked And cbStandort.Checked And cbMitarbeiter.Checked : Filter =
    20. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    21. AND Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    22. AND MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    23. Case cbStandort.Checked And cbAbteilung.Checked And cbMitarbeiter.Checked : Filter =
    24. $"Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    25. AND Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}' _
    26. AND MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    27. Case cbGesellschaft.Checked And cbStandort.Checked : Filter =
    28. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    29. And Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}'"
    30. Case cbGesellschaft.Checked And cbAbteilung.Checked : Filter =
    31. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    32. AND Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    33. Case cbGesellschaft.Checked And cbMitarbeiter.Checked : Filter =
    34. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}' _
    35. AND MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    36. Case cbStandort.Checked And cbAbteilung.Checked : Filter =
    37. $"Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    38. AND Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    39. Case cbStandort.Checked And cbMitarbeiter.Checked : Filter =
    40. $"Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}' _
    41. AND MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    42. Case cbMitarbeiter.Checked And cbAbteilung.Checked : Filter =
    43. $"MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID} _
    44. AND Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    45. Case cbGesellschaft.Checked : Filter =
    46. $"Parent(FK_Mitarbeiter_Plan).expGesellschaft = '{bsCmbGesellschaft.At(Of GesellschaftRow).Name}'"
    47. Case cbStandort.Checked : Filter =
    48. $"Parent(FK_Mitarbeiter_Plan).Standort = '{bsCmbStandort.At(Of StandortRow).Name}'"
    49. Case cbAbteilung.Checked : Filter =
    50. $"Parent(FK_Mitarbeiter_Plan).Abteilung = '{bsCmbAbteilung.At(Of AbteilungRow).Name}'"
    51. Case cbMitarbeiter.Checked : Filter =
    52. $"MitarbeiterID = {bsCmbMitarbeiter.At(Of MitarbeiterRow).ID}"
    53. End Select
    54. bsPlan.Filter = Filter
    55. End Sub
    56. Private Sub cb_CheckedChanged(sender As Object, e As EventArgs) Handles cbMitarbeiter.CheckedChanged, cbStandort.CheckedChanged, cbAbteilung.CheckedChanged, cbGesellschaft.CheckedChanged,
    57. cbGesellschaft.CheckedChanged
    58. Select Case True
    59. Case sender Is cbGesellschaft
    60. If cbGesellschaft.CheckState = CheckState.Checked Then
    61. 'bsCmbStandort.DataSource = FKGesellschaftStandortBindingSource
    62. cmbGesellschaft.Enabled = True
    63. Else
    64. 'TODO Standortbindingsource wiederherstellen
    65. cmbGesellschaft.Enabled = False
    66. End If
    67. Case sender Is cbStandort
    68. If cbStandort.CheckState = CheckState.Checked Then
    69. 'bsCmbMitarbeiter.DataSource = FKStandortMitarbeiterBindingSource
    70. cmbStandort.Enabled = True
    71. Else
    72. 'bsCmbMitarbeiter.DataSource = bsCbcMitarbeiter
    73. cmbStandort.Enabled = False
    74. End If
    75. Case sender Is cbAbteilung
    76. If cbAbteilung.CheckState = CheckState.Checked Then
    77. 'bsCmbMitarbeiter.DataSource = FKStandortMitarbeiterBindingSource
    78. cmbAbteilung.Enabled = True
    79. Else
    80. 'bsCmbMitarbeiter.DataSource = bsCbcMitarbeiter
    81. cmbAbteilung.Enabled = False
    82. End If
    83. Case sender Is cbMitarbeiter
    84. cmbMitarbeiter.Enabled = cbMitarbeiter.CheckState = CheckState.Checked
    85. End Select
    86. End Sub
    87. Private Sub dgvPlan_SelectionChanged(sender As Object, e As EventArgs) Handles dgvPlan.SelectionChanged
    88. tssMarkiert.Text = $"markierte Einträge: {dgvPlan.SelectedRows.Count}"
    89. tssGesamt.Text = $"Einträge: {dgvPlan.Rows.Count}"
    90. End Sub
    91. #End Region


    Edit: und on Top müsste man noch die DataSources der Comboboxen "umstöpseln", damit die auch nur die Werte der gefilterten BS anzeigen - ich weiß allerdings nicht, wie man die wieder
    auf die urspr. Source umstöpseln kann
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Ich hab dazu ein nettes "Addon" gefunden, da müsste ich nur mal schauen,
    ob ich das auch für die ComboBoxColumns umgehäkelt bekomme
    MSDN
    ansonsten eine super Sache! Funktioniert auch bei den Spalten ohne ComboBox wie gewollt

    ABER: mich würde die Methode mit den DatenSätzen als Klasse dennoch interessieren, wie das genau gemeint war.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: