Im Datagridview Row identifizieren

04/11/2009 - 16:35 von Thomas Hübner | Report spam
Hallo NG

Folgendes Problem:

Ein DatagridView ist Über einen Dataview an eine Tabelle im Dataset
gebunden. An den Dataview sind auch noch mehrere Textboxen gebunden.
Wenn ich im Datagridview die Selection àndere werden die Textboxen
entsprechend der Selektierung gesetzt. Soweit so gut.
Jetzt füge ich der Tabelle im Dataset eine Datrow zu und update über
den Adapter. Die Zeile wird im Datagridview im Rahmen der Sortierung
sofort angezeigt (also irgendwo mittendrin). Das ist auch ok
Nun möchte ich aber, das der gerade hinzugefügte Datensatz markiert
ist, und an die Textboxen gebunden wird (zur weiteren Bearbeitung)
also das was auf einen Click passieren würde.
Wie funktioniert das Zusammenspiel? Kann ich da irgendwie im Dataview
(Der ja Datasource für das Grid ist) einen Cursor setzen? Currentrow
im Grid ist schreibgeschützt - das war meine erste Idee. Mit
Dataview.IsNew bin ich auch nicht wirklich weitergekommen.

Danke für Hilfe,
Gruß,
Thomas
 

Lesen sie die antworten

#1 Peter Götz
04/11/2009 - 18:48 | Warnen spam
Hallo Thomas,

Ein DatagridView ist Über einen Dataview an eine Tabelle
im Dataset gebunden. An den Dataview sind auch noch
mehrere Textboxen gebunden.
Wenn ich im Datagridview die Selection àndere werden
die Textboxen entsprechend der Selektierung gesetzt.
Soweit so gut.
Jetzt füge ich der Tabelle im Dataset eine Datrow zu und
update über den Adapter. Die Zeile wird im Datagridview
im Rahmen der Sortierung sofort angezeigt (also irgendwo
mittendrin). Das ist auch ok
Nun möchte ich aber, das der gerade hinzugefügte Datensatz
markiert ist, und an die Textboxen gebunden wird (zur weiteren
Bearbeitung)



Hier ein Beispiel, bei dem via DataView.Findrow
der neue oder der zuletzt aktuell ausgewàhlte
Datensatz gesucht im im DGV ausgewàhlt wird.
Kopiere den Code einfach in ein leeres Formmodul (Form1.vb)

' /// Code in Form1.vb
Public Class Form1
Private WithEvents Textbox1 As TextBox
Private WithEvents DGV As DataGridView
Private WithEvents btnADD As Button
Private mDT As DataTable
Private WithEvents mDV As DataView
Private WithEvents mCM As CurrencyManager
Private mCounter As Integer
Private mCurrentRowItems() As Object


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

CreateControls()
CreateData()
DGV.DataSource = mDV

' mCurrentRowItems enthàlt hier das ItemArray
' der zuletzt hinzugefügten Datarow.
FindRow(mCurrentRowItems)
End Sub

Private Sub CreateData()
' DataTable, DataView u. CurrencyManager erstellen,
' DataTable mit Daten füllen.

Dim i As Integer
Dim DR As DataRow = Nothing

Me.ClientSize = New Size(300, 500)

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns(0).Unique = True

.Columns.Add("Monat", GetType(String))

For i = 1 To 5
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)
.Rows.Add(DR)
mCounter = i
Next
.AcceptChanges()

mCurrentRowItems = DR.ItemArray
End With

mDV = New DataView(mDT)
mDV.AllowNew = False

mDV.Sort = _
mDT.Columns(1).ColumnName & _
", " & _
mDT.Columns(0).ColumnName

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

End Sub

Private Sub CreateControls()
' Steuerelemente erstellen

Textbox1 = New TextBox
With Textbox1
.Font = New Font("Arial", 12)
.SetBounds _
(10, 15, _
Me.ClientSize.Width - 20, _
.Height)

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

End With
Me.Controls.Add(Textbox1)

btnADD = New Button
With btnADD
.Font = New Font("Arial", 8)

.SetBounds _
(Me.ClientSize.Width - 100, _
Me.ClientSize.Height - 50, _
90, 40)

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

.Text = "Add New Record"
End With
Me.Controls.Add(btnADD)

DGV = New DataGridView
With DGV
.DefaultCellStyle.Font = _
Textbox1.Font

.ColumnHeadersDefaultCellStyle.Font = _
btnADD.Font

.SetBounds _
(10, _
Textbox1.Bottom + 10, _
Me.ClientSize.Width - 20, _
(btnADD.Top - 10) - (Textbox1.Bottom + 10))

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(DGV)
End Sub

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

Dim DR As DataRow
Dim Mon As Integer
mCounter += 1
Mon = (mCounter) Mod 12
If Mon = 0 Then
Mon = 12
End If

DR = mDT.NewRow
DR.Item(0) = mCounter
DR.Item(1) = MonthName(Mon)
mDT.Rows.Add(DR)

' neu hinzugefügten Datensatz suchen
FindRow(DR.ItemArray)

End Sub

Private Sub FindRow(ByVal DRItems() As Object)
' den in DRItems übergebenen Datensatz
' suchen und im DGV auswàhlen (via mCM.Position)

Dim RowPos As Integer
Select Case mDV.Sort
Case mDT.Columns(0).ColumnName & _
", " & mDT.Columns(1).ColumnName

RowPos = _
mDV.Find _
(New Object() {DRItems(0), DRItems(1)})

Case mDT.Columns(1).ColumnName & _
", " & mDT.Columns(0).ColumnName

RowPos = _
mDV.Find _
(New Object() {DRItems(1), DRItems(0)})

Case Else

RowPos = mCM.Position

End Select
mCM.Position = RowPos
End Sub

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

If mCM.Position > -1 Then

' akt. Datensatz in mCurrentRowItems merken.
mCurrentRowItems = _
DirectCast _
(mCM.Current, _
DataRowView).Row.ItemArray

Textbox1.Text = _
mCurrentRowItems(1).ToString
Else
Textbox1.Text = ""
End If
End Sub

Private Sub DGV_Sorted _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles DGV.Sorted

Dim Buffer As String = Replace(mDV.Sort, "[", "")
Buffer = Replace(Buffer, "]", "")
mDV.Sort = Buffer

Select Case mDV.Sort
Case mDT.Columns(0).ColumnName
mDV.Sort &= ", " & mDT.Columns(1).ColumnName

Case mDT.Columns(1).ColumnName
mDV.Sort &= ", " & mDT.Columns(0).ColumnName

End Select

' nach der Neusortierung den bisherigen
' akt. Datensatz suchen und im DGV auswàhlen.
FindRow(mCurrentRowItems)
End Sub
End Class
' \\\ E N T E

Nach dem Programmstart zeigt das DataGridView (DGV) fünf
Datensàtze. Mit jedem Klick auf den Button "Add New Record"
wird ein weiterer Datensatz hinzugefügt. Dieser Datensatz
wird im DGV als akt. Datensatz markiert und ebenso in der
Textbox angezeigt.
Wird die Sortierung im DGV durch Mausklick auf einen Spaltenkopf
(ID oder Monat) geàndert wird via FindRow(mCurrentRowItems)
wieder zum zuletzt akt. im DGV ausgewàhlten Datensatz gegangen.

Eine andere Methode den neuen oder zuletzt aktuellen
Datensatz zu finden wàre, die DataView sequentiell bis zum
neuen oder bis zum gemerkten, zuletzt akt. ausgewàhlten
Datensatz zu durchlaufen und dann den CurrencyManager
auf die entspr. Position zu setzen.

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

Ähnliche fragen