BindingNavigator AddNew DataRow

04/11/2008 - 09:38 von Frank Kothe | Report spam
hello,
windows-forms-app

um ein grid anzuzeigen arbeite ich mit typisierten datasets

ich habe einen bindingnavigator an eine bindingsource und diese an das
datagridview gehàngt. der bindingnavigator vereinfacht das handling des dgv.

funktioniert alles bis auf das hinzufügen von rows.

folgendes habe ich ausprobiert...

a) hinzufügen einer row direkt über das grid
eigentlich sollte bei neuen zeilen folgende function auftauchen
(dgvDefaultValuesNeeded) und die standardwerte vergeben, dies geschieht aber
nicht...

[code]
Me.dgvMappingConstanten.Rows.Add()

'fehlermeldung:
'System.InvalidOperationException:
'Zeilen können nicht automatisch zur Zeilenauflistung der
'DataGridView hinzugefügt werden, wenn das Steuerelement
'datengebunden ist.
[/code]


b) hinzufügen über die bindigsource
problem:
der DataRowBuilder kann nicht instanziert werden und làuften dann halt als
nothing in einen fehler rein...

[code]
Dim rb As System.Data.DataRowBuilder
Dim row As SchemaDataSet.tbl_MappingConstantenRow = New
SchemaDataSet.tbl_MappingConstantenRow(rb)
row.MappingConst_ID = Guid.NewGuid.ToString
row.CreateDate = DateTime.Now.ToString
row.Name = "<Name>"
row.Beschreibung = "<keine>"
row.ToConstID = getGlobalsGroupsEmpfàngerID
row.FromConstID = getGlobalsGroupsSenderID
Me.dgvMappingConstantenBindingSource.Add(row)
[/code]
 

Lesen sie die antworten

#1 Peter Götz
04/11/2008 - 11:59 | Warnen spam
Hallo Frank,

um ein grid anzuzeigen arbeite ich mit typisierten datasets



Heisst das im Klartext, dass Du irgendwelche Daten in
einem DataGridView anzeigen möchtest?

ich habe einen bindingnavigator an eine bindingsource
und diese an das datagridview gehàngt.



Das hört sich an, als wolltest Du Deine 2 Frühstücksbrötchen
mit einem 20-Tonner vom Bàcker holen.
Wenn Du Daten in einem DGV anzeigen willst, packe diese
Daten in eine DataTable, erstelle zu dieser eine DataView
und übergib Deiner DataGridView.DataSource einen
Verweis auf diese DataView.

Das nachfolgende Beispiel füllt eine DataTable (mDT) mit
Daten, erstellt dazu eine DataView (mDV) und bindet ein
DataGridView (DGV) an diese DataView (mDV).

' /// Code in einer leeren Form
Public Class Form1
Private WithEvents DGV As DataGridView
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

DGV = New DataGridView
DGV.Dock = DockStyle.Fill
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))
With .Columns(0)
.Unique = True
.AutoIncrement = True
.AutoIncrementSeed = 1
.AutoIncrementStep = 1
.ReadOnly = True
End With
.Columns.Add("SText", GetType(String))
.Columns.Add("LText", GetType(String))

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

mDV = New DataView(mDT)
End Sub

Private Sub DGV_DataError _
(ByVal sender As Object, _
ByVal e As DataGridViewDataErrorEventArgs _
) Handles DGV.DataError

MsgBox(e.Exception.Message, MsgBoxStyle.Exclamation)
e.Cancel = True
End Sub

Private Sub DGV_RowValidating _
(ByVal sender As Object, _
ByVal e As DataGridViewCellCancelEventArgs _
) Handles DGV.RowValidating

Dim DRV As DataRowView
DRV = mDV(e.RowIndex)
Select Case True
Case DRV.IsEdit, DRV.IsNew
If DataOK(DRV) Then
DRV.EndEdit()
Else
e.Cancel = True
End If
End Select
End Sub

Private Sub DGV_Validating _
(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs _
) Handles DGV.Validating

Dim i As Integer
Dim DT As DataTable = mDT.GetChanges
Dim strBuffer As String = "RowStates"

For i = 0 To mDT.Rows.Count - 1
strBuffer &= ControlChars.CrLf
strBuffer &= _
"Row " & i.ToString & ": " & _
mDT.Rows(i).RowState.ToString
Next
MsgBox(strBuffer, MsgBoxStyle.Information)
End Sub

Private Function DataOK _
(ByVal DRV As DataRowView _
) As Boolean

' In dieser Function Felder des Datensatzes
' auf formale Richtigkeit u. Plausibilitàt prüfen.

Dim Ret As Boolean = True
Select Case True
Case DRV.Item(1) Is DBNull.Value
MsgBox _
("Spalte 1 darf nicht leer sein!", _
MsgBoxStyle.Exclamation)

Ret = False

Case DRV.Item(1).ToString.Length > 3
MsgBox _
("Text in Spalte 1 max. 3 Zeichen!", _
MsgBoxStyle.Exclamation)
Ret = False
End Select

Return Ret
End Function
End Class
' \\\ ______ E N T E ________

der bindingnavigator vereinfacht das handling des dgv.



Was soll der denn beim DataGridView konkret
vereinfachen?
Mit dem DataGridView hast Du doch bereits ein
Control zum Navigieren.

funktioniert alles bis auf das hinzufügen von rows.



Wenn Du ein DataGridView an eine DataTable/DataView
gebunden hast, dann wird eine neue Row automatisch
erzeugt, wenn Du im DGV in die "neue Zeile" schreibst
(s.Beispiel oben).

Schau Dir dazu auch mal

www.gssg.de -> Visual Basic -> VB.net
-> DataTable / DataView, RowState

und auch die übrigen Beispiele zum DataGridView an.

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

Ähnliche fragen