| |
VB.NET - FortgeschritteneDataGridView sortieren, Position merken | | | Autor: mab | Datum: 18.07.11 03:41 |
| Hallo,
ich habe folgendes Problem, an dem ich jetzt schon einige Zeit herumbastle:
Ich möchte eine DataGridView mit 2 Spalten implementieren: Zeit und Temperatur. Dabei können Werte von Zeit als auch Temperatur doppelt vorkommen. Wenn der Anwender eine Zeile ändert oder hinzufügt, soll die Liste automatisch neu sortiert werden, die Selektion aber trotzdem an der richtigen Stelle bleiben. Zur Veranschaulichung eine kleine Skizze:
Ausgangstabelle
| Zeit | Temperatur
----------------------------------------------
| 15 | 30
| 20 | 15
| 25 | 40
* | | Der Benutzer fügt nun einen neuen Wert (Zeit = 20 --> es sollen Rechteckverläufe möglich sein, daher die Möglichkeit für doppelte Werte) hinzu (die eckigen Klammern sollen den Cursor darstellen:
| Zeit | Temperatur
----------------------------------------------
| 15 | 30
| 20 | 15
| 25 | 40
* | 20[] | Was ich mir jetzt wünsche ist folgendes Endergebnis: Die Liste wird beim Verlassen der Zelle (z.B. durch Drücken von Tab) neu sortiert, der Cursor bleibt aber in der gerade neu hinzugefügten Zeile --> respektive springt er dort aber in die nächste Spalte/Zelle. Skizze:
| Zeit | Temperatur
----------------------------------------------
| 15 | 30
| 20 | []
| 20 | 15
| 25 | 40
* | | Mein Versuch, das ganze zu implementieren, sieht bisher folgendermaßen aus:
Public Class Test
'DataGridView dgv ist im FormDesigner erstellt und im Form vorhanden
Private dt As DataTable
Private WithEvents dv As DataView
Private WithEvents cm As Currency Manager
'Zwischenspeicher
Private currentRowIndex As Integer
Private oldVal As Integer
Private newVal As Integer
'Initialisierung
Private Sub init(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Me.Load
dt = New DataTable
dt.Columns.Add("index", GetType(Integer))
dt.Columns.Add("Zeit", GetType(Integer))
dt.Columns.Add("Temperatur", GetType(Integer))
dt.Columns(1).DefaultValue = 0
dt.Columns(2).DefaultValue = 0
dv = New DataView(dt)
dgv.DataSource = dv
End Sub
'Neue Zeile ==> bekommt automatisch einen Index zugewiesen
Private Sub dgv_RowCreated(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles cm.PositionChanged
Dim drv As DataRowView = DirectCast(cm.Current, DataRowView)
If drv.IsNew Then
drv.Item(0) = dt.Rows.Count
End If
End Sub
'Zeile wird bearbeitet ==> Ursprünglichen Wert merken
Private Sub dgv_CellBeginEdit(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) _
Handles dgv.CellBeginEdit
oldVal = dgv.CurrentCell.Value
End Sub
'Bearbeiten beendet (Zellenwechsel) ==> Wertevergleich alt/neu, Sortieren,
' _VERSUCH_, wieder in die richtige Zeile zu kommen
Private Sub dgvDrehzahlPunkte_CellValueChanged(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles dgvDrehzahlPunkte.CellEndEdit
newVal = dgv.CurrentCell.Value
If newVal <> oldVal Then
currentRowIndex = dgv.CurrentRow.Cells.Item(0).Value
dgv.Sort(dgv.Columns(1), System.ComponentModel.ListSortDirection.Ascending)
For Each Row As DataGridViewRow In dgv.Rows
If Row.Cells(0).Value = currentRowIndex Then
cm.Position = Row.Index
End If
Next
End If
End Sub
End Class Problematisch ist: Ich sortiere anhand der Zeit-Spalte, sodass ich nicht in der index-Spalte mit der Find() Methode suchen kann - deshalb der Schleifendurchlauf. Gleichzeitig kann ich aber auch nicht anhand der Zeit-Spalte meine Zeile suchen, da dort doppelte Werte vorkommen können.
Vielleicht hat ja jemand von euch eine gute Idee dazu
MfG,
mab | |
Re: DataGridView sortieren, Position merken | | | Autor: FZelle (Moderator) | Datum: 18.07.11 13:04 |
| 1. CurrencyManager ( zusammengeschrieben ) hat man unter FW 1.1 benutzt, seit 2 gibt es die BindingSource, die vieles vereinfacht.
2. Das Grid hält die Daten nicht, also arbeite auch nicht mit den Daten im Grid.
3. Auch sortieren und Co geht über die BindingSource, nicht über das Grid. | |
Re: DataGridView sortieren, Position merken | | | Autor: U.B. | Datum: 19.07.11 13:16 |
| hi,
ich fülle ein Gridview meistens 'von Hand' und nicht per Binding. Somit stehen einem doch mehr Möglichkeiten zur Verfügung um Zellen entsprechend dem Inhalt zu formatieren oder mit anderen Objekten wie Combobox etc. zu gestalten. Zu Grunde liegt bei mir fast immer eine Datatable mit aufgesetztem Dataview, über den ich z.B. bequem Filter auf verschiedene Felder legen kann. Der Nachteil ist natürlich, dass man sich um das Rückschreiben der Daten in die Datatable selbst kümmern muss.
Das gefragte Problem würde ich über eine versteckte Index-Spalte lösen. Beim Füllen z.B. einfach eine fortlaufende ID vergeben, wenn keine aus der Datenbank vorhanden ist. Über den Index kann dann jede Zeile gefunden und wieder adressiert werden. Die Spalte kann auf Breite=0 fest gesetzt werden.
VG
U.B.
----------
VG
U.B. | |
Re: DataGridView sortieren, Position merken | | | Autor: FZelle (Moderator) | Datum: 19.07.11 15:25 |
| Du hast mit DataBinding genau die gleichen Möglichkeiten zur Formatierung, nur die Nachteile fallen weg.
Wir sind nicht mehr bei VB6 wo DataBinding viele Nachteile hatte.
Er benutzt ja schon eine Indexspalte, die er händisch befüllt, statt AutoIncrement der DataTable zu benutzen. | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|