DataView.dbEditMode gesucht :-)

03/03/2010 - 11:36 von Sven Thierfelder | Report spam
Hi Alle,

im DAO-Recordset hatte ich die Möglichkeit per rs.dbEditMode herauszufinden
ob gerade Änderungen durchgeführt werden ... neue Eintràge/Ändern von
Eintràgen.

Unter .Net macht man sowas ja dann mit DataViews und das funktioniert
soweit auch ganz gut, doch jetzt bin ich an einer Stelle angelangt, da
müsste ich abfragen können ob aktuell ein DataView.AddNew() "làuft" um dies
z.B. abbrechen zu können.
Nun ist es aber so, dass man hierzu den Index der Zeile benötigt. Bei einem
Edit ist das ja kein Problem, das weiß ich auf welcher Zeile ich grad bin,
doch bei einer neue Zeile habe ich nur die DataRowView.
Helfen würde also entweder eine Möglichkeit das DataView ohne Index zu
befragen, oder den Index der neue Zeile zu erfahren.

Anders müsste ich wohl eine global DataRowView anlegen und abfragen ob die
grad isNew ist.
Oder sehe ich mal wieder den Wald vor lauter Bàumen nicht?

Gruß Sven
 

Lesen sie die antworten

#1 Peter Götz
03/03/2010 - 13:47 | Warnen spam
Hallo Sven,

im DAO-Recordset hatte ich die Möglichkeit per
rs.dbEditMode herauszufinden ob gerade Änderungen
durchgeführt werden ... neue Eintràge/Ändern von
Eintràgen.

Unter .Net macht man sowas ja dann mit DataViews



erst mal eher mit DataTables zu denen man dann bei
Bedarf entsprechende DataViews erstellt.

und das funktioniert soweit auch ganz gut, doch jetzt
bin ich an einer Stelle angelangt, da müsste ich
abfragen können ob aktuell ein DataView.AddNew()
"làuft" um dies z.B. abbrechen zu können.
Nun ist es aber so, dass man hierzu den Index der Zeile
benötigt.



Diesen, bzw. einen Verweis auf die jeweils aktuelle
DataRowView kann Dir ein CurrencyManager liefern.


Bei einem Edit ist das ja kein Problem, das weiß ich
auf welcher Zeile ich grad bin, doch bei einer neue
Zeile habe ich nur die DataRowView.



Und eben diese DataRowView hat u.a. die Eigenschaften
DRV.isEdit und DRV.isNew.

Helfen würde also entweder eine Möglichkeit das DataView
ohne Index zu befragen, oder den Index der neue Zeile zu
erfahren.



s.oben:
Der CurrencyManager liefert Dir in CurrencyManager.Current
einen Verweis auf die gerade akt. DataRowView.



Anders müsste ich wohl eine global DataRowView anlegen
und abfragen ob die grad isNew ist.
Oder sehe ich mal wieder den Wald vor lauter Bàumen nicht?



Schau Dir mal das nachfolgende Beispiel an, damit
sollten die Bàume dann schon etwas weniger werden.


' /// Code in einem leeren Formmodul (Form1.vb)
Public Class Form1
Private WithEvents DGV As DataGridView
Private WithEvents mCM As CurrencyManager
Private WithEvents mDT As DataTable
Private WithEvents mDV As DataView

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

CreateControls()
End Sub

Private Sub CreateControls()
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 - 20)

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

CreateData()

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

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

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

.Columns.Add("SName", GetType(String))
.Columns.Add("LName", GetType(String))

For i = 1 To 5
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_CurrentChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mCM.CurrentChanged

ShowCurrentRow()
End Sub

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

'ShowCurrentRow()
End Sub

Private Sub ShowCurrentRow()
Dim DRV As DataRowView = _
DirectCast(mCM.Current, DataRowView)

Dim ID As String = DRV.Item(0).ToString
Dim EditMode As String = ""

If DRV.IsNew Then
ID = "_ "
EditMode &= "New;"
End If
If DRV.IsEdit Then
EditMode &= "Edit;"
End If

Me.Text = _
ID & " | " & DRV.Item(1).ToString & _
" | " & DRV.Item(2).ToString & _
" : " & EditMode

End Sub
End Class
\\\ E N T E

Nach dem Programmstart siehst Du bei jedem Datensatzwechsel
in der Form-Titelzeile den Inhalt der gerade aktuellen Zeile sowie
deren Zustand "Edit" und/oder "New".


Ein BindingSource-Objekt liefert in seiner Eigenschaft
.CurrencyManager ebenfalls einen Currencymanager
und die Eigenschaft BindingSource.Current liefert wie
wie CurrencyManagerCurrent ebenfalls einen Verweis
auf die gerade akt. DataRowView.

Mehr zu DataTable, DataView u. CurrencyManager
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