Skip to content

Commit 53c6d9b

Browse files
refactored Grid_CustomizeContextMenu()
1 parent 932cd7d commit 53c6d9b

2 files changed

Lines changed: 116 additions & 127 deletions

File tree

CS/GridWithContextMenu/Data/GridContextMenuHelper.cs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,5 +283,114 @@ static bool IsRowMenuItemEnabled(GridCustomizeElementEventArgs e, GridContextMen
283283
}
284284
return false;
285285
}
286+
287+
public static void CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) {
288+
if (args.Context is GridDataRowCommandContext rowContext) AddRowItems(args, rowContext);
289+
290+
if (args.Context is GridHeaderCommandContext headerContext) AddHeaderItems(args, headerContext);
291+
292+
if (args.Context is GridFooterCommandContext footerContext) AddFooterItems(args, footerContext);
293+
}
294+
295+
private static void AddRowItems(GridCustomizeContextMenuEventArgs args, GridDataRowCommandContext rowContext) {
296+
var update = (IGridCommandContext c, Action t) => {
297+
c.Grid.BeginUpdate();
298+
t();
299+
c.Grid.EndUpdate();
300+
};
301+
var updateAsync = async (IGridCommandContext c, Task t) => {
302+
c.Grid.BeginUpdate();
303+
await t;
304+
c.Grid.EndUpdate();
305+
};
306+
307+
if (rowContext.Grid.IsEditing()) {
308+
var saveEdit = args.Items.AddCustomItem("Save", async () =>
309+
await updateAsync(rowContext, rowContext.Grid.SaveChangesAsync()));
310+
saveEdit.IconCssClass = "grid-context-menu-item-edit-row";
311+
312+
var cancelEdit = args.Items.AddCustomItem("Cancel", async () =>
313+
await updateAsync(rowContext, rowContext.Grid.CancelEditAsync()));
314+
cancelEdit.IconCssClass = "grid-context-menu-item-delete-row";
315+
}
316+
var newRow = args.Items.AddCustomItem("New", async () =>
317+
await updateAsync(rowContext, rowContext.Grid.StartEditNewRowAsync()));
318+
newRow.IconCssClass = "grid-context-menu-item-new-row";
319+
newRow.BeginGroup = true;
320+
321+
var editRow = args.Items.AddCustomItem("Edit", async () =>
322+
await updateAsync(rowContext, rowContext.Grid.StartEditRowAsync(rowContext.RowVisibleIndex)));
323+
editRow.IconCssClass = "grid-context-menu-item-edit-row";
324+
325+
var deleteRow = args.Items.AddCustomItem("Delete", () =>
326+
update(rowContext, () => rowContext.Grid.ShowRowDeleteConfirmation(rowContext.RowVisibleIndex)));
327+
deleteRow.IconCssClass = "grid-context-menu-item-delete-row";
328+
}
329+
private static void AddHeaderItems(GridCustomizeContextMenuEventArgs args, GridHeaderCommandContext headerContext) {
330+
var update = (IGridCommandContext c, Action t) => {
331+
c.Grid.BeginUpdate();
332+
t();
333+
c.Grid.EndUpdate();
334+
};
335+
var updateAsync = async (IGridCommandContext c, Task t) => {
336+
c.Grid.BeginUpdate();
337+
await t;
338+
c.Grid.EndUpdate();
339+
};
340+
341+
var isFilterRowVisible = headerContext.Grid.ShowFilterRow != false;
342+
var newFilterRowState = isFilterRowVisible ? false : true;
343+
var filterRow = args.Items.AddCustomItem("Filter Row", () =>
344+
update(headerContext, () => headerContext.Grid.ShowFilterRow = newFilterRowState));
345+
filterRow.IconCssClass = "grid-context-menu-item-filter-row";
346+
filterRow.CssClass = isFilterRowVisible ? "menu-item-selected" : "";
347+
348+
var isFiltered = headerContext.Grid.GetFilterCriteria() != null;
349+
var clearFilter = args.Items.AddCustomItem("Clear Filter", () =>
350+
update(headerContext, () => headerContext.Grid.ClearFilter()));
351+
clearFilter.IconCssClass = "grid-context-menu-item-clear-filter";
352+
clearFilter.Enabled = isFiltered ? true : false;
353+
354+
var isFooterVisible = headerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Always
355+
|| headerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Auto && headerContext.Grid.GetTotalSummaryItems().Count > 0;
356+
var newFooterState = isFooterVisible ? GridFooterDisplayMode.Never : GridFooterDisplayMode.Always;
357+
var footer = args.Items.AddCustomItem("Footer", () =>
358+
update(headerContext, () => headerContext.Grid.FooterDisplayMode = newFooterState));
359+
footer.IconCssClass = "grid-context-menu-item-footer";
360+
footer.CssClass = isFooterVisible ? "menu-item-selected" : "";
361+
362+
var fixLeft = args.Items.AddCustomItem("Fix Column to the Left", () =>
363+
update(headerContext, () => headerContext.Column.FixedPosition = GridColumnFixedPosition.Left));
364+
fixLeft.IconCssClass = "grid-context-menu-item-fix-column-left";
365+
fixLeft.BeginGroup = true;
366+
367+
var fixRight = args.Items.AddCustomItem("Fix Column to the Right", () =>
368+
update(headerContext, () => headerContext.Column.FixedPosition = GridColumnFixedPosition.Right));
369+
fixRight.IconCssClass = "grid-context-menu-item-fix-column-right";
370+
371+
var unfix = args.Items.AddCustomItem("Unfix Column", () =>
372+
update(headerContext, () => headerContext.Column.FixedPosition = GridColumnFixedPosition.None));
373+
unfix.IconCssClass = "grid-context-menu-item-unfix-column";
374+
}
375+
private static void AddFooterItems(GridCustomizeContextMenuEventArgs args, GridFooterCommandContext footerContext) {
376+
var update = (IGridCommandContext c, Action t) => {
377+
c.Grid.BeginUpdate();
378+
t();
379+
c.Grid.EndUpdate();
380+
};
381+
var updateAsync = async (IGridCommandContext c, Task t) => {
382+
c.Grid.BeginUpdate();
383+
await t;
384+
c.Grid.EndUpdate();
385+
};
386+
387+
var isFooterVisible = footerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Always
388+
|| footerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Auto && footerContext.Grid.GetTotalSummaryItems().Count > 0;
389+
var newFooterState = isFooterVisible ? GridFooterDisplayMode.Never : GridFooterDisplayMode.Always;
390+
var footer = args.Items.AddCustomItem("Footer", () =>
391+
update(footerContext, () => footerContext.Grid.FooterDisplayMode = newFooterState));
392+
footer.IconCssClass = "grid-context-menu-item-footer";
393+
footer.CssClass = isFooterVisible ? "menu-item-selected" : "";
394+
}
286395
}
287396
}

