vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
DataGridView 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView sortieren, Position merken 
Autor: ModeratorFZelle (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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView sortieren, Position merken 
Autor: ModeratorFZelle (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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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