| |
Fortgeschrittene ProgrammierungDatensätze Filtern | | | Autor: ERBRU | Datum: 04.04.17 18:29 |
| Hallo zusammen,
habe hier schon einiges hilfreiches gefunden, doch dieses noch nicht wirklich.
also ich habe eine Tabelle mit einer Spalte Namens Bestelldatum
OK nichts besonderes nun habe ich noch eine Combobox aufs Formular gebracht die ich mit der Jahres Zahl aus der Bestelldatum Spalte auslese.
nun möchte ich in der ComboBox ein Jahr auswählen und die Datensätze Richtig sortiert filtern
so lese ich die Spalte aus
Private Sub Jahresliste()
If BS_Eingang_Liste Is Nothing Then Exit Sub
If BS_Eingang_Liste.Count = 0 Then Exit Sub
Dim Jahr_von = BS_Eingang_Liste.Min(Function(x) x.Bestelldatum).Year
Dim Jahr_bis = BS_Eingang_Liste.Max(Function(x) x.Bestelldatum).Year
cbx_Jahr.Items.Clear()
For i = Jahr_von To Jahr_bis : cbx_Jahr.Items.Add(i) : Next
cbx_Jahr.SelectedIndex = -1
End Sub zur Datenanzeige verwende ich eine gebundene Datagridview
hat jemand eine Idee wie ich die Filterung Jahr aus der Bestelldatum Spalte umsetzen kann? | |
Re: Datensätze Filtern | | | Autor: Manfred X | Datum: 05.04.17 00:07 |
| Hallo!
Vielleicht so oder ähnlich ....
Public Class frmComboBinding
Dim dt As New DataTable, bs As BindingSource
Dim dgv As New DataGridView With {.Parent = Me, .Top = 50}
Dim WithEvents cbo As New ComboBox With {.Parent = Me}
Private Sub frmComboBinding_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Testspalten
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Date", GetType(Date))
'Testdaten
Dim year As Integer = 2000, id As Integer = 0
For i As Integer = 1 To 10
year += 1 : id += 1
dt.Rows.Add(id, New Date(year, i + 1, 15))
id += 1
dt.Rows.Add(id, New Date(year, i, 25))
Next i
'Datenbindung Quelle
bs = New BindingSource With {.DataSource = dt}
'Sortierspalte und Richtung festlegen
bs.Sort = "Date ASC"
dgv.DataSource = bs
'Ermittlung der Jahreszahlen als Liste (LINQ)
Dim dates As List(Of Integer) = _
(From rw As DataRow In dt.AsEnumerable _
Let Vl = CInt(rw.Field(Of Date)("Date").ToString("yyyy"))
Select Vl Distinct).ToList
'Liste an Combobox binden
cbo.DataSource = dates
End Sub
Private Sub cbo_SelectedIndexChanged(sender As Object, _
e As System.EventArgs) Handles cbo.SelectedIndexChanged
If cbo.SelectedIndex = -1 Then
bs.Filter = ""
Else
'Filter setzen: Datumswerte im Standardformat angeben
Dim year As String = cbo.SelectedItem.ToString
bs.Filter = _
"Date >= #1/1/" & year & "# AND Date <= #12/31/" & year & "#"
End If
End Sub
End Class
Beitrag wurde zuletzt am 05.04.17 um 00:08:29 editiert. | |
Re: Datensätze Filtern | | | Autor: Franki | Datum: 05.04.17 05:37 |
| Hallo,
Zitat: | |
also ich habe eine Tabelle mit einer Spalte Namens Bestelldatum
| |
Woher stammen denn die Daten in dieser Tabelle?
Wahrscheinlich aus einer Datenbank wo du alle Bestellungen ausgelesen hast?
Zitat: | |
OK nichts besonderes nun habe ich noch eine Combobox aufs
Formular gebracht die ich mit der Jahres Zahl aus der
Bestelldatum Spalte auslese.
| |
Kann man durchaus machen, aber siehe oben, besser ist es eine neue Abfrage auf die Datenquelle zu machen wo das Jahr als Kriterium dient (Z.B SQL bei einer Datenbank)
Zitat: | |
nun möchte ich in der ComboBox ein Jahr auswählen und die
Datensätze Richtig sortiert filtern
| |
Siehe oben, bei vielen Datn ist es wesentlich performanter neu aus der Datenquelle anhand des Kriterums auszulesen anstatt im Ergebnis zu filtern.
Ich weiß ja jetzt nicht welche Datenquelle du hast und wie die aufgebaut ist. Sollte es sich um eine Datenbank handeln, dann bist du mit meinem Vorschlag definitiv auf der sicheren Seite was die Performance und die Zuverlässigkeit der Daten angeht.
Wenn es sich jedoch nur um 0815 Daten handeln sollte kannst du natürlich auch im Grid selbst filtern / sortieren.
Gruß
Frank | |
Re: Datensätze Filtern | | | Autor: Manfred X | Datum: 05.04.17 08:08 |
| Hallo!
Im Rahmen der Nutzung von ADO.Net auf sehr großen Datentabellen ist bei Abfragen
die Anwendung einer "gestaffelten" Strategie empfehlenswert.
Zunächst führt man eine Aggregierungsabfrage durch und ermittelt, wie viele
Datensätze pro Jahr vorliegen.
Automatisiert oder per User-Auswahl im Dialog kann man auf dieser Grundlage einen
geeigneten Abfragezeitraum bestimmen (z.B. bezogen auf eine Obergrenze der gleichzeitig
im Speicher zu haltenden Datensätze - eventuell abhängig von der Größe des aktuell
verfügbaren Speichers).
Die Daten-Ansicht kann innerhalb der In-Memory-DB durch Filtern der abgefragten
Datensätze (DataView o.ä.) im Dialog durch den User weiter eingegrenzt werden.
Beitrag wurde zuletzt am 05.04.17 um 08:14:39 editiert. | |
Re: Datensätze Filtern | | | Autor: ERBRU | Datum: 05.04.17 19:39 |
| Hallo Manfred X,
Danke so hast den Nagel auf den Kopf getroffen.
es klappt bei mir auch ich konnte es in meinem Projekt (anders) aber verwenden.
eine Frage noch Allgemein zur CoBo kann man auch generell immer zum letzten Eintrag gehen
2010
2011
2012
2013
2014
2015
2016
2017 (aktuelles Jahr)
ist die CoBo ja sorted true, ich möchte nun immer das aktuelle Jahr automatisch ausgewählt haben
also nicht SelectedIndex = 0 sondern SelectedIndex = "aktuelles Jahr" ?? | |
Re: Datensätze Filtern | | | Autor: Manfred X | Datum: 05.04.17 22:53 |
| Hallo!
Die Verwendung der "sorted"-Eigenschaft der gebundenen Combobox ist
nicht erforderlich.
Das Sortieren übernimmt z.B. LINQ durch eine "Order By"-Klausel:
'Ermittlung der Jahreszahlen als Liste (LINQ)
Dim dates As List(Of Integer) = _
(From rw As DataRow In dt.AsEnumerable _
Select yr = rw.Field(Of Date)("Date").Year Distinct Order By yr).ToList Man kann auch die Sort-Methode der generischen Liste einsetzen:
dates.Sort() Alternativ kann man auch eine "Bindingsource" zwischen die Liste und die Combobox
schalten und deren "Sort"-Methode heranziehen.
Den Listenindex, in dem die aktuelle Jahreszahl eingetragen ist,
ermittelt man z.B. durch:
Dim index_aktuellesjahr As Integer = dates.IndexOf(Today.Year) Nach dem Erstellen der Datenbindung erfolgt das Setzen der Jahreszahl in
der Combobox "cbo" durch: cbo.SelectedIndex = index_aktuellesjahr
Beitrag wurde zuletzt am 05.04.17 um 22:58:54 editiert. | |
Re: Datensätze Filtern | | | Autor: ERBRU | Datum: 06.04.17 04:30 |
| Perfect Manfred X
genau so hatte ich es mir gewünscht. Funktioniert bestens. | |
Und wann verschiebt jemand das in das .NET Forum? | | | Autor: Blackbox | Datum: 17.04.17 18:21 |
| nur so eine Frage | |
Kontakt-Formular verwenden .... | | | Autor: Manfred X | Datum: 18.04.17 10:24 |
| Hinweise an die Redaktion bitte nicht ins Forum posten,
sondern das Kontaktformular nutzen. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|