Mein Wunsch ist es, dass man alle DataGridView Spalten durchsuchen kann. Dabei kann man am Ende noch zwischen "Anfang, Teil, Ende und Genau" auswählen.

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Volker Bunge.

    Mein Wunsch ist es, dass man alle DataGridView Spalten durchsuchen kann. Dabei kann man am Ende noch zwischen "Anfang, Teil, Ende und Genau" auswählen.

    Ausgelagert aus Bindingsource Filter mit System.Int32

    Hallo zusammen,

    ich holle diesen Beitrag mal wieder hoch, da ich so ein ähnliches Problem habe.

    Mein Wunsch ist es, dass man alle DataGridView Spalten durchsuchen kann. Dabei kann man am Ende noch zwischen "Anfang, Teil, Ende und Genau" auswählen.

    Mein Programm arbeitet mit typisierten DataSet, Strict on und die alten VB6-Befehle sind deaktiviert.

    Habe mir mal folgenden Code zusammengebastellt.

    VB.NET-Quellcode

    1. Sub test()
    2. Dim Suchen_in_Feld As String
    3. Dim Suchen_Nach As String
    4. Dim Suchen_in_Tabelle As String
    5. Dim Suchen_SpaltenTyp As String
    6. ' Das Feld in dem gesucht werden soll sowie nach was gesucht werden soll, in Variablen kurz festhalten, damit man später nicht so viel schreiben muss
    7. Suchen_in_Feld = CBox_Suchfeld.SelectedItem.ToString
    8. Suchen_Nach = TBox_SucheNach.Text
    9. Suchen_in_Tabelle = Btn_Suche_In.Text
    10. ' Wenn ein Suchwert eingetragen wurde, diesen für eine Suche nutzen
    11. Dim Suchstring As String
    12. Suchstring = ""
    13. ' Alle Spaltennamen durchlaufen
    14. For dgv = 0 To DGridView_TB_Artikel.Columns.Count - 1
    15. If DGridView_TB_Artikel.Columns.Item(dgv).Visible = True Then
    16. ' von der aktuellen Spalte den Datentyp ermitteln
    17. Suchen_SpaltenTyp = ReplaceNew(DGridView_TB_Artikel.Columns(dgv).ValueType.ToString, "System.", "")
    18. ' MessageBox.Show(DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_SpaltenTyp)
    19. Select Case CBox_Zahlenvergleich.Text
    20. Case "Teil"
    21. Select Case Suchen_SpaltenTyp
    22. Case "Boolean"
    23. If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Boolean" Then
    24. Suchstring = Suchstring & "" & DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_Nach & " or "
    25. End If
    26. Case "Int32"
    27. If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Zahl" Then
    28. 'Suchstring = Suchstring & DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_Nach & " or "
    29. Suchstring = Suchstring & String.Format("CONVERT([{0}]),System.String) Like '*{1}*'", DGridView_TB_Artikel.Columns(dgv).HeaderText, Suchen_Nach) & " or "
    30. End If
    31. Case "Stringj" ' nur wegen Deaktivierung falsch geschrieben
    32. If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Zahl" Or Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "String" Then
    33. Suchstring = Suchstring & "[" & DGridView_TB_Artikel.Columns(dgv).HeaderText & "] LIKE '*" & Suchen_Nach & "*' or "
    34. End If
    35. End Select
    36. End Select
    37. End If
    38. Next
    39. Try
    40. If Suchstring <> "" Then
    41. Suchstring = "EingabemaskeID = " & My.Settings.SysSetting_Eingabemaske_Letzte_Aktive & " and (" & Suchstring
    42. Suchstring = MidNew_Str(Suchstring, 1, LenNew(Suchstring) - 4) & ")"
    43. MessageBox.Show(Suchstring)
    44. ' Das letzte 'Or' entfernen
    45. ArtikelBindingSource.Filter = Suchstring
    46. Else
    47. MsgBox("Es konnte kein Suchfilter eingestellt werden")
    48. Exit Sub
    49. End If
    50. Catch ex As Exception
    51. MessageBox.Show(ex.Message)
    52. End Try
    53. End Sub
    54. ' Hilfsfunktionen, nicht schön, aber funktionieren
    55. Public Function Was_ist_Eingabe_für_ein_Datentyp(ByVal Wert As String) As String
    56. ' Boolean
    57. Dim BooleanWerte As String
    58. BooleanWerte = UcaseNew_Str("Ja|Nein|Wahr|Falsch|0|-1|Yes|No|True|False")
    59. If InStrNew(BooleanWerte, UcaseNew_Str(Wert)) > 0 Then
    60. Return "Boolean"
    61. End If
    62. ' Zahl
    63. If Nur_Zahlen_zulassen(Wert, True) = Wert Then
    64. Return "Zahl"
    65. End If
    66. ' String
    67. If Nur_Zahlen_zulassen(Wert, True) <> Wert Then
    68. Return "String"
    69. End If
    70. End Function
    71. Function Nur_Zahlen_zulassen(Eingabe As String, Sonderzeichen As Boolean) As String
    72. Dim Zähler1 As Integer
    73. Dim ASCII As Integer
    74. For Zähler1 = 0 To LenNew(Eingabe) - 1
    75. ASCII = ASCNew(Eingabe.Chars(Zähler1).ToString)
    76. ' Wenn das aktuelle Zeichen keine Zahl ist, dieses löschen
    77. If ASCII <= 46 Or ASCII >= 58 Then
    78. ' Zeichen ,;.: zulassen
    79. If Sonderzeichen = True And ASCII = 44 Or ASCII = 59 Or ASCII = 46 Or ASCII = 58 Then
    80. ' Eingabe = ReplaceNew(Eingabe, Zeichen1(Zähler1), "")
    81. Else
    82. Eingabe = ReplaceNew(Eingabe, Eingabe.Chars(Zähler1).ToString, "/")
    83. End If
    84. End If
    85. Next Zähler1
    86. Eingabe = ReplaceNew(Eingabe, "/", "")
    87. If Eingabe = "" Then
    88. Nur_Zahlen_zulassen = "0"
    89. Else
    90. On Error GoTo Nur_Zahlen_zulassen_Error
    91. Nur_Zahlen_zulassen = Eingabe
    92. End If
    93. Exit Function
    94. Nur_Zahlen_zulassen_Error:
    95. Nur_Zahlen_zulassen = Nur_Zahlen_zulassen(Eingabe, False)
    96. End Function


    Die Suche nach Boolean funktioniert wie gewünscht.

    Der Suchstring sieht bei Boolean so aus:

    EingabemaskeID = 1 and (Verkauft = 1 or BarcodeOriginal = 1 or Barcodeaufkleberausdrucken = 1 or BestehtausmehrerenTeilen = 1 or AufkleberNeuDrucken = 1 or WunschlisteAnzeigen = 1 or AufkleberTrainsafe = 1)

    Was leider dann nicht mehr funktioniert ist die Suche nach Zahlen und Texten.

    Der Suchstring sieht bei Zahlen so aus:

    EingabemaskeID = 1 and (CONVERT([ID]),System.String) Like '*12342*' or CONVERT([WunschlistenNr]),System.String) Like '*12342*')

    Die Felermeldung lt. dann einfach nur

    Syntaxfehler im Ausdruck.

    Wenn man die String-Case Zeile mit aktiviert (also aus Stringj String macht) dann sieht Suchstring so aus

    EingabemaskeID = 1 and (CONVERT([ID]),System.String) Like '*12343*' or [ArtikelNr] LIKE '*12343*' or [AlteArtikelnr] LIKE '*12343*' or [UnterArtikelNrVonHauptnr] LIKE '*12343*' or [ArtikelBezeichnung] LIKE '*12343*' or [AufkleberLfdNr] LIKE '*12343*' or [AufkleberDigNr] LIKE '*12343*' or CONVERT([WunschlistenNr]),System.String) Like '*12343*')

    Die beiden Hilfsroutinen funktionieren soweit, aber wer hier Verbesserungsvorschläge hat, gerne her damit.

    Wie mein Vorredner schon sagte, sollen auch bei mir Zahlenwerte mit Like gefiltert werden.

    Kurze Fragen: Wo liegt der Fehler und wie lt. die Lösung?

    Noch eine Frage: Kann man auch die Treffer anzeigen lassen, so dass man sofort sieht, wo ein Treffer erzielt wurde? So wie wenn man bei einer Internetseite oder im VB-Net Editor sucht und die Treffer angezeigt werden.

    Vielen Dank

    Volker

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