Fix combined view column alignment

This commit is contained in:
dedicraf committed 2026-10-17 13:52:38 +03:00
1 parent fa9ae8ed6f
commit 8fa4a3d7b3
1 file changed
+51 -8
+51 -8
View File
@@ -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<string>(main.Columns);
var mainColumnMap = Enumerable.Range(0, main.Columns.Count).ToArray();
var secondaryColumnMap = new int[sec.Columns.Count];
var matchedSecondaryColumns = new HashSet<int>();
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<string>();
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<string>(), 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;
}
}
}