Frage zum DataGridView-Steuerelement

02/02/2008 - 21:22 von Christoph | Report spam
Hi,
ich habe folgendes Problem:
ein DataGridView wird mit Daten gefüllt. Spàter wird vom Programm aus immer
wieder ein Eintrag selektiert:
DataGridView1.Rows(i).Selected = True

Wenn ich spàter versuche mit "DataGridView1.CurrentRow" abzufrage welche
Zeile gerade gewàht ist, kriege ich immer falschen Wert. Erst nachdem die
Zeile mit der Maus angeklickt wurde, wird der richtige CurrentRow-Index
zurückgegeben. Kann mir jemand erklàren, was der Unterschied zwischen
selected- und current-Row ist? Wie kann ich es im Programm richtig
einstellen, damit der korrekte Current-inder zurückgegeben wird?
Gruß
Christoph Michalski
 

Lesen sie die antworten

#1 Peter Götz
03/02/2008 - 11:22 | Warnen spam
Hallo Christoph,

ein DataGridView wird mit Daten gefüllt.



Wie sieht das in konkretem Code aus?

Spàter wird vom Programm aus immer
wieder ein Eintrag selektiert:
DataGridView1.Rows(i).Selected = True



Damit ist die Zeile i markiert, was aber nicht bedeutet,
dass sie auch die aktuelle Zeile ist.

Wenn ich spàter versuche mit "DataGridView1.CurrentRow"
abzufrage welche Zeile gerade gewàht ist,



CurrentRow ist die momentan ausgewàhlte "aktuelle" Zeile,
nicht aber unbedingt eine "markierte" Zeile.


kriege ich immer falschen Wert. Erst nachdem die
Zeile mit der Maus angeklickt wurde,



... wird diese Zeile zur aktuellen Zeile.

wird der richtige CurrentRow-Index zurückgegeben.
Kann mir jemand erklàren, was der Unterschied
zwischen selected- und current-Row ist? Wie kann
ich es im Programm richtig einstellen, damit der
korrekte Current-inder zurückgegeben wird?



Schau Dir mal das nachfolgende Beispiel an.

' /// Code in einer leeren Form1
Public Class Form1
Private WithEvents DGV As DataGridView
Private WithEvents BtnPrevious As Button
Private WithEvents BtnNext As Button

Private WithEvents mCM As CurrencyManager
Private mDT As DataTable
Private mDV As DataView

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

CreateControls()
CreateData()
DGV.DataSource = mDV
DGV.AutoResizeColumns()
End Sub

Private Sub BtnNext_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles BtnNext.Click

mCM.Position += 1
End Sub

Private Sub BtnPrevious_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles BtnPrevious.Click

mCM.Position -= 1
End Sub

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

Dim DR As DataRow
Dim DRV As DataRowView

If mCM.Position > -1 Then
DRV = DirectCast(mCM.Current, DataRowView)
DR = DRV.Row
Me.Text = DR.Item(0).ToString & ": " & _
DR.Item(1).ToString & "; " & _
DR.Item(2).ToString
Else
Me.Text = "..."
End If
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
Dim R As New Random

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Monat", GetType(String))
.Columns.Add("Betrag", GetType(Double))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)

DR.Item(2) = _
R.Next(10, 100) + R.NextDouble

.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDV = New DataView(mDT)

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

Private Sub CreateControls()
DGV = New DataGridView
With DGV
.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 60)

.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom

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

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

End With
Me.Controls.Add(DGV)

BtnNext = New Button
With BtnNext
.SetBounds _
(Me.ClientSize.Width - 50, _
DGV.Bottom + 10, _
40, 30)

.Font = DGV.ColumnHeadersDefaultCellStyle.Font
.Text = ">"
.Anchor = AnchorStyles.Bottom Or _
AnchorStyles.Right

End With
Me.Controls.Add(BtnNext)

BtnPrevious = New Button
With BtnPrevious
.SetBounds _
(BtnNext.Left - 50, _
BtnNext.Top, _
40, 30)

.Font = BtnNext.Font
.Text = "<"
.Anchor = AnchorStyles.Bottom Or _
AnchorStyles.Right
End With
Me.Controls.Add(BtnPrevious)
End Sub
End Class
' \\\ E N T E

Die DataTable (mDT) enthàlt die Daten.
Die DataView (mDV) dient als DataSource für das DataGridView-
Control DGV.
Der Currencymanager (mCM) verwaltet und setzt den
Datensatzzeiger innerhalb der DataView (mDV).

Mit einem Mausklick auf einen der beiden Buttons wird
mCM.Position um 1 erhöht oder 1 vermindert und damit
der jeweils nàchste oder vorhergehende Datensatz zum
aktuellen Datensatz innerhalb der DataView (mDV).

Jede Änderung der akt. Position des CurrencyManagers
löst das Ereignis mCM_PositionChanged() aus.
Die akt. Position kann direkt via Code mCM.Position =
oder aber auch einfach durch einen Mausklick in eine
andere Zeile des DGV geàndert werden.

Weitere Beispiele zum Thema findest Du unter

www.gssg.de -> Visual Basic -> VB.net


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

Ähnliche fragen