DataView.RowFilter zum Filtern von Datumswerten nach Wochentagen

11/12/2007 - 01:10 von Frank Hammerschmidt | Report spam
Guten Morgen,

ich habe eine Liste von Terminen, von denen ein Benutzer nur die Termine
bestimmter Wochentage sehen möchte. Die Datenbasis besteht tatsàchlich
nur aus den Terminen.

Hat jemand eine Idee, wie ein RowFilter für diesen Fall auszusehen hàtte?

Zum Testen unten mal etwas Kurzes zum Erzeugen der Umgebung.

Vielen Dank,
Frank


Public Class Form1
Private _dt As Data.DataTable
Private _dv As Data.DataView

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Load
_dt = New Data.DataTable("Termine")
_dt.Columns.Add(New Data.DataColumn("Termin", _
System.Type.GetType("System.DateTime")))
For i As Integer = 1 To 365
Dim r As Data.DataRow = _dt.NewRow
r(0) = DateSerial(2008, 1, i)
_dt.Rows.Add(r)
Next
_dv = New Data.DataView(_dt)

_dv.RowFilter = "Zeig' mir bitte nur die Montage und Donnerstage"

With Me.DataGridView1
.Columns.Clear()
.Columns.Add("Termin", "Termin")
.Columns.Add("Wochentag", "Wochentag")
.Columns(0).DataPropertyName = "Termin"
.Columns(1).DataPropertyName = "Termin"

.DataSource = _dv
End With

End Sub

Private Sub DataGridView1_CellFormatting( _
ByVal sender As Object, _
ByVal e As Forms.DataGridViewCellFormattingEventArgs) _
Handles DataGridView1.CellFormatting

If e.ColumnIndex = 1 Then
e.Value = Format(e.Value, "dddd")
End If

End Sub
End Class
 

Lesen sie die antworten

#1 Peter Götz
11/12/2007 - 11:18 | Warnen spam
Hallo Frank,

ich habe eine Liste von Terminen, von denen ein
Benutzer nur die Termine bestimmter Wochentage
sehen möchte. Die Datenbasis besteht tatsàchlich
nur aus den Terminen.

Hat jemand eine Idee, wie ein RowFilter für diesen
Fall auszusehen hàtte?



Mit RowFilter wird das nichts werden, da Du als
Filterkriterium Rückgabewerte einer Funktion
benötigen würdest.

Schau Dir mal das nachfolgende Beispiel an.
Code einfach in einer leere Form1 kopieren.
Die eigentliche Funktionalitàt steckt in der
Sub CreateFilteredView(). Der Rest dient nur
dem Erzeugen von Controls und Daten.

' /// Code in einer leeren Form1
Public Class Form1
Private WithEvents DGV As DataGridView
Private CBoxes() As CheckBox
Private WithEvents cb As CheckBox
Private mDT As DataTable
Private mDTx As DataTable
Private mDVx As DataView

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

CreateControls()
CreateData()
With DGV
.DataSource = mDVx
.AutoResizeColumns()
.AutoResizeRows()

.Columns(0).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight

.Columns(2).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
End With
End Sub

Private Sub CBoxes_CheckStateChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs)

CreateFilteredView()
DGV.DataSource = mDVx
DGV.AutoResizeRows()
End Sub

Private Sub CreateFilteredView()
' DataTable/DataView in Abhàngigkeit
' der gerade markierten Checkboxen erstellen
Dim Row As DataRow
Dim DR As DataRow
Dim i As Integer
Dim DOW As Integer
Dim DT As DataTable = mDT.Clone

For Each Row In mDT.Rows
DOW = CDate(Row.Item(1)).DayOfWeek
For i = 0 To 6
If CBoxes(i).Checked Then
If DOW = i Then
DR = DT.NewRow
DR.ItemArray = Row.ItemArray
DT.Rows.Add(DR)
End If
End If
Next
Next
If DT.Rows.Count > 0 Then
mDVx = New DataView(DT)
Else
mDVx = New DataView(mDT)
End If
End Sub


Private Sub CreateData()
' Datatable (mDT) mit 100 Datumswerten erstellen
Dim i As Integer
Dim DR As DataRow

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Datum", GetType(Date))
.Columns.Add("WoTag", GetType(Integer))
.Columns.Add("WoTagName", GetType(String))
For i = 0 To 99
DR = .NewRow
With DR
.Item(0) = i
.Item(1) = Now.AddDays(i)
.Item(2) = CDate(.Item(1)).DayOfWeek
.Item(3) = WeekdayName(CInt(.Item(2)) + 1, _
False, _
FirstDayOfWeek.Sunday)
End With
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDVx = New DataView(mDT)
End Sub

Private Sub CreateControls()
' Controls (DataGridView u. CheckBoxen) erstellen
Dim Left As Integer
Dim Top As Integer = Me.ClientSize.Height - 40
Dim F As New Font("Arial", 10)
Dim i As Integer
ReDim CBoxes(6)

Left = 10
For i = 0 To 6
CBoxes(i) = New CheckBox
With CBoxes(i)
.Text = WeekdayName _
(i + 1, False, FirstDayOfWeek.Sunday)

.SetBounds(Left, Top, 90, 30)
.Checked = False
.Anchor = AnchorStyles.Left Or _
AnchorStyles.Bottom

End With
Me.Controls.Add(CBoxes(i))
AddHandler CBoxes(i).CheckStateChanged, _
AddressOf CBoxes_CheckStateChanged
Left = CBoxes(i).Right + 5
Next
Me.ClientSize = New Size(CBoxes(6).Right + 10, 500)

DGV = New DataGridView
With DGV
.DefaultCellStyle.Font = New Font("Arial", 16)
.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.SetBounds(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 50)

.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(DGV)
End Sub
End Class
' \\\ E N T E

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen