AddNew - und ich komm nicht weiter

14/11/2007 - 15:25 von Georg G. | Report spam
Hallo NG,
nicht gleich schlagen. Zur Zeit habe ich ein Problem, welches sicherlich
eine Kleinigkeit für euch ist. Ich bin aber zu dumm.

Um das Problem einfach zu beschreiben:
ich habe eine Microsoft SQL Datenbank und möchte Daten in einem Grid
darstellen, hinzufügen, löschen und àndern. Das funktioniert auch -
teilweise. Der folgende Abschnitt zeigt, wie ich die Datenbindung
schematisch umgesetzt habe:

OdbcDataAdapter.SelectCommand.Connection = <offene DB-Connection>
OdbcDataAdapter.SelectCommand.CommandText = "SELECT ... FROM ..."
OdbcDataAdapter.Fill(DataSet1, "TABELLE")
DataView.Table = DataSet.Tables("TABELLE")
BindingSource.DataSource = DataView
C1FlexGrid.DataSource = BindingSource

Hiernach werden die Daten korrekt im Grid angezeigt. So weit so gut.

Nun möchte ich eine Datenzeile hinzufügen, bestimmte Felder mit
Vorschlagswerten füllen und im Grid den Cursor darauf positionieren.

BindingSource.AddNew()
DataView.Item(BindingSource.Position).Row.Item("MWSTSATZ") = 19
DataView.Item(BindingSource.Position).Row.Item("ROWTYP") = "F"

Wenn ich diesen Code das erste Mal ausführen funktioniert es einwandfrei. Am
Ende der Tabelle wird eine Datenzeile angefügt, in den entsprechenden
Feldern stehen die Vorschlagswerten und der Eingabe Fokus befindet sich
ebenfalls in der letzten Zeile.
Wenn ich aber diesen Code ein zweites Mal ausführe, wird die Zeile am Ende
eingefügt und der Wert von "BindingSource.Position" ist 0, so dass die
Vorschlagswerten die Inhalte der ersten Zeile überschreiben.
Ich habe gedacht, ich würde das in den Griff bekommen, indem ich nach jedem
Einfügen einer Zeile "BindingSource.EndEdit() und
"OdbcDataAdapter.Update(DataView.Table)" ausführe. Leider hatte dies keine
Auswirkung. Ein großes Problem ist, dass der Inhalt der Tabelle sortiert
ist. Das bedeutet, dass eine Zeile nach dem Einfügen und dem Füllen mit den
Vorschlagswerten nicht mehr zwangslàufig am Ende der Tabelle steht.

Nàchster Anlauf:
Ich dachte also das "BindingSource.AddNew()" vielleicht der falsche Weg
hierfür ist. Also:
oRow = DataView.AddNew()
oRow.Item(BindingSource.Position).Row.Item("MWSTSATZ") = 19
oRow.Item(BindingSource.Position).Row.Item("ROWTYP") = "F"

Getestet und siehe da, zumindest das anfügen neuer Datenzeilen funktioniert
jetzt fehlerfrei. Problem nur: der Fokus befindet sich immer in der ersten
Zeile.

Ich bin jetzt so weit, dass ich mit einer Schleife das Grid durchlaufen
werde um die neu eingefügte Zeile zu finden und darauf den Fokus zu setzen.
Aber das kann doch nicht richtig sein?

Wer kann mir sagen wie der korrekte Weg ist, der auch zuverlàssig
funktioniert
vielen Dank für jede Hilfe
Georg G.
 

Lesen sie die antworten

#1 Peter Fleischer
14/11/2007 - 15:51 | Warnen spam
"Georg G." schrieb im Newsbeitrag
news:
Hallo NG,
nicht gleich schlagen. Zur Zeit habe ich ein Problem, welches sicherlich
eine Kleinigkeit für euch ist. Ich bin aber zu dumm.

Um das Problem einfach zu beschreiben:
ich habe eine Microsoft SQL Datenbank und möchte Daten in einem Grid
darstellen, hinzufügen, löschen und àndern. Das funktioniert auch -
teilweise. Der folgende Abschnitt zeigt, wie ich die Datenbindung
schematisch umgesetzt habe:

OdbcDataAdapter.SelectCommand.Connection = <offene DB-Connection>
OdbcDataAdapter.SelectCommand.CommandText = "SELECT ... FROM ..."
OdbcDataAdapter.Fill(DataSet1, "TABELLE")
DataView.Table = DataSet.Tables("TABELLE")
BindingSource.DataSource = DataView



Doppelt gemoppelt:-) BindingSource erzeugt implizit aus DataSource und
DateMember ein DataView-Objekt

Also:

BindingSource.DataSource = DataSet1
BindingSource.DataMember = "TABELLE"

C1FlexGrid.DataSource = BindingSource

Hiernach werden die Daten korrekt im Grid angezeigt. So weit so gut.

Nun möchte ich eine Datenzeile hinzufügen, bestimmte Felder mit
Vorschlagswerten füllen und im Grid den Cursor darauf positionieren.

BindingSource.AddNew()
DataView.Item(BindingSource.Position).Row.Item("MWSTSATZ") = 19
DataView.Item(BindingSource.Position).Row.Item("ROWTYP") = "F"



Warum nicht das DataView-Objekt nutzen, welches im BindingSource-Objekt
gekapselt ist?

Wenn ich diesen Code das erste Mal ausführen funktioniert es einwandfrei.
Am Ende der Tabelle wird eine Datenzeile angefügt, in den entsprechenden
Feldern stehen die Vorschlagswerten und der Eingabe Fokus befindet sich
ebenfalls in der letzten Zeile.
Wenn ich aber diesen Code ein zweites Mal ausführe, wird die Zeile am Ende
eingefügt und der Wert von "BindingSource.Position" ist 0, so dass die
Vorschlagswerten die Inhalte der ersten Zeile überschreiben.



Weil dein Code falsch ist!

Ich habe gedacht, ich würde das in den Griff bekommen, indem ich nach
jedem Einfügen einer Zeile "BindingSource.EndEdit() und
"OdbcDataAdapter.Update(DataView.Table)" ausführe. Leider hatte dies keine
Auswirkung. Ein großes Problem ist, dass der Inhalt der Tabelle sortiert
ist. Das bedeutet, dass eine Zeile nach dem Einfügen und dem Füllen mit
den Vorschlagswerten nicht mehr zwangslàufig am Ende der Tabelle steht.

Nàchster Anlauf:
Ich dachte also das "BindingSource.AddNew()" vielleicht der falsche Weg
hierfür ist. Also:
oRow = DataView.AddNew()
oRow.Item(BindingSource.Position).Row.Item("MWSTSATZ") = 19
oRow.Item(BindingSource.Position).Row.Item("ROWTYP") = "F"

Getestet und siehe da, zumindest das anfügen neuer Datenzeilen
funktioniert jetzt fehlerfrei. Problem nur: der Fokus befindet sich immer
in der ersten Zeile.



Logisch, da für die Bindung ein anderes DataView-Objekt genutzt wird.

Ich bin jetzt so weit, dass ich mit einer Schleife das Grid durchlaufen
werde um die neu eingefügte Zeile zu finden und darauf den Fokus zu
setzen. Aber das kann doch nicht richtig sein?

Wer kann mir sagen wie der korrekte Weg ist, der auch zuverlàssig
funktioniert



Du erhöhst Deine Chance, dass Deine Frage überhaupt gelesen und qualifiziert
und schnell beantwortet wird, wenn Du Deinen Realnamen im Absender
einstellst (Vor- und Zuname).


Viele Gruesse

Peter

Ähnliche fragen