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.
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
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
- Sub test()
- Dim Suchen_in_Feld As String
- Dim Suchen_Nach As String
- Dim Suchen_in_Tabelle As String
- Dim Suchen_SpaltenTyp As String
- ' 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
- Suchen_in_Feld = CBox_Suchfeld.SelectedItem.ToString
- Suchen_Nach = TBox_SucheNach.Text
- Suchen_in_Tabelle = Btn_Suche_In.Text
- ' Wenn ein Suchwert eingetragen wurde, diesen für eine Suche nutzen
- Dim Suchstring As String
- Suchstring = ""
- ' Alle Spaltennamen durchlaufen
- For dgv = 0 To DGridView_TB_Artikel.Columns.Count - 1
- If DGridView_TB_Artikel.Columns.Item(dgv).Visible = True Then
- ' von der aktuellen Spalte den Datentyp ermitteln
- Suchen_SpaltenTyp = ReplaceNew(DGridView_TB_Artikel.Columns(dgv).ValueType.ToString, "System.", "")
- ' MessageBox.Show(DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_SpaltenTyp)
- Select Case CBox_Zahlenvergleich.Text
- Case "Teil"
- Select Case Suchen_SpaltenTyp
- Case "Boolean"
- If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Boolean" Then
- Suchstring = Suchstring & "" & DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_Nach & " or "
- End If
- Case "Int32"
- If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Zahl" Then
- 'Suchstring = Suchstring & DGridView_TB_Artikel.Columns(dgv).HeaderText & " = " & Suchen_Nach & " or "
- Suchstring = Suchstring & String.Format("CONVERT([{0}]),System.String) Like '*{1}*'", DGridView_TB_Artikel.Columns(dgv).HeaderText, Suchen_Nach) & " or "
- End If
- Case "Stringj" ' nur wegen Deaktivierung falsch geschrieben
- If Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "Zahl" Or Was_ist_Eingabe_für_ein_Datentyp(Suchen_Nach) = "String" Then
- Suchstring = Suchstring & "[" & DGridView_TB_Artikel.Columns(dgv).HeaderText & "] LIKE '*" & Suchen_Nach & "*' or "
- End If
- End Select
- End Select
- End If
- Next
- Try
- If Suchstring <> "" Then
- Suchstring = "EingabemaskeID = " & My.Settings.SysSetting_Eingabemaske_Letzte_Aktive & " and (" & Suchstring
- Suchstring = MidNew_Str(Suchstring, 1, LenNew(Suchstring) - 4) & ")"
- MessageBox.Show(Suchstring)
- ' Das letzte 'Or' entfernen
- ArtikelBindingSource.Filter = Suchstring
- Else
- MsgBox("Es konnte kein Suchfilter eingestellt werden")
- Exit Sub
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- ' Hilfsfunktionen, nicht schön, aber funktionieren
- Public Function Was_ist_Eingabe_für_ein_Datentyp(ByVal Wert As String) As String
- ' Boolean
- Dim BooleanWerte As String
- BooleanWerte = UcaseNew_Str("Ja|Nein|Wahr|Falsch|0|-1|Yes|No|True|False")
- If InStrNew(BooleanWerte, UcaseNew_Str(Wert)) > 0 Then
- Return "Boolean"
- End If
- ' Zahl
- If Nur_Zahlen_zulassen(Wert, True) = Wert Then
- Return "Zahl"
- End If
- ' String
- If Nur_Zahlen_zulassen(Wert, True) <> Wert Then
- Return "String"
- End If
- End Function
- Function Nur_Zahlen_zulassen(Eingabe As String, Sonderzeichen As Boolean) As String
- Dim Zähler1 As Integer
- Dim ASCII As Integer
- For Zähler1 = 0 To LenNew(Eingabe) - 1
- ASCII = ASCNew(Eingabe.Chars(Zähler1).ToString)
- ' Wenn das aktuelle Zeichen keine Zahl ist, dieses löschen
- If ASCII <= 46 Or ASCII >= 58 Then
- ' Zeichen ,;.: zulassen
- If Sonderzeichen = True And ASCII = 44 Or ASCII = 59 Or ASCII = 46 Or ASCII = 58 Then
- ' Eingabe = ReplaceNew(Eingabe, Zeichen1(Zähler1), "")
- Else
- Eingabe = ReplaceNew(Eingabe, Eingabe.Chars(Zähler1).ToString, "/")
- End If
- End If
- Next Zähler1
- Eingabe = ReplaceNew(Eingabe, "/", "")
- If Eingabe = "" Then
- Nur_Zahlen_zulassen = "0"
- Else
- On Error GoTo Nur_Zahlen_zulassen_Error
- Nur_Zahlen_zulassen = Eingabe
- End If
- Exit Function
- Nur_Zahlen_zulassen_Error:
- Nur_Zahlen_zulassen = Nur_Zahlen_zulassen(Eingabe, False)
- 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“ ()