From 8fa4a3d7b317ba7d1effce5660471211fc94a0d3 Mon Sep 17 00:00:00 2001 From: Dedicraf Date: Sat, 17 Oct 2026 13:52:38 +0300 Subject: [PATCH] Fix combined view column alignment --- MainWindow.cs | 59 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/MainWindow.cs b/MainWindow.cs index 9fbe282..25eeefa 100644 --- a/MainWindow.cs +++ b/MainWindow.cs @@ -1081,16 +1081,59 @@ private Control BuildFilePanel(TextBox tb, Button browse, ComboBox cb, StackPane break; default: - headers = main.Columns; - foreach (var r in result.Matches) data.Add(r); + // Build a union of both schemas. Columns with the same header are + // aligned; B-only columns get their own position in the result. + headers = new List(main.Columns); + var mainColumnMap = Enumerable.Range(0, main.Columns.Count).ToArray(); + var secondaryColumnMap = new int[sec.Columns.Count]; + var matchedSecondaryColumns = new HashSet(); + + for (int b = 0; b < sec.Columns.Count; b++) + { + int matchingMain = -1; + for (int a = 0; a < main.Columns.Count; a++) + { + if (!matchedSecondaryColumns.Contains(a) && + string.Equals(main.Columns[a].Trim(), sec.Columns[b].Trim(), StringComparison.OrdinalIgnoreCase)) + { + matchingMain = a; + break; + } + } + + if (matchingMain >= 0) + { + secondaryColumnMap[b] = matchingMain; + matchedSecondaryColumns.Add(matchingMain); + } + else + { + var header = sec.Columns[b]; + if (headers.Contains(header, StringComparer.OrdinalIgnoreCase)) + header = $"B: {header}"; + secondaryColumnMap[b] = headers.Count; + headers.Add(header); + } + } + + string[] CombineRows(string[] rowA, string[] rowB) + { + var combined = new string[headers.Count]; + Array.Fill(combined, ""); + for (int a = 0; a < mainColumnMap.Length && a < rowA.Length; a++) + combined[mainColumnMap[a]] = rowA[a]; + for (int b = 0; b < secondaryColumnMap.Length && b < rowB.Length; b++) + combined[secondaryColumnMap[b]] = rowB[b]; + return combined; + } + + foreach (var pair in result.Pairs) + data.Add(CombineRows(pair.RowA, pair.RowB)); sources = new List(); - foreach (var _ in result.Matches) sources.Add("A"); + foreach (var _ in result.Pairs) sources.Add("A+B"); foreach (var r in result.OnlySecondary) { - var row = new string[main.Columns.Count]; - Array.Fill(row, ""); - for (int c = 0; c < row.Length && c < r.Length; c++) row[c] = r[c]; - data.Add(row); + data.Add(CombineRows(Array.Empty(), r)); sources.Add("B"); } break; @@ -1321,4 +1364,4 @@ private Control BuildFilePanel(TextBox tb, Button browse, ComboBox cb, StackPane _lblStatus.Text = message; _lblStatus.Foreground = isError ? Ui.Danger : Ui.Success; } -} \ No newline at end of file +}