DGV nach Datum Filtern - nur Werte in einem Bestimmten Zeitraum

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von vierkant.

    DGV nach Datum Filtern - nur Werte in einem Bestimmten Zeitraum

    Hi! Ich habe eine Datengebundene Datagridview die ich so Filtern kann:

    VB.NET-Quellcode

    1. DataTable2BindingSource.Filter = String.Concat("Patient = '", PatientToolStripMenuItem.Text, "'")


    unter anderen habe ich die Spalte "Datum" (Format: 01.02.2013)

    Kann ich die DGV so Filtern das nur Werte in einem gewissen Zeitraum angezeigt werden?

    Beispiel: Werte vom 01.12.2012 bis 01.02.2013

    Jemand ne Idee wie das geht?
    Ich weis du wirst wieder schimpfen mit mir (hast ja schon öfters müssen mit mir ;( ) Aber ich komme damit nicht klar!
    Hab mir mal folgenden Code angeschaut:

    VB.NET-Quellcode

    1. BestellungBindingSource.FilterX("Datum >= ? And Datum <= ?", dtpVon.Value, dtpBis.Value)


    mein ach so kleines Hirn hat folgendes reproduziert:


    VB.NET-Quellcode

    1. DataTable1BindingSource.Filter = "Datum >= 10.02.2013 And Datum <= 11.02.2013"


    Natürlich geht das nicht!

    Ich würde den Wert "von" aus DateTimePicker1 holen und den Wert "bis" aus "DateTimePicker2"

    Ich red mal nicht um den heissen Brei herum - aus mir wird wohl nie ein Programmierer werden - muss auch nicht, Hauptsache meine Anwendung (die ausschließlich ich zum eigengebrauch verwende) tut das was sie soll - und da geht mir eben diese Funktion noch ab! Vielleicht ist ja wer so nett und und präsentiert mir einen fertigen Codeschnipsel, wäre ne feine Sache!!!

    vierkant schrieb:

    Wie geht`s dann?
    Da musste Dir di Werte holen und Dir einen Filterstring zusammensetzen:

    VB.NET-Quellcode

    1. Dim ci As New CultureInfo("en-US")
    2. Dim dt1 = dtp1.Value.ToString("#mm/dd/yyyy#", ci)
    3. Dim dt2 = dtp2.Value.ToString("#mm/dd/yyyy#", ci)
    4. Dim Filter = String.Format("Datum >= {0} And Datum <= {1}", dt1, dt2)
    Bilder
    • Filter.jpg

      9,54 kB, 492×50, 246 mal angesehen
    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 schrieb:

    vierkant schrieb:

    Wie geht`s dann?
    Da musste Dir di Werte holen und Dir einen Filterstring zusammensetzen:

    VB.NET-Quellcode

    1. Dim ci As New CultureInfo("en-US")
    2. Dim dt1 = dtp1.Value.ToString("#mm/dd/yyyy#", ci)
    3. Dim dt2 = dtp2.Value.ToString("#mm/dd/yyyy#", ci)
    4. Dim Filter = String.Format("Datum >= {0} And Datum <= {1}", dt1, dt2)

    Hi Danke für die schnelle Hilfe! Irgendwas stimmt jedoch bei mir nicht! Statt Beispielsweise 01.01.2012 wird das Datum so ausgegeben 00.01.2012
    Bilder
    • 10-02-2013 19-55-09.png

      52,3 kB, 1.358×472, 261 mal angesehen
    diese Methode in ein Modul:

    VB.NET-Quellcode

    1. <Extension()> _
    2. Public Sub FilterX(ByVal bs As BindingSource, ByVal expression As String, ByVal ParamArray values() As Object)
    3. Dim splits = expression.Split("?"c) ' identify placeholder '?'
    4. If splits.Count > values.Length + 1 Then Throw New ArgumentException( _
    5. "expression contains more placeholders than values are passed")
    6. For i = 0 To splits.Length - 2
    7. Dim val = values(i)
    8. Dim format = If(TypeOf val Is String, "'{0}'", If(TypeOf val Is Date, "#{0}#", "{0}"))
    9. splits(i) &= String.Format(Globalization.CultureInfo.InvariantCulture, format, val)
    10. Next
    11. bs.Filter = String.Concat(splits)
    12. End Sub


    und dann:

    VB.NET-Quellcode

    1. DataTable2BindingSource.FilterX("Datum >= ? And Datum <= ?", dtp1.Value, dtp2.Value)

    vierkant schrieb:

    Irgendwas stimmt jedoch bei mir nicht!
    C&P-Bremse. :D
    Mach mal aus #mm/dd/yyyy# dies: #MM/dd/yyyy# "mm" ist Minute, "MM" ist Monat.
    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!
    Hi! Ich bins nochmal!

    Jetzt will ich 2 Dinge Filtern:
    nur Zeilen in dem sich ein bestimmtes Wort in Spalte "Patient" in dem vorgegebenen Zeitraum

    Ich hab`s mal so versucht:

    VB.NET-Quellcode

    1. Dim ci As New CultureInfo("en-US")
    2. Dim dt1 = DateTimePicker1.Value.ToString("#MM/dd/yyyy#", ci)
    3. Dim dt2 = DateTimePicker2.Value.ToString("#MM/dd/yyyy#", ci)
    4. Dim Filter = String.Format("Datum >= {0} And Datum <= {1}", dt1, dt2)
    5. DataTable1BindingSource.Filter = "Patient= '" & PatientToolStripMenuItem.Text & Filter


    Leider ohne Erfolg! Wie gehört es richtig? Bitte um Hilfe

    VB.NET-Quellcode

    1. DataTable1BindingSource.FilterX("Patient= ? And Datum >= ? And Datum <= ?", _
    2. PatientToolStripMenuItem.Text, DateTimePicker1.Value, DateTimePicker2.Value)
    Deswegen habich die genannte Extension (s.post#8) geschrieben, dass man nicht jeden Formatierungsfehler, den man machen kann, selbst durchexerzieren muß.

    Aber darauf willst du offensichtlich nicht verzichten, du bist ja auch bald durch damit (mit dem Durchexerzieren aller Fehlermöglichkeiten).
    Also kurz vorgesagt: Es fehlt vmtl. das abschließende Hochkomma nach dem PatientToolStripMenuItem.Text.

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

    So habs jetzt so gemacht wie du gesagt hast!
    Neues Modul:

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Module Module1
    3. <Extension()> _
    4. Public Sub FilterX(ByVal bs As BindingSource, ByVal expression As String, ByVal ParamArray values() As Object)
    5. Dim splits = expression.Split("?"c) ' identify placeholder '?'
    6. If splits.Count > values.Length + 1 Then Throw New ArgumentException( _
    7. "expression contains more placeholders than values are passed")
    8. For i = 0 To splits.Length - 2
    9. Dim val = values(i)
    10. Dim format = If(TypeOf val Is String, "'{0}'", If(TypeOf val Is Date, "#{0}#", "{0}"))
    11. splits(i) &= String.Format(Globalization.CultureInfo.InvariantCulture, format, val)
    12. Next
    13. bs.Filter = String.Concat(splits)
    14. End Sub
    15. End Module


    Dann:

    VB.NET-Quellcode

    1. DataTable2BindingSource.FilterX("Patient= ? And Datum >= ? And Datum <= ?", PatientToolStripMenuItem.Text, DateTimePicker1.Value, DateTimePicker2.Value)


    Jetzt wird gar nichts mehr gefiltert! Keine Funktion

    Fehler:

    VB.NET-Quellcode

    1. bs.Filter = String.Concat(splits)
    <--- Die Spalte "Datum" wurde nicht gefunden ???? Is aber da
    Bilder
    • 15-02-2013 08-18-05.png

      87,77 kB, 963×697, 262 mal angesehen
    dein Debugging-Bildle zeigt einen blitzsauberen Filter-String, syntaktisch 100% korrekt.
    Wennersagt "Datum nicht gefunden", dann filterst du wohl die falsche DataTable.
    Könnte mir vorstellen, du filterst die Patienten-DataTable, aber die Datumse stehen in einer anneren DataTable.