CS/GridWithContextMenu/Pages/Index.razor

Lines changed: 7 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -58,116 +58,8 @@
5858
protected override async Task OnInitializedAsync() {
5959
GridData = await ForecastService.GetForecastAsync();
6060
}
61-
void Grid_CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) {
62-
if (args.Context is GridDataRowCommandContext rowContext) {
63-
if (rowContext.Grid.IsEditing()) {
64-
var saveEdit = args.Items.AddCustomItem("Save", async () => {
65-
rowContext.Grid.BeginUpdate();
66-
await rowContext.Grid.SaveChangesAsync();
67-
rowContext.Grid.EndUpdate();
68-
});
69-
saveEdit.IconCssClass = "grid-context-menu-item-edit-row";
70-
71-
var cancelEdit = args.Items.AddCustomItem("Cancel", async () => {
72-
rowContext.Grid.BeginUpdate();
73-
await rowContext.Grid.CancelEditAsync();
74-
rowContext.Grid.EndUpdate();
75-
});
76-
cancelEdit.IconCssClass = "grid-context-menu-item-delete-row";
77-
}
78-
var newRow = args.Items.AddCustomItem("New", async () => {
79-
rowContext.Grid.BeginUpdate();
80-
await rowContext.Grid.StartEditNewRowAsync();
81-
rowContext.Grid.EndUpdate();
82-
});
83-
newRow.IconCssClass = "grid-context-menu-item-new-row";
84-
newRow.BeginGroup = true;
85-
86-
var editRow = args.Items.AddCustomItem("Edit", async () => {
87-
rowContext.Grid.BeginUpdate();
88-
await rowContext.Grid.StartEditRowAsync(rowContext.RowVisibleIndex);
89-
rowContext.Grid.EndUpdate();
90-
});
91-
editRow.IconCssClass = "grid-context-menu-item-edit-row";
92-
93-
var deleteRow = args.Items.AddCustomItem("Delete", () => {
94-
rowContext.Grid.BeginUpdate();
95-
rowContext.Grid.ShowRowDeleteConfirmation(rowContext.RowVisibleIndex);
96-
rowContext.Grid.EndUpdate();
97-
});
98-
deleteRow.IconCssClass = "grid-context-menu-item-delete-row";
99-
}
100-
101-
if (args.Context is GridHeaderCommandContext headerContext) {
102-
var isFilterRowVisible = headerContext.Grid.ShowFilterRow != false;
103-
var newFilterRowState = isFilterRowVisible ? false : true;
104-
var filterRow = args.Items.AddCustomItem("Filter Row", () => {
105-
headerContext.Grid.BeginUpdate();
106-
headerContext.Grid.ShowFilterRow = newFilterRowState;
107-
headerContext.Grid.EndUpdate();
108-
});
109-
filterRow.IconCssClass = "grid-context-menu-item-filter-row";
110-
filterRow.CssClass = isFilterRowVisible ? "menu-item-selected" : "";
111-
112-
var isFiltered = headerContext.Grid.GetFilterCriteria() != null;
113-
var clearFilter = args.Items.AddCustomItem("Clear Filter", () => {
114-
headerContext.Grid.BeginUpdate();
115-
headerContext.Grid.ClearFilter();
116-
headerContext.Grid.EndUpdate();
117-
});
118-
clearFilter.IconCssClass = "grid-context-menu-item-clear-filter";
119-
clearFilter.Enabled = isFiltered ? true : false;
120-
121-
var isFooterVisible = headerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Always
122-
|| headerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Auto && headerContext.Grid.GetTotalSummaryItems().Count > 0;
123-
var newFooterState = isFooterVisible ? GridFooterDisplayMode.Never : GridFooterDisplayMode.Always;
124-
var footer = args.Items.AddCustomItem("Footer", () =>
125-
{
126-
headerContext.Grid.BeginUpdate();
127-
headerContext.Grid.FooterDisplayMode = newFooterState;
128-
headerContext.Grid.EndUpdate();
129-
});
130-
footer.IconCssClass = "grid-context-menu-item-footer";
131-
footer.CssClass = isFooterVisible ? "menu-item-selected" : "";
132-
133-
var fixLeft = args.Items.AddCustomItem("Fix Column to the Left", () => {
134-
headerContext.Grid.BeginUpdate();
135-
headerContext.Column.FixedPosition = GridColumnFixedPosition.Left;
136-
headerContext.Grid.EndUpdate();
137-
});
138-
fixLeft.IconCssClass = "grid-context-menu-item-fix-column-left";
139-
fixLeft.BeginGroup = true;
140-
141-
var fixRight = args.Items.AddCustomItem("Fix Column to the Right", () => {
142-
headerContext.Grid.BeginUpdate();
143-
headerContext.Column.FixedPosition = GridColumnFixedPosition.Right;
144-
headerContext.Grid.EndUpdate();
145-
});
146-
fixRight.IconCssClass = "grid-context-menu-item-fix-column-right";
147-
148-
var unfix = args.Items.AddCustomItem("Unfix Column", () => {
149-
headerContext.Grid.BeginUpdate();
150-
headerContext.Column.FixedPosition = GridColumnFixedPosition.None;
151-
headerContext.Grid.EndUpdate();
152-
});
153-
unfix.IconCssClass = "grid-context-menu-item-unfix-column";
154-
}
155-
156-
if (args.Context is GridFooterCommandContext footerContext) {
157-
var isFooterVisible = footerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Always
158-
|| footerContext.Grid.FooterDisplayMode == GridFooterDisplayMode.Auto && footerContext.Grid.GetTotalSummaryItems().Count > 0;
159-
var newFooterState = isFooterVisible ? GridFooterDisplayMode.Never : GridFooterDisplayMode.Always;
160-
var footer = args.Items.AddCustomItem("Footer", () =>
161-
{
162-
footerContext.Grid.BeginUpdate();
163-
footerContext.Grid.FooterDisplayMode = newFooterState;
164-
footerContext.Grid.EndUpdate();
165-
});
166-
footer.IconCssClass = "grid-context-menu-item-footer";
167-
footer.CssClass = isFooterVisible ? "menu-item-selected" : "";
168-
}
169-
}
17061

