Zusammenfassung
TableRenderer.GetMinMergedCell(int row) wirft eine InvalidOperationException mit der Meldung GetMinMergedCell: Unexpected problem #1, sobald eine Tabellenzelle alle Spalten (MergeRight = columnCount - 1) und mehr als eine Zeile (MergeDown >= 1) überspannt.
Ursache
// TableRenderer.cs – GetMinMergedCell (betroffene Logik)
var resultRowIndex = row; // ← immer == row
var resultRow = _table.Rows[resultRowIndex];
for (int idx = 0; idx < clsCount; idx++)
{
var cell = resultRow[idx];
if (resultRowIndex + cell.MergeDown == row) // ← vereinfacht: MergeDown == 0
{
if (!_mergedCells.Contains(cell)) continue;
return cell;
}
}
throw new InvalidOperationException("GetMinMergedCell: Unexpected problem #1");
Die Bedingung resultRowIndex + MergeDown == row ist äquivalent zu MergeDown == 0. Wenn eine einzige Ursprungszelle alle Spalten belegt (MergeRight = 7) und mehrere Zeilen überspannt (MergeDown = 1), gibt es keine Zelle in der Zeile, die die Bedingung erfüllt:
- Die Ursprungszelle (Spalte 0) ist in
_mergedCells, hat aber MergeDown = 1 -> Bedingung schlägt fehl.
- Alle anderen Zellen (Spalten 1–7) sind nicht in
_mergedCells (sie sind durch den Merge verdeckt) -> Contains() lehnt sie ab.
Die ursprüngliche Debug-Only-Implementierung GetMinMergedCellOriginal() behandelt diesen Fall korrekt, indem sie nach der Zelle mit dem kleinsten MergeDown-Wert sucht (der auch > 0 sein kann). Der Fehler entstand, als der auskommentierte _minMergedCellRowMap[row]-Lookup durch den Literalwert row ersetzt wurde, ohne die darauf folgende MergeDown == 0-Anforderung anzupassen.
Betroffene Versionen
| Version |
Ergebnis |
PDFsharp-MigraDoc-GDI 6.2.4 (NuGet.org) |
Wirft InvalidOperationException |
PDFsharp-MigraDoc-GDI 6.2.4-fixTableMergeAllColumnsBug |
Funktioniert korrekt |
Reproduktion
TableMergeAllColumnsRepro.zip
# 1. Mit PDFsharp-MigraDoc-GDI 6.2.4 von NuGet.org bauen
dotnet run -c Release
# 2. Wirft InvalidOperationException "GetMinMergedCell: Unexpected problem #1"
# 3. Mit Fix bauen (6.2.4-fixTableMergeAllColumnsBug aus lokalem nuget-local Feed)
dotnet run -c Release -p:PdfSharpVersion=6.2.4-fixTableMergeAllColumnsBug
# 4. "output.pdf" wird erfolgreich erstellt
Fix
In TableRenderer.GetMinMergedCell() eine Fallback-Loop hinzufügen, die, wenn der erste Durchlauf kein Ergebnis liefert, die Zelle mit dem kleinsten MergeDown-Wert zurückgibt. Das entspricht dem Verhalten von GetMinMergedCellOriginal().
// Fallback: all cells in this row begin multi-row spans (MergeDown > 0),
// so no cell satisfies resultRowIndex + MergeDown == row above. Find the
// cell with the minimum MergeDown instead (matches GetMinMergedCellOriginal).
int minMergeDown = int.MaxValue;
Cell? minCell = null;
for (int idx = 0; idx < clsCount; idx++)
{
var cell = resultRow[idx];
if (!_mergedCells.Contains(cell)) continue;
if (cell.MergeDown < minMergeDown)
{
minMergeDown = cell.MergeDown;
minCell = cell;
if (minMergeDown == 0) break;
}
}
if (minCell is not null)
return minCell;
Zusammenfassung
TableRenderer.GetMinMergedCell(int row)wirft eineInvalidOperationExceptionmit der MeldungGetMinMergedCell: Unexpected problem #1, sobald eine Tabellenzelle alle Spalten (MergeRight = columnCount - 1) und mehr als eine Zeile (MergeDown >= 1) überspannt.Ursache
Die Bedingung
resultRowIndex + MergeDown == rowist äquivalent zuMergeDown == 0. Wenn eine einzige Ursprungszelle alle Spalten belegt (MergeRight = 7) und mehrere Zeilen überspannt (MergeDown = 1), gibt es keine Zelle in der Zeile, die die Bedingung erfüllt:_mergedCells, hat aberMergeDown = 1-> Bedingung schlägt fehl._mergedCells(sie sind durch den Merge verdeckt) ->Contains()lehnt sie ab.Die ursprüngliche Debug-Only-Implementierung
GetMinMergedCellOriginal()behandelt diesen Fall korrekt, indem sie nach der Zelle mit dem kleinstenMergeDown-Wert sucht (der auch > 0 sein kann). Der Fehler entstand, als der auskommentierte_minMergedCellRowMap[row]-Lookup durch den Literalwertrowersetzt wurde, ohne die darauf folgendeMergeDown == 0-Anforderung anzupassen.Betroffene Versionen
PDFsharp-MigraDoc-GDI 6.2.4(NuGet.org)InvalidOperationExceptionPDFsharp-MigraDoc-GDI 6.2.4-fixTableMergeAllColumnsBugReproduktion
TableMergeAllColumnsRepro.zip
Fix
In
TableRenderer.GetMinMergedCell()eine Fallback-Loop hinzufügen, die, wenn der erste Durchlauf kein Ergebnis liefert, die Zelle mit dem kleinstenMergeDown-Wert zurückgibt. Das entspricht dem Verhalten vonGetMinMergedCellOriginal().