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
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...
VB.NET-Quellcode
- ''' <summary>
- ''' provides a placeholder-syntax for filters. Sample: dv.FilterX(true, "Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
- ''' </summary>
- ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
- <Extension()>
- Public Sub FilterX(bs As BindingSource, execute As Boolean, expression As String, ParamArray values() As Object)
- bs.Filter = If(execute, GetFilterString(expression, values), "")
- End Sub
- ''' <summary>
- ''' provides a placeholder-syntax for filters. Sample: dv.FilterX("Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
- ''' </summary>
- ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
- <Extension()>
- Public Sub FilterX(bs As BindingSource, expression As String, ParamArray values() As Object)
- bs.Filter = GetFilterString(expression, values)
- End Sub
- ''' <summary> Get the FilterX()-FilterString for Debugging </summary>
- <Extension()>
- Public Function GetFilterString(bs As BindingSource, expression As String, ParamArray values() As Object) As String
- Return GetFilterString(expression, values)
- End Function
- ''' <summary>
- ''' provides a placeholder-syntax for filters. Sample: dv.FilterX(true, "Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
- ''' </summary>
- ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
- <Extension()>
- Public Sub FilterX(dv As DataView, execute As Boolean, expression As String, ParamArray values() As Object)
- dv.RowFilter = If(execute, GetFilterString(expression, values), "")
- End Sub
- ''' <summary>
- ''' provides a placeholder-syntax for filters. Sample: dv.FilterX("Datum >= ? And ? >= Datum", dtpVon.Value, dtpBis.Value)
- ''' </summary>
- ''' <exception cref="ArgumentException">expression contains more placeholders than values are passed</exception>
- <Extension()>
- Public Sub FilterX(dv As DataView, expression As String, ParamArray values() As Object)
- dv.RowFilter = GetFilterString(expression, values)
- End Sub
- Public Function GetFilterString(expression As String, values() As Object) As String
- Dim segments = expression.Split("?"c) ' identify placeholder '?'
- If segments.Count > values.Length + 1 Then Throw New ArgumentException(
- "expression contains more placeholders than values are passed")
- For i = 0 To segments.Length - 2
- Dim val = values(i)
- Dim sb = New Text.StringBuilder("{0}")
- If TypeOf val Is Date Then
- sb.Insert(0, "#"c).Append("#"c)
- ElseIf TypeOf val Is String Then
- With segments(i) ' identify LIKE - wildcard '*' or '%' at end of segement
- If "*%".Contains(.Chars(.Length - 1)) Then sb.Insert(0, "*"c) : segments(i) = .Remove(.Length - 1, 1)
- End With
- With segments(i + 1) ' identify wildcard '*' or '%'
- If .Length > 0 AndAlso "*%".Contains(.Chars(0)) Then sb.Append("*"c) : segments(i + 1) = .Remove(0, 1)
- End With
- sb.Insert(0, "'"c).Append("'"c)
- End If
- segments(i) &= String.Format(Globalization.CultureInfo.InvariantCulture, sb.ToString, val)
- Next
- Return String.Concat(segments)
- End Function
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"