62+
void Grid_CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) => GridContextMenuHelper.CustomizeContextMenu(args);
17163

17264
void Grid_CustomizeElement(GridCustomizeElementEventArgs e) {
17365
if(GridContextMenuHelper.IsContextMenuElement(e.ElementType)) {
@@ -188,22 +80,10 @@
18880
}
18981
}
19082

191-
async Task NewItem_Click() {
192-
await Grid.StartEditNewRowAsync();
193-
}
194-
void ColumnChooserItem_Click(ToolbarItemClickEventArgs e) {
195-
Grid.ShowColumnChooser();
196-
}
197-
async Task ExportXlsxItem_Click() {
198-
await Grid.ExportToXlsxAsync(ExportFileName);
199-
}
200-
async Task ExportXlsItem_Click() {
201-
await Grid.ExportToXlsAsync(ExportFileName);
202-
}
203-
async Task ExportCsvItem_Click() {
204-
await Grid.ExportToCsvAsync(ExportFileName);
205-
}
206-
async Task ExportPdfItem_Click() {
207-
await Grid.ExportToPdfAsync(ExportFileName);
208-
}
83+
async Task NewItem_Click() => await Grid.StartEditNewRowAsync();
84+
void ColumnChooserItem_Click(ToolbarItemClickEventArgs e) => Grid.ShowColumnChooser();
85+
async Task ExportXlsxItem_Click() => await Grid.ExportToXlsxAsync(ExportFileName);
86+
async Task ExportXlsItem_Click() => await Grid.ExportToXlsAsync(ExportFileName);
87+
async Task ExportCsvItem_Click() => await Grid.ExportToCsvAsync(ExportFileName);
88+
async Task ExportPdfItem_Click() => await Grid.ExportToPdfAsync(ExportFileName);
20989
}

0 commit comments

Comments
 (0)