Fix combined view column alignment
This commit is contained in:
1 parent
fa9ae8ed6f
commit
f5b659061c
1 file changed
+51
-8
+51
-8
@@ -1081,16 +1081,59 @@ private Control BuildFilePanel(TextBox tb, Button browse, ComboBox cb, StackPane
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
headers = main.Columns;
|
// Build a union of both schemas. Columns with the same header are
|
||||||
foreach (var r in result.Matches) data.Add(r);
|
// 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>();
|
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)
|
foreach (var r in result.OnlySecondary)
|
||||||
{
|
{
|
||||||
var row = new string[main.Columns.Count];
|
data.Add(CombineRows(Array.Empty<string>(), r));
|
||||||
Array.Fill(row, "");
|
|
||||||
for (int c = 0; c < row.Length && c < r.Length; c++) row[c] = r[c];
|
|
||||||
data.Add(row);
|
|
||||||
sources.Add("B");
|
sources.Add("B");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1321,4 +1364,4 @@ private Control BuildFilePanel(TextBox tb, Button browse, ComboBox cb, StackPane
|
|||||||
_lblStatus.Text = message;
|
_lblStatus.Text = message;
|
||||||
_lblStatus.Foreground = isError ? Ui.Danger : Ui.Success;
|
_lblStatus.Foreground = isError ? Ui.Danger : Ui.Success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user