Datensatzmarkierer in einem DataGridView setzen / verschieben

25/01/2010 - 16:21 von Andre Derron | Report spam
Hallo NG

Wie kann ich den Datensatmarkierer verschieben bzw nach Änderung der
Sortierung
auf den richtigen Datensatz setzen?

Private Sub findAktuelleZeile
(ByVal dgv As DataGridView, ByVal id As Integer, Optional ByVal idxCol
As Integer = 0)
For i As Integer = 0 To dgv.Rows.Count - 1
If CInt(dgv.Rows(i).Cells(idxCol).Value) = id Then

dgv.FirstDisplayedScrollingRowIndex = i
dgv.Rows(i).Selected = True
Exit For
End If
Next
End Sub

So wird zwar die richtige Zeile markiert und in den sichtbaren Bereich
des dgv geschoben, aber der Datensatzmarkierer bleibt auf der
ursprünglichen Zeile.

Bin um jeden Tipp Dankbar
Gruss und Danke imVoraus
André
 

Lesen sie die antworten

#1 Peter Götz
26/01/2010 - 13:17 | Warnen spam
Hallo Andre,

Wie kann ich den Datensatmarkierer verschieben bzw
nach Änderung der Sortierung auf den richtigen Datensatz
setzen?



Im nachfolgenden Beispiel ist ein DataGridView (DGV) über
eine DataView (mDV) an eine DataTable (mDT) gebunden.
Mit Hilfe eines zur DataView (mDV) erzeugten Currencymanagers
(mCM) kann via mCM.Position = ... der jeweils gewünschte
Datensatz zum akt. Datensatz gemacht und damit auch der
Datensatzmarkierer im DGV entsprechend gesetzt werden.

' /// Code in einem leeren Formmodul
Public Class Form1
Private mRnd As Random
Private WithEvents mTimer As Windows.Forms.Timer
Private mDT As DataTable
Private mDV As DataView
Private WithEvents mCM As CurrencyManager
Private DGV As DataGridView

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

' DataGridView-Control erzeugen
DGV = New DataGridView
DGV.Dock = DockStyle.Fill
Me.Controls.Add(DGV)
End Sub


Private Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Shown

CreateData()

With DGV
.DefaultCellStyle.Font = _
New Font("Arial", 12)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.DataSource = mDV
.AutoResizeColumns()
End With

mRnd = New Random(Now.Millisecond)
mTimer = New Windows.Forms.Timer
With mTimer
.Interval = 1000
.Start()
End With
End Sub


Private Sub Form1_FormClosing _
(ByVal sender As Object, _
ByVal e As FormClosingEventArgs _
) Handles Me.FormClosing

' Timer anhalten.
If mTimer IsNot Nothing Then
mTimer.Stop()
mTimer.Dispose()
End If
End Sub


Private Sub mTimer_Tick _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mTimer.Tick

' Datensatzzeiger (mCM.Position) auf einen
' anderen Datensatz setzen.
mCM.Position = mRnd.Next(1, 12)
End Sub


Private Sub CreateData()
' DataTable, DataView u.
' CurrencyManager(erzeugen)

Dim i As Integer
Dim DR As DataRow

mDT = New DataTable("mDT")
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("SName", GetType(String))
.Columns.Add("LName", GetType(String))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, True)
DR.Item(2) = MonthName(i, False)
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDV = New DataView(mDT)

mCM = DirectCast _
(Me.BindingContext(mDV), _
CurrencyManager)
End Sub


Private Sub mCM_PositionChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mCM.PositionChanged

' akt. Datensatz im Konsolfenster anzeigen

Console.WriteLine _
("RecordIndex selected: " & mCM.Position)

Dim DRV As DataRowView

If mCM.Position > -1 Then
DRV = DirectCast(mCM.Current, DataRowView)

Console.WriteLine _
(DRV.Item(0).ToString & "; " & _
DRV.Item(1).ToString & "; " & _
DRV.Item(2).ToString & _
ControlChars.CrLf)
End If
End Sub
End Class
' \\\ E N T E

Nach dem Programmstart wird mit jedem mTimer_Tick-
Ereignis zu einem anderen Datensatz gewechselt. Die
Auswahl des Datensatzes erfolgt zufàllig mit Hilfe von
mRnd.Next().

Wie nach einer Neusortierung des DGV-Inhaltes der
zuletzt ausgewàhlte Datensatz wieder gefunden und
erneut ausgewàhlt werden kann, siehst Du im Beispiel
unter

www.gssg.de -> Visual Basic -> VB.net
-> DataTable / DataView / CurrencyManager
-> DataView.Sort, DataView.Find

Eine weitere Möglichkeit einen bestimmten Datensatz im
DataGridView zu finden und auszuwàhlen zeigt das Beispiel
unter

www.gssg.de -> Visual Basic -> VB.net
-> DataGridView
-> DataGridView (DataView) FindRow

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

Ähnliche fragen