Laden...

Neue Zeile im Datagrid

Erstellt von eddieromm vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.136 Views
E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren
Neue Zeile im Datagrid

Hallo Leute,

ich hab da ein kleines Problem mit meinen Datagrid.

Und zwar hab ich dem Datagrid als DataSource eine Datatable zugeordnet.
Das funkt bis dort hin alles prima, nur wenn man jetzt in das Datagrid reinklickt, wird eine Zeile angelegt, die ich aber erstmal nicht über den Index ansprechen kann.
Erst wenn ich noch eine Zeile anlege, kann ich wieder in die erste zurück und da was machen. (mit der zweiten Zeile ist dasselbe, erst noch eine usw.....)

Ich hab die ganze Zeit versucht das anlegen von der neuen Zeile irgendwie abzufangen,
damit ich diese in die Rows-Auflistung manuell einfügen kann, hab aber nix gefunden. Weder bei dem Datagrid noch bei der Datatable.

Wie wird das eigentlich sonst gemacht, ich kann doch nicht der einzige sein der das Problem hat?
Kann man das irgendwie anders lösen, als mit der Datatable?

F
529 Beiträge seit 2003
vor 19 Jahren

Ich bin mir zwar nicht 100% sicher, dass du das meinst was ich meine, aber versuch mal das:
Fang doch einfach den OnDataChange-Event der DataTable ab und verhindere, dass ein leerer Row in die DataTable kommt.....

Besuchen sie das VisualC++ - Forum

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren

Ne ne, das Problem ist nicht, dass eine neue Zeile angelegt wird sondern das, wenn ne neue Zeile angelegt wurde kann ich aus dem Code nicht z.B. sowas machen.


DataGridCell	cell = this.datagrid.CurrentCell;
DataRow row = this.datatable.Rows[cell.RowNumber];

Und da wo die ich die Rows über den Index anspreche, da kommt der Fehler.
Erst wenn ich ne neue Zeile drunter anlege, würde das funken.

257 Beiträge seit 2004
vor 19 Jahren

Das liegt einfach daran das das DataGrid über den BindingContext eine neue Zeile
anlegt. Diese Zeile wird aber erst in die Rows-Collection geschrieben wenn für den
BindingContext EndCurrentEdit aufgerufen wird. Dies wird intern vom DataGrid
aufgerufen sobald man die Zeile verlässt die man bearbeitet hat. Du kannst dir
einen EventHandler auf das PositionChanged Ereignis des BindingContext setzen
und in diesem Prüfen ob es sich um eine neue Zeile handelt. Hier hast du dann die
Möglichkeit die Zeile zu initialisieren und EndCurrentEdit aufzurufen um die neue
Zeile in die Rows-Collection zu übernehmen.

Viele Grüße

Roland

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren

Das klingt auf jeden Fall nachvollziehbar, ich werd es gleich ausprobieren.
Danke!

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren

Hmm...

Irgendwie finde ich das Erreignis nicht.

Bei BindingContext des DataGrid´s gibt es nur ein Erreignis und das ist CollectionChanged. Das ist aber geschützt.

Dieser Member unterstützt die .NET Framework-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code gedacht.

Wo finde ich das PositionChanged Erreignis?
Schon bei dem DataGrid, oder?

Eigentlich ist es genau das, was ich die ganze Zeit gesucht habe, ein Erreignis, was mir verrät, dass eine neue Zeile angelegt wird.

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren

OK, das Erreignis ist aufgetaucht.


BindingManagerBase myBase = this.datagrid.BindingContext[this.datagrid.DataSource, this.datagrid.DataMember];
myBase.PositionChanged += new EventHandler(myBase_PositionChanged);

Jetzt die nächste Frage.
Wie finde ich heraus ob es sich um eine neue Zeile handelt?
Ich hab es so versucht:


if( this.datagrid.EndEdit( null, this.datagrid.CurrentRowIndex, false ) )  
	myBase.EndCurrentEdit();

aber das funkt nicht so richtig.

257 Beiträge seit 2004
vor 19 Jahren

Du kannst dir mit


DataRowView drv = (DataRowView)this.BindingContext[this.dataGrid1.DataSource].Current;
if(drv.Row.RowState == DataRowState.Detached)
{
    // Initialisieren
}

die Zeile direkt in eine DataRowView holen und dann prüfen ob die Zeile neu ist.

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 19 Jahren

Ich hab jetzt die selbe Abfrage genommen, mit einen ! vorne dran, dann geht´s auch.


if(! this.datagrid.EndEdit( null, this.datagrid.CurrentRowIndex, false ) )  
	myBase.EndCurrentEdit();

aber ich werd das mal so versuchen, wie du das geschrieben hast.

Danke schon mal, hast mir sehr geholfen.

257 Beiträge seit 2004
vor 19 Jahren

Kein Problem, das mache ich doch gerne. Mir wurde hier auch schon sehr viel geholfen! 🙂