Problem beim Refresh mit Vers 1.3.8.4b
Posted: 06.04.2010, 16:30
Hallo Torsten,
sorry, aber es gibt da noch ein Problem: Wenn ich beim Refresh Datenzeilen lösche, tritt eine Exception auf. Dies ist der Fall, mit der Vers. 1.3.8.4b, welche du mir empfohlen hast, weil dort die automatische Spaltenbreite funktioniert. Mit der alten Version 1.3.8.2 tritt die Exception nicht auf (dafür geht aber die automatische Spaltenbreite nicht). Vielleicht erinnerst du dich: ich wollte die Version 1.3.8.4 zuerst nicht einsetzen, weil ich ein Problem in Erinnerung hatte, welches ich aber nicht mehr benennen konnte. Nun wissen wir's wieder...
Hier die Vers 1382 VOR dem Refresh:
...und NACH dem Refresh:
Wunderbar.
Hier die 1384b VOR dem Refresh (echt klasse, die optimalen Spaltenbreiten)
...und nachher
Hier Informationen für die Exception:
************** Ausnahmetext **************
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei ppsGrid.GridCell.get__CellSpanId()
bei ppsGrid.GridCell.SpanArea()
bei ppsGrid.GridCol.set_Width(Int32 value)
bei ppsGrid.GridCell.AutoWidthItemRemove()
bei ppsGrid.GridCell.AutoSizeRemove()
bei ppsGrid.GridCell.Close()
bei ppsGrid.GridRowCollection.OnRemove(Int32 index, Object value)
bei System.Collections.CollectionBase.RemoveAt(Int32 index)
bei Mis.YoGrid.DeleteDataRows(Int32 iAb, Int32 iAnz) in ...
bei Mis.YoGrid.DeleteAllDataRows() in ...
bei Mis.YoGrid.Clear() in ...
bei Mis.YoGrid.FillViaName(YoSet oSet, Boolean bClear, Boolean bWithChildren) ...
bei Mis.YoBrowse.FuRefresh() in ...
...
************** Geladene Assemblys **************
...
ppsGrid
Assembly-Version: 1.3.8.4.
Win32-Version: 1.3.8.4.
CodeBase: file:///C:/D/Cs/Mis/out/ppsGrid.DLL.
...
Und ein paar Anmerkungen von mir:
- nach dem Drücken des Refresh-Buttons lade ich den Datenset neu und rufe die Methode FuRefresh() meiner Browse-Klasse auf (enthält und verwaltet ToolBar+ppsGrid+ein paar Dinge mehr)
- dort wird die Methode FillViaName(...) meiner Klasse YoGrid aufgerufen. YoGrid "kapselt" quasi ppsGrid.
- in FillViaName(...) wird am Anfang meine Methode Clear() aufgerufen, welche wiederum in DeleteAllDataRows() alle "Datenzeilen" löscht, und zwar von unten nach oben. Konkret bedeutet dies, bei einem 3-zeiligen Grid (eine Headerzeile plus 2 Datenzeilen), dass Row 0 die Header-Zeile ist (die bleibt unangetastet) und zunächst Row 2 und dann Row 1 gelöscht wird. Für das Löschen der Datenzeilen ist die Methode DeleteDataRows(int iAb, int iAnz) zuständig, in diesem 3-Zeilen-Beispiel also mit den Parametern DeleteDataRows(1, 2).
Gut, ist vielleicht nicht der effektivste Weg, hat sich in der Eile irgendwann so ergeben und ist bis jetzt so geblieben. Geht aber echt zackig...
- der betreffende Code in DeleteDataRows(int iAb, int iAnz) lautet:
for (int iRow = iAb+iAnz-1+oPpsGrid.FixedRowCount; iRow >= iAb+oPpsGrid.FixedRowCount; iRow--)
oPpsGrid.Rows.RemoveAt(iRow);
Es knallt beim ersten Aufruf von ...RemoveAt(iRow), im 3-Zeilen-Beispiel wäre dies ...RemoveAt(2)
Wie gesagt, mit 1382 gehts problemlos. Gut, Murphy will ich nicht übergehen, aber ich habe wirklich versucht, alle möglichen Fehler auf meiner Seite auszuschließen.
Was ich noch anfügen möchte: dies ist seit langem mal wieder eine Programmstelle, welche regelmäßige Refreshs erfordern kann. Das Programm soll dringend in den Echt-Betrieb gehen, kommt aber erst jetzt richtig in die Test-Phase. Deswegen ist dieses Verhalten beim Refresh in den letzten 2 Monaten (seit Beginn des Einsatzes der 1384) nicht aufgefallen.
Viele Grüße
Rudi
sorry, aber es gibt da noch ein Problem: Wenn ich beim Refresh Datenzeilen lösche, tritt eine Exception auf. Dies ist der Fall, mit der Vers. 1.3.8.4b, welche du mir empfohlen hast, weil dort die automatische Spaltenbreite funktioniert. Mit der alten Version 1.3.8.2 tritt die Exception nicht auf (dafür geht aber die automatische Spaltenbreite nicht). Vielleicht erinnerst du dich: ich wollte die Version 1.3.8.4 zuerst nicht einsetzen, weil ich ein Problem in Erinnerung hatte, welches ich aber nicht mehr benennen konnte. Nun wissen wir's wieder...
Hier die Vers 1382 VOR dem Refresh:
...und NACH dem Refresh:
Wunderbar.
Hier die 1384b VOR dem Refresh (echt klasse, die optimalen Spaltenbreiten)
...und nachher
Hier Informationen für die Exception:
************** Ausnahmetext **************
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei ppsGrid.GridCell.get__CellSpanId()
bei ppsGrid.GridCell.SpanArea()
bei ppsGrid.GridCol.set_Width(Int32 value)
bei ppsGrid.GridCell.AutoWidthItemRemove()
bei ppsGrid.GridCell.AutoSizeRemove()
bei ppsGrid.GridCell.Close()
bei ppsGrid.GridRowCollection.OnRemove(Int32 index, Object value)
bei System.Collections.CollectionBase.RemoveAt(Int32 index)
bei Mis.YoGrid.DeleteDataRows(Int32 iAb, Int32 iAnz) in ...
bei Mis.YoGrid.DeleteAllDataRows() in ...
bei Mis.YoGrid.Clear() in ...
bei Mis.YoGrid.FillViaName(YoSet oSet, Boolean bClear, Boolean bWithChildren) ...
bei Mis.YoBrowse.FuRefresh() in ...
...
************** Geladene Assemblys **************
...
ppsGrid
Assembly-Version: 1.3.8.4.
Win32-Version: 1.3.8.4.
CodeBase: file:///C:/D/Cs/Mis/out/ppsGrid.DLL.
...
Und ein paar Anmerkungen von mir:
- nach dem Drücken des Refresh-Buttons lade ich den Datenset neu und rufe die Methode FuRefresh() meiner Browse-Klasse auf (enthält und verwaltet ToolBar+ppsGrid+ein paar Dinge mehr)
- dort wird die Methode FillViaName(...) meiner Klasse YoGrid aufgerufen. YoGrid "kapselt" quasi ppsGrid.
- in FillViaName(...) wird am Anfang meine Methode Clear() aufgerufen, welche wiederum in DeleteAllDataRows() alle "Datenzeilen" löscht, und zwar von unten nach oben. Konkret bedeutet dies, bei einem 3-zeiligen Grid (eine Headerzeile plus 2 Datenzeilen), dass Row 0 die Header-Zeile ist (die bleibt unangetastet) und zunächst Row 2 und dann Row 1 gelöscht wird. Für das Löschen der Datenzeilen ist die Methode DeleteDataRows(int iAb, int iAnz) zuständig, in diesem 3-Zeilen-Beispiel also mit den Parametern DeleteDataRows(1, 2).
Gut, ist vielleicht nicht der effektivste Weg, hat sich in der Eile irgendwann so ergeben und ist bis jetzt so geblieben. Geht aber echt zackig...
- der betreffende Code in DeleteDataRows(int iAb, int iAnz) lautet:
for (int iRow = iAb+iAnz-1+oPpsGrid.FixedRowCount; iRow >= iAb+oPpsGrid.FixedRowCount; iRow--)
oPpsGrid.Rows.RemoveAt(iRow);
Es knallt beim ersten Aufruf von ...RemoveAt(iRow), im 3-Zeilen-Beispiel wäre dies ...RemoveAt(2)
Wie gesagt, mit 1382 gehts problemlos. Gut, Murphy will ich nicht übergehen, aber ich habe wirklich versucht, alle möglichen Fehler auf meiner Seite auszuschließen.
Was ich noch anfügen möchte: dies ist seit langem mal wieder eine Programmstelle, welche regelmäßige Refreshs erfordern kann. Das Programm soll dringend in den Echt-Betrieb gehen, kommt aber erst jetzt richtig in die Test-Phase. Deswegen ist dieses Verhalten beim Refresh in den letzten 2 Monaten (seit Beginn des Einsatzes der 1384) nicht aufgefallen.
Viele Grüße
Rudi