diff --git a/DbFirst.BlazorWasm/Components/CatalogsGrid.razor b/DbFirst.BlazorWasm/Components/CatalogsGrid.razor
index 360d39b..e0ffd4e 100644
--- a/DbFirst.BlazorWasm/Components/CatalogsGrid.razor
+++ b/DbFirst.BlazorWasm/Components/CatalogsGrid.razor
@@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering
@using Microsoft.AspNetCore.Components.Forms
+@using DevExpress.Blazor
@inject CatalogApiClient Api
@inject LayoutApiClient LayoutApi
@inject IJSRuntime JsRuntime
@@ -96,8 +97,7 @@ else
-
-
+
@foreach (var band in bandLayout.Bands)
@@ -211,6 +211,8 @@ else
private bool CanSaveBandLayout => !string.IsNullOrWhiteSpace(layoutUser);
+ private bool gridLayoutApplied;
+
protected override async Task OnInitializedAsync()
{
columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase);
@@ -219,6 +221,16 @@ else
await LoadCatalogs();
}
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null)
+ {
+ gridRef.LoadLayout(bandLayout.GridLayout);
+ gridLayoutApplied = true;
+ await InvokeAsync(StateHasChanged);
+ }
+ }
+
private void SetEditContext(EditContext context)
{
if (editContext == context)
@@ -457,16 +469,10 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage();
- ApplyBandOrderingFromColumnOrder();
UpdateBandOptions();
}
- private async Task SaveBandLayoutAsync()
- {
- await SaveGridLayoutAsync();
- }
-
- private async Task SaveGridLayoutAsync()
+ private async Task SaveLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
{
@@ -485,15 +491,39 @@ else
UserName = layoutUser,
LayoutData = layoutData
});
- infoMessage = "Grid-Layout gespeichert.";
+ infoMessage = "Layout gespeichert.";
errorMessage = null;
}
catch (Exception ex)
{
- errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}";
+ errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}";
}
}
+ private void CaptureColumnLayoutFromGrid()
+ {
+ if (gridRef == null)
+ {
+ return;
+ }
+
+ var layout = gridRef.SaveLayout();
+ bandLayout.GridLayout = layout;
+
+ var orderedColumns = layout.Columns
+ .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
+ .OrderBy(column => column.VisibleIndex)
+ .ToList();
+
+ bandLayout.ColumnOrder = orderedColumns
+ .Select(column => column.FieldName)
+ .ToList();
+
+ bandLayout.ColumnWidths = orderedColumns
+ .Where(column => !string.IsNullOrWhiteSpace(column.Width))
+ .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
+ }
+
private async Task ResetBandLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
@@ -510,17 +540,6 @@ else
private void ApplyColumnLayoutFromStorage()
{
- if (bandLayout.ColumnOrder.Count > 0)
- {
- var ordered = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .Select(field => columnLookup[field])
- .ToList();
-
- ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column)));
- columnDefinitions = ordered;
- }
-
foreach (var column in columnDefinitions)
{
if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width))
@@ -532,30 +551,6 @@ else
columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase);
}
- private void CaptureColumnLayoutFromGrid()
- {
- if (gridRef == null)
- {
- return;
- }
-
- var gridColumns = gridRef.GetColumns()
- .OfType
()
- .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
- .ToList();
-
- bandLayout.ColumnOrder = gridColumns
- .OrderBy(column => column.VisibleIndex)
- .Select(column => column.FieldName)
- .ToList();
-
- bandLayout.ColumnWidths = gridColumns
- .Where(column => !string.IsNullOrWhiteSpace(column.Width))
- .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
-
- ApplyBandOrderingFromColumnOrder();
- }
-
private void ApplyBandOrderingFromColumnOrder()
{
if (bandLayout.ColumnOrder.Count == 0)
@@ -671,6 +666,8 @@ else
{
layout ??= new BandLayout();
layout.Bands ??= new List();
+ layout.ColumnOrder ??= new List();
+ layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var band in layout.Bands)
{
if (string.IsNullOrWhiteSpace(band.Id))
@@ -710,88 +707,15 @@ else
builder.AddAttribute(seq++, "Width", "120px");
builder.CloseComponent();
- var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase);
- var orderedFields = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .ToList();
-
- if (orderedFields.Count == 0)
+ var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
+ foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
{
- var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
- foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
-
- foreach (var band in bandLayout.Bands)
- {
- if (band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
-
- return;
- }
-
- foreach (var fieldName in orderedFields)
- {
- if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band))
- {
- if (!renderedBands.Add(bandId) || band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
- else if (columnLookup.TryGetValue(fieldName, out var column))
- {
- BuildDataColumn(builder, ref seq, column);
- }
- }
-
- foreach (var column in columnDefinitions)
- {
- if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) &&
- (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
+ BuildDataColumn(builder, ref seq, column);
}
foreach (var band in bandLayout.Bands)
{
- if (renderedBands.Contains(band.Id) || band.Columns.Count == 0)
+ if (band.Columns.Count == 0)
{
continue;
}
@@ -856,6 +780,7 @@ else
public List Bands { get; set; } = new();
public List ColumnOrder { get; set; } = new();
public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
+ public GridPersistentLayout? GridLayout { get; set; }
}
private sealed class BandDefinition
diff --git a/DbFirst.BlazorWasm/Components/MassDataGrid.razor b/DbFirst.BlazorWasm/Components/MassDataGrid.razor
index e4d9634..2fcc16b 100644
--- a/DbFirst.BlazorWasm/Components/MassDataGrid.razor
+++ b/DbFirst.BlazorWasm/Components/MassDataGrid.razor
@@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering
@using Microsoft.AspNetCore.Components.Forms
+@using DevExpress.Blazor
@inject MassDataApiClient Api
@inject LayoutApiClient LayoutApi
@inject IJSRuntime JsRuntime
@@ -131,8 +132,7 @@ else
-
-
+
@foreach (var band in bandLayout.Bands)
@@ -353,16 +353,10 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage();
- ApplyBandOrderingFromColumnOrder();
UpdateBandOptions();
}
- private async Task SaveBandLayoutAsync()
- {
- await SaveGridLayoutAsync();
- }
-
- private async Task SaveGridLayoutAsync()
+ private async Task SaveLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
{
@@ -381,15 +375,39 @@ else
UserName = layoutUser,
LayoutData = layoutData
});
- infoMessage = "Grid-Layout gespeichert.";
+ infoMessage = "Layout gespeichert.";
errorMessage = null;
}
catch (Exception ex)
{
- errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}";
+ errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}";
}
}
+ private void CaptureColumnLayoutFromGrid()
+ {
+ if (gridRef == null)
+ {
+ return;
+ }
+
+ var layout = gridRef.SaveLayout();
+ bandLayout.GridLayout = layout;
+
+ var orderedColumns = layout.Columns
+ .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
+ .OrderBy(column => column.VisibleIndex)
+ .ToList();
+
+ bandLayout.ColumnOrder = orderedColumns
+ .Select(column => column.FieldName)
+ .ToList();
+
+ bandLayout.ColumnWidths = orderedColumns
+ .Where(column => !string.IsNullOrWhiteSpace(column.Width))
+ .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
+ }
+
private async Task ResetBandLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
@@ -406,17 +424,6 @@ else
private void ApplyColumnLayoutFromStorage()
{
- if (bandLayout.ColumnOrder.Count > 0)
- {
- var ordered = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .Select(field => columnLookup[field])
- .ToList();
-
- ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column)));
- columnDefinitions = ordered;
- }
-
foreach (var column in columnDefinitions)
{
if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width))
@@ -428,73 +435,6 @@ else
columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase);
}
- private void CaptureColumnLayoutFromGrid()
- {
- if (gridRef == null)
- {
- return;
- }
-
- var gridColumns = gridRef.GetColumns()
- .OfType
()
- .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
- .ToList();
-
- bandLayout.ColumnOrder = gridColumns
- .OrderBy(column => column.VisibleIndex)
- .Select(column => column.FieldName)
- .ToList();
-
- bandLayout.ColumnWidths = gridColumns
- .Where(column => !string.IsNullOrWhiteSpace(column.Width))
- .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
-
- ApplyBandOrderingFromColumnOrder();
- }
-
- private void ApplyBandOrderingFromColumnOrder()
- {
- if (bandLayout.ColumnOrder.Count == 0)
- {
- return;
- }
-
- var bandById = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var orderedBandIds = new List();
- var orderedColumnsByBand = bandLayout.Bands.ToDictionary(
- band => band.Id,
- _ => new List(),
- StringComparer.OrdinalIgnoreCase);
-
- foreach (var field in bandLayout.ColumnOrder)
- {
- if (columnBandAssignments.TryGetValue(field, out var bandId) && bandById.ContainsKey(bandId))
- {
- if (!orderedBandIds.Contains(bandId, StringComparer.OrdinalIgnoreCase))
- {
- orderedBandIds.Add(bandId);
- }
-
- orderedColumnsByBand[bandId].Add(field);
- }
- }
-
- foreach (var band in bandLayout.Bands)
- {
- var orderedColumns = orderedColumnsByBand[band.Id];
- orderedColumns.AddRange(band.Columns.Where(column => !orderedColumns.Contains(column, StringComparer.OrdinalIgnoreCase)));
- band.Columns = orderedColumns;
- }
-
- if (orderedBandIds.Count > 0)
- {
- bandLayout.Bands = orderedBandIds
- .Select(id => bandById[id])
- .Concat(bandLayout.Bands.Where(band => !orderedBandIds.Contains(band.Id, StringComparer.OrdinalIgnoreCase)))
- .ToList();
- }
- }
-
private void AddBand()
{
bandLayout.Bands.Add(new BandDefinition
@@ -581,6 +521,8 @@ else
{
layout ??= new BandLayout();
layout.Bands ??= new List();
+ layout.ColumnOrder ??= new List();
+ layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var band in layout.Bands)
{
if (string.IsNullOrWhiteSpace(band.Id))
@@ -606,88 +548,15 @@ else
builder.AddAttribute(seq++, "Width", "120px");
builder.CloseComponent();
- var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase);
- var orderedFields = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .ToList();
-
- if (orderedFields.Count == 0)
+ var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
+ foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
{
- var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
- foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
-
- foreach (var band in bandLayout.Bands)
- {
- if (band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
-
- return;
- }
-
- foreach (var fieldName in orderedFields)
- {
- if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band))
- {
- if (!renderedBands.Add(bandId) || band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
- else if (columnLookup.TryGetValue(fieldName, out var column))
- {
- BuildDataColumn(builder, ref seq, column);
- }
- }
-
- foreach (var column in columnDefinitions)
- {
- if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) &&
- (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
+ BuildDataColumn(builder, ref seq, column);
}
foreach (var band in bandLayout.Bands)
{
- if (renderedBands.Contains(band.Id) || band.Columns.Count == 0)
+ if (band.Columns.Count == 0)
{
continue;
}
@@ -873,6 +742,7 @@ else
public List Bands { get; set; } = new();
public List ColumnOrder { get; set; } = new();
public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
+ public GridPersistentLayout? GridLayout { get; set; }
}
private sealed class BandDefinition
@@ -934,4 +804,16 @@ else
public int? Value { get; set; }
public string Text { get; set; } = string.Empty;
}
+
+ private bool gridLayoutApplied;
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null)
+ {
+ gridRef.LoadLayout(bandLayout.GridLayout);
+ gridLayoutApplied = true;
+ await InvokeAsync(StateHasChanged);
+ }
+ }
}
diff --git a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor
index 0b108f2..d55ed44 100644
--- a/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor
+++ b/DbFirst.BlazorWebApp/Components/CatalogsGrid.razor
@@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering
@using Microsoft.AspNetCore.Components.Forms
+@using DevExpress.Blazor
@inject CatalogApiClient Api
@inject LayoutApiClient LayoutApi
@inject IJSRuntime JsRuntime
@@ -55,8 +56,7 @@ else
-
-
+
@foreach (var band in bandLayout.Bands)
@@ -394,12 +394,7 @@ else
}
}
- private async Task SaveBandLayoutAsync()
- {
- await SaveGridLayoutAsync();
- }
-
- private async Task SaveGridLayoutAsync()
+ private async Task SaveLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
{
@@ -418,15 +413,39 @@ else
UserName = layoutUser,
LayoutData = layoutData
});
- infoMessage = "Grid-Layout gespeichert.";
+ infoMessage = "Layout gespeichert.";
errorMessage = null;
}
catch (Exception ex)
{
- errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}";
+ errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}";
}
}
+ private void CaptureColumnLayoutFromGrid()
+ {
+ if (gridRef == null)
+ {
+ return;
+ }
+
+ var layout = gridRef.SaveLayout();
+ bandLayout.GridLayout = layout;
+
+ var orderedColumns = layout.Columns
+ .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
+ .OrderBy(column => column.VisibleIndex)
+ .ToList();
+
+ bandLayout.ColumnOrder = orderedColumns
+ .Select(column => column.FieldName)
+ .ToList();
+
+ bandLayout.ColumnWidths = orderedColumns
+ .Where(column => !string.IsNullOrWhiteSpace(column.Width))
+ .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
+ }
+
private async Task LoadBandLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
@@ -449,77 +468,9 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage();
- ApplyBandOrderingFromColumnOrder();
UpdateBandOptions();
}
- private void CaptureColumnLayoutFromGrid()
- {
- if (gridRef == null)
- {
- return;
- }
-
- var gridColumns = gridRef.GetColumns()
- .OfType
()
- .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
- .ToList();
-
- bandLayout.ColumnOrder = gridColumns
- .OrderBy(column => column.VisibleIndex)
- .Select(column => column.FieldName)
- .ToList();
-
- bandLayout.ColumnWidths = gridColumns
- .Where(column => !string.IsNullOrWhiteSpace(column.Width))
- .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
-
- ApplyBandOrderingFromColumnOrder();
- }
-
- private void ApplyBandOrderingFromColumnOrder()
- {
- if (bandLayout.ColumnOrder.Count == 0)
- {
- return;
- }
-
- var bandById = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var orderedBandIds = new List();
- var orderedColumnsByBand = bandLayout.Bands.ToDictionary(
- band => band.Id,
- _ => new List(),
- StringComparer.OrdinalIgnoreCase);
-
- foreach (var field in bandLayout.ColumnOrder)
- {
- if (columnBandAssignments.TryGetValue(field, out var bandId) && bandById.ContainsKey(bandId))
- {
- if (!orderedBandIds.Contains(bandId, StringComparer.OrdinalIgnoreCase))
- {
- orderedBandIds.Add(bandId);
- }
-
- orderedColumnsByBand[bandId].Add(field);
- }
- }
-
- foreach (var band in bandLayout.Bands)
- {
- var orderedColumns = orderedColumnsByBand[band.Id];
- orderedColumns.AddRange(band.Columns.Where(column => !orderedColumns.Contains(column, StringComparer.OrdinalIgnoreCase)));
- band.Columns = orderedColumns;
- }
-
- if (orderedBandIds.Count > 0)
- {
- bandLayout.Bands = orderedBandIds
- .Select(id => bandById[id])
- .Concat(bandLayout.Bands.Where(band => !orderedBandIds.Contains(band.Id, StringComparer.OrdinalIgnoreCase)))
- .ToList();
- }
- }
-
private void AddBand()
{
bandLayout.Bands.Add(new BandDefinition
@@ -592,6 +543,8 @@ else
{
layout ??= new BandLayout();
layout.Bands ??= new List();
+ layout.ColumnOrder ??= new List();
+ layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var band in layout.Bands)
{
if (string.IsNullOrWhiteSpace(band.Id))
@@ -631,88 +584,15 @@ else
builder.AddAttribute(seq++, "Width", "120px");
builder.CloseComponent();
- var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase);
- var orderedFields = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .ToList();
-
- if (orderedFields.Count == 0)
+ var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
+ foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
{
- var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
- foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
-
- foreach (var band in bandLayout.Bands)
- {
- if (band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
-
- return;
- }
-
- foreach (var fieldName in orderedFields)
- {
- if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band))
- {
- if (!renderedBands.Add(bandId) || band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
- else if (columnLookup.TryGetValue(fieldName, out var column))
- {
- BuildDataColumn(builder, ref seq, column);
- }
- }
-
- foreach (var column in columnDefinitions)
- {
- if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) &&
- (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
+ BuildDataColumn(builder, ref seq, column);
}
foreach (var band in bandLayout.Bands)
{
- if (renderedBands.Contains(band.Id) || band.Columns.Count == 0)
+ if (band.Columns.Count == 0)
{
continue;
}
@@ -762,6 +642,7 @@ else
public List Bands { get; set; } = new();
public List ColumnOrder { get; set; } = new();
public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
+ public GridPersistentLayout? GridLayout { get; set; }
}
private sealed class BandDefinition
@@ -825,17 +706,6 @@ else
private void ApplyColumnLayoutFromStorage()
{
- if (bandLayout.ColumnOrder.Count > 0)
- {
- var ordered = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .Select(field => columnLookup[field])
- .ToList();
-
- ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column)));
- columnDefinitions = ordered;
- }
-
foreach (var column in columnDefinitions)
{
if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width))
@@ -846,4 +716,16 @@ else
columnLookup = columnDefinitions.ToDictionary(column => column.FieldName, StringComparer.OrdinalIgnoreCase);
}
+
+ private bool gridLayoutApplied;
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null)
+ {
+ gridRef.LoadLayout(bandLayout.GridLayout);
+ gridLayoutApplied = true;
+ await InvokeAsync(StateHasChanged);
+ }
+ }
}
diff --git a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor
index 3cefaf7..ee73160 100644
--- a/DbFirst.BlazorWebApp/Components/MassDataGrid.razor
+++ b/DbFirst.BlazorWebApp/Components/MassDataGrid.razor
@@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering
@using Microsoft.AspNetCore.Components.Forms
+@using DevExpress.Blazor
@inject MassDataApiClient Api
@inject LayoutApiClient LayoutApi
@inject IJSRuntime JsRuntime
@@ -131,8 +132,7 @@ else
-
-
+
@foreach (var band in bandLayout.Bands)
@@ -353,16 +353,11 @@ else
columnBandAssignments = BuildAssignmentsFromLayout(bandLayout);
ApplyColumnLayoutFromStorage();
- ApplyBandOrderingFromColumnOrder();
+ //ApplyBandOrderingFromColumnOrder();
UpdateBandOptions();
}
- private async Task SaveBandLayoutAsync()
- {
- await SaveGridLayoutAsync();
- }
-
- private async Task SaveGridLayoutAsync()
+ private async Task SaveLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
{
@@ -381,15 +376,39 @@ else
UserName = layoutUser,
LayoutData = layoutData
});
- infoMessage = "Grid-Layout gespeichert.";
+ infoMessage = "Layout gespeichert.";
errorMessage = null;
}
catch (Exception ex)
{
- errorMessage = $"Grid-Layout konnte nicht gespeichert werden: {ex.Message}";
+ errorMessage = $"Layout konnte nicht gespeichert werden: {ex.Message}";
}
}
+ private void CaptureColumnLayoutFromGrid()
+ {
+ if (gridRef == null)
+ {
+ return;
+ }
+
+ var layout = gridRef.SaveLayout();
+ bandLayout.GridLayout = layout;
+
+ var orderedColumns = layout.Columns
+ .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
+ .OrderBy(column => column.VisibleIndex)
+ .ToList();
+
+ bandLayout.ColumnOrder = orderedColumns
+ .Select(column => column.FieldName)
+ .ToList();
+
+ bandLayout.ColumnWidths = orderedColumns
+ .Where(column => !string.IsNullOrWhiteSpace(column.Width))
+ .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
+ }
+
private async Task ResetBandLayoutAsync()
{
if (string.IsNullOrWhiteSpace(layoutUser))
@@ -404,30 +423,6 @@ else
infoMessage = "Band-Layout zurückgesetzt.";
}
- private void CaptureColumnLayoutFromGrid()
- {
- if (gridRef == null)
- {
- return;
- }
-
- var gridColumns = gridRef.GetColumns()
- .OfType
()
- .Where(column => !string.IsNullOrWhiteSpace(column.FieldName))
- .ToList();
-
- bandLayout.ColumnOrder = gridColumns
- .OrderBy(column => column.VisibleIndex)
- .Select(column => column.FieldName)
- .ToList();
-
- bandLayout.ColumnWidths = gridColumns
- .Where(column => !string.IsNullOrWhiteSpace(column.Width))
- .ToDictionary(column => column.FieldName, column => column.Width, StringComparer.OrdinalIgnoreCase);
-
- ApplyBandOrderingFromColumnOrder();
- }
-
private void ApplyBandOrderingFromColumnOrder()
{
if (bandLayout.ColumnOrder.Count == 0)
@@ -473,17 +468,6 @@ else
private void ApplyColumnLayoutFromStorage()
{
- if (bandLayout.ColumnOrder.Count > 0)
- {
- var ordered = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .Select(field => columnLookup[field])
- .ToList();
-
- ordered.AddRange(columnDefinitions.Where(column => !ordered.Contains(column)));
- columnDefinitions = ordered;
- }
-
foreach (var column in columnDefinitions)
{
if (bandLayout.ColumnWidths.TryGetValue(column.FieldName, out var width) && !string.IsNullOrWhiteSpace(width))
@@ -581,6 +565,8 @@ else
{
layout ??= new BandLayout();
layout.Bands ??= new List();
+ layout.ColumnOrder ??= new List();
+ layout.ColumnWidths ??= new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var band in layout.Bands)
{
if (string.IsNullOrWhiteSpace(band.Id))
@@ -606,88 +592,15 @@ else
builder.AddAttribute(seq++, "Width", "120px");
builder.CloseComponent();
- var bandLookup = bandLayout.Bands.ToDictionary(band => band.Id, StringComparer.OrdinalIgnoreCase);
- var renderedBands = new HashSet(StringComparer.OrdinalIgnoreCase);
- var orderedFields = bandLayout.ColumnOrder
- .Where(columnLookup.ContainsKey)
- .ToList();
-
- if (orderedFields.Count == 0)
+ var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
+ foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
{
- var grouped = bandLayout.Bands.SelectMany(band => band.Columns).ToHashSet(StringComparer.OrdinalIgnoreCase);
- foreach (var column in columnDefinitions.Where(column => !grouped.Contains(column.FieldName)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
-
- foreach (var band in bandLayout.Bands)
- {
- if (band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
-
- return;
- }
-
- foreach (var fieldName in orderedFields)
- {
- if (columnBandAssignments.TryGetValue(fieldName, out var bandId) && bandLookup.TryGetValue(bandId, out var band))
- {
- if (!renderedBands.Add(bandId) || band.Columns.Count == 0)
- {
- continue;
- }
-
- builder.OpenComponent(seq++);
- builder.AddAttribute(seq++, "Caption", band.Caption);
- builder.AddAttribute(seq++, "Columns", (RenderFragment)(bandBuilder =>
- {
- var bandSeq = 0;
- foreach (var columnName in band.Columns)
- {
- if (columnLookup.TryGetValue(columnName, out var column))
- {
- BuildDataColumn(bandBuilder, ref bandSeq, column);
- }
- }
- }));
- builder.CloseComponent();
- }
- else if (columnLookup.TryGetValue(fieldName, out var column))
- {
- BuildDataColumn(builder, ref seq, column);
- }
- }
-
- foreach (var column in columnDefinitions)
- {
- if (!orderedFields.Contains(column.FieldName, StringComparer.OrdinalIgnoreCase) &&
- (!columnBandAssignments.TryGetValue(column.FieldName, out var bandId) || !bandLookup.ContainsKey(bandId)))
- {
- BuildDataColumn(builder, ref seq, column);
- }
+ BuildDataColumn(builder, ref seq, column);
}
foreach (var band in bandLayout.Bands)
{
- if (renderedBands.Contains(band.Id) || band.Columns.Count == 0)
+ if (band.Columns.Count == 0)
{
continue;
}
@@ -873,6 +786,7 @@ else
public List Bands { get; set; } = new();
public List ColumnOrder { get; set; } = new();
public Dictionary ColumnWidths { get; set; } = new(StringComparer.OrdinalIgnoreCase);
+ public GridPersistentLayout? GridLayout { get; set; }
}
private sealed class BandDefinition
@@ -934,4 +848,16 @@ else
public int? Value { get; set; }
public string Text { get; set; } = string.Empty;
}
+
+ private bool gridLayoutApplied;
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (!gridLayoutApplied && gridRef != null && bandLayout.GridLayout != null)
+ {
+ gridRef.LoadLayout(bandLayout.GridLayout);
+ gridLayoutApplied = true;
+ await InvokeAsync(StateHasChanged);
+ }
+ }
}