DataTable - DataRows 'austauschen'

31/05/2009 - 22:20 von Maik Weiß | Report spam
Hallo Community,

ich habe ein DataTable (DT) an ein DataGridView (DGV) mittels dessen
DataSource-Eigenschaft gebunden.

Nun möchte ich den Datensatz (in der DT) zur selektierten DGV-Zeile
gegen einen anderen Datesatz (DataRow) austauschen.

folgender Code àndert in der DGV-Anzeige nichts: (alles bleibt gleich)

Dim dr As DataRow _myDT.Rows.Find(_myDGV.SelectedRows(0).Cells("ID").Value)
dr = newRow

'newRow' ist dabei eine DataRow (identisch zur Struktur
von _myDT) mit anderen Werten


Wie kann man das Problem (Austausch von Zeilen in einer DT) lösen?

mfg

Maik
 

Lesen sie die antworten

#1 Peter Götz
01/06/2009 - 09:51 | Warnen spam
Hallo Maik,

ich habe ein DataTable (DT) an ein DataGridView (DGV)
mittels dessen DataSource-Eigenschaft gebunden.



Damit ist DGV.DataSource eine DataView auf Deine
DataTable (DT).
Wenn Du eine DataTable an ein DGV bindest

DGV.DataSource = DT

dann wird implizit zur DataTable (DT) eine DataView
erzeugt, welche dann für das DGV die tatsàchliche
DataSource ist.



Nun möchte ich den Datensatz (in der DT) zur selektierten
DGV-Zeile gegen einen anderen Datesatz (DataRow)
austauschen.



Gegen welchen "anderen Datensatz"?
Gegen eine neuen Datensatz oder gegen einen anderen,
bereits in der selben DataTable vorhandenen Datensatz?


folgender Code àndert in der DGV-Anzeige nichts: (alles
bleibt gleich)

Dim dr As DataRow > _myDT.Rows.Find(_myDGV.SelectedRows(0).Cells("ID").Value)



Jetzt enthàlt Deine Variable dr eine Verweis auf den Datensatz,
der im DGV selektiert ist.

dr = newRow



Und jetzt enthàlt Deine Variable dr einen Verweis auf Deinen
Datensatz newRow. Da Deine Variable dr absolut nichts mit
Deinem DataGridView (DGV) zu tun hat, gibt es auch keinen
Grund dafür, dass sich im DGV irgendetwas àndern sollte.


'newRow' ist dabei eine DataRow (identisch zur Struktur
von _myDT) mit anderen Werten


Wie kann man das Problem (Austausch von Zeilen in einer DT)
lösen?



Erst mal wàre es hilfreich, wenn Du Dir die Zusammenhànge
zwischen DataTable, DataView, evtl. noch einem zu DataView
gehörenden CurrencyManager und dem DataGridView bzw.
dessen Eigenschaft DataGridView.DataSource klar machen
würdest. Schau Dir dazu vielleicht mal die div. Beispiele mit dem
DataGridView unter

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

an. Alle diese Beispiele zeigen den Weg von Daten einer
DataTable über eine DataView zu DataGridView.DataSource
und einige dieser Beispiele nutzen auch noch einen Currency-
Manager mit dessen Hilfe eine Navigation innerhalb der Daten-
sàtze einer DataView / DataTable möglich ist.

Hier mal ein Beispiel für Dein oben geschildertes Problem.
Kopiere den ges. Code einfach in ein leeres Formmodul
(Form1.vb).

' /// Code in Formmodul Form1.vb
Public Class Form1
Private WithEvents BtnReplace As Button
Private WithEvents DGV As DataGridView
Private mDT1 As DataTable
Private mDV1 As DataView
Private mCM1 As CurrencyManager
Private mDT2 As DataTable

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

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

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

.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 70)

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

End With
Me.Controls.Add(DGV)

BtnReplace = New Button
With BtnReplace
.SetBounds _
(DGV.Right - 120, _
DGV.Bottom + 10, _
120, 40)

.Font = New Font("Arial", 10)
.Text = "Replace Record"

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

End With
Me.Controls.Add(BtnReplace)

CreateData()

DGV.DataSource = mDV1
DGV.AutoResizeColumns()
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow

' neue DataTable (mDT1) erstellen
mDT1 = New DataTable
With mDT1
' Spalten für mDT1 erstellen
.Columns.Add("ID", GetType(Integer))
.Columns.Add("SText", GetType(String))
.Columns.Add("LText", GetType(String))

' DataTable mDT1 mit Daten füllen
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
End With

' DataView zur DataTable mDT1 erstellen
mDV1 = New DataView(mDT1)

' CurrencyManager zur DataView (mDV1) erstellen
mCM1 = _
DirectCast _
(Me.BindingContext(mDV1), _
CurrencyManager)


' Zweite DataTable (mDT2) mit der
' selben Struktur wie mDT1 erstellen
mDT2 = mDT1.Clone

End Sub

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

Dim i As Integer
Dim DR1 As DataRow
Dim DR2 As DataRow


' Verweis auf den aktuell im DGV
' ausgewàhlten Datensatz holen.
DR1 = DirectCast(mCM1.Current, DataRowView).Row

If mDT2.Rows.Count < 1 Then
' Einen neuen Datensatz in mDT2 erstellen ...
mDT2.Rows.Add(mDT2.NewRow)
End If
' ... den neuen oder bereits vorhandenen
' DS mit neuen Daten füllen.
With mDT2.Rows(0)
.Item(0) = DR1.Item(0)
.Item(1) = Now.Second.ToString
.Item(2) = Format(Now, "HH:mm:ss")
End With

' Verweis auf den in mDT2 stehenden
' Datensatz holen
DR2 = mDT2.Rows(0)

' den in DGV ausgewàhlten Datensatz durch
' den neuen Datensatz aus mDT2 ersetzen.
DR1.ItemArray = DR2.ItemArray
End Sub
End Class
' \\\ E N T E ___________

Programm starten,
irgendeinen Datensatz im DGV auswàhlen,
auf den Button klicken ... usw.

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

Ähnliche fragen