BindingSource Filter für Wochenenden setzen?

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    BindingSource Filter für Wochenenden setzen?

    Hallo zusammen.
    Ich nutze zum Filtern von Bindingsources den Code (s.u.) von @ErfinderDesRades.
    Nu will ich gerne eine BindingSource nach Wochentag filtern. Also ich hab einen ganzen Schwung Datensätze in einer DataTable - angezeigt in einem DataGridView.
    Die DataTable beinhaltet eine Spalte "Datum" mit Datentyp DateTime. Ich möchte nun nur die Einträge sehen, welche Datum.DayOfWeek = DayOfWeek.Saturday
    oder Datum.DayOfWeek = DayOfWeek.Sunday haben. Kann ich das mit einem Filter auf die Bindingsource irgendwie bewerkstelligen (mit ggf. anderem FilterCode) oder soll ich mir die betroffenen Datensätze
    via Code in eine temporäre Table kopieren und damit arbeiten?

    Vielleicht steh ich auch grad aufm Schlauch und es ist ganz einfach... ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' provides a placeholder-syntax for filters. Sample: dv.FilterX(true, "Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
    3. ''' </summary>
    4. ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
    5. <Extension()>
    6. Public Sub FilterX(bs As BindingSource, execute As Boolean, expression As String, ParamArray values() As Object)
    7. bs.Filter = If(execute, GetFilterString(expression, values), "")
    8. End Sub
    9. ''' <summary>
    10. ''' provides a placeholder-syntax for filters. Sample: dv.FilterX("Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
    11. ''' </summary>
    12. ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
    13. <Extension()>
    14. Public Sub FilterX(bs As BindingSource, expression As String, ParamArray values() As Object)
    15. bs.Filter = GetFilterString(expression, values)
    16. End Sub
    17. ''' <summary> Get the FilterX()-FilterString for Debugging </summary>
    18. <Extension()>
    19. Public Function GetFilterString(bs As BindingSource, expression As String, ParamArray values() As Object) As String
    20. Return GetFilterString(expression, values)
    21. End Function
    22. ''' <summary>
    23. ''' provides a placeholder-syntax for filters. Sample: dv.FilterX(true, "Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
    24. ''' </summary>
    25. ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
    26. <Extension()>
    27. Public Sub FilterX(dv As DataView, execute As Boolean, expression As String, ParamArray values() As Object)
    28. dv.RowFilter = If(execute, GetFilterString(expression, values), "")
    29. End Sub
    30. ''' <summary>
    31. ''' provides a placeholder-syntax for filters. Sample: dv.FilterX("Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
    32. ''' </summary>
    33. ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
    34. <Extension()>
    35. Public Sub FilterX(dv As DataView, expression As String, ParamArray values() As Object)
    36. dv.RowFilter = GetFilterString(expression, values)
    37. End Sub
    38. Public Function GetFilterString(expression As String, values() As Object) As String
    39. Dim segments = expression.Split("?"c) ' identify placeholder '?'
    40. If segments.Count > values.Length + 1 Then Throw New ArgumentException(
    41. "expression contains more placeholders than values are passed")
    42. For i = 0 To segments.Length - 2
    43. Dim val = values(i)
    44. Dim sb = New Text.StringBuilder("{0}")
    45. If TypeOf val Is Date Then
    46. sb.Insert(0, "#"c).Append("#"c)
    47. ElseIf TypeOf val Is String Then
    48. With segments(i) ' identify LIKE - wildcard '*' or '%' at end of segement
    49. If "*%".Contains(.Chars(.Length - 1)) Then sb.Insert(0, "*"c) : segments(i) = .Remove(.Length - 1, 1)
    50. End With
    51. With segments(i + 1) ' identify wildcard '*' or '%'
    52. If .Length > 0 AndAlso "*%".Contains(.Chars(0)) Then sb.Append("*"c) : segments(i + 1) = .Remove(0, 1)
    53. End With
    54. sb.Insert(0, "'"c).Append("'"c)
    55. End If
    56. segments(i) &= String.Format(Globalization.CultureInfo.InvariantCulture, sb.ToString, val)
    57. Next
    58. Return String.Concat(segments)
    59. End Function
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    so direkt wüsste ich da nix. DataExpressions müssen sich halt auf DataColumns beziehen, und wenn du keine Column Weekday hast, is schlecht.
    Man könnte halt so eine Spalte dranmachen, wobei - im Bereich Arbeitszeiterfassung sollte man wohl gleich einen TagTyp einführen, mit Feiertag, Arbeitstag, Krank, Urlaub, dem dann auch eine Regelarbeitszeit zugeordnet ist oder sowas.
    Die Zuordnung des "TagTypen" passiert anderweitig: Feiertage durch das Bundesland des jeweiligen Standortes, Urlaub/Krank durch die Urlaubsplanung,
    Soll-Stunden (Regel-Arbeitszeit) durch den Mitarbeiterstamm etc.
    Ich probierma ne expressionCol an die Table dranzukleben - wie sähe denn die Expression aus, um den Wochentag aus dem Datum zu saugen?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    ... um den Wochentag aus dem Datum zu saugen?


    meist du sowas

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim d As Date = Now
    3. Select Case CInt(d.DayOfWeek)
    4. Case Is = 0, 6
    5. MessageBox.Show("Wochenende")
    6. Case Is = 1, 2, 4, 5
    7. MessageBox.Show("Wochentag")
    8. Case Is = 3
    9. MessageBox.Show("SpezialTag")
    10. Case Else
    11. End Select
    12. End Sub

    Kasi schrieb:

    meist du sowas

    Ne, ich meinte eine Spalte im DataSet, die eine Expression beinhaltet.

    Mit sowas hol ich mir ab und an mal übergeordnete Spalten, wenn ich sie dringend brauche.
    Ich hab z.B. 2 Tabellen

    Standort -> Mitarbeiter (hat die Spalte StandortID). Wenn ich da jetzt den StandortName brauch, dann mach ich in Mitarbeiter ne Spalte "expStandortName" und als Expression
    stünde drin Parent(FK_Standort_Mitarbeiter).Name ich hatte gehofft, sowas könnte man mit Wochentagen aus der Datum-Spalte auch betreiben.

    Aber ist nicht schlimm, ich muss auch irgendwie die Feiertrage noch rausfiltern - dann bau' ich mir dafür was eigenes und arbeite ohne Filter ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: