using DevExpress.Utils; using DevExpress.Utils.Menu; using DevExpress.XtraBars; using DevExpress.XtraBars.Commands.Internal; using DevExpress.XtraEditors; using DevExpress.XtraEditors.Controls; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Tile; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; public static class GridControlEx { class GridTag { public GridTag() { } public PopupMenu PopupMenu { get; set; } public BarManager BarM { get; set; } } /// /// 初始化表格 /// 禁用列菜单、排序、分组、过滤、列拖动等 /// /// /// /// public static GridControl Init(this GridControl grid, int rowHeight = 24) { grid.MainView.BorderStyle = BorderStyles.Flat; var view = grid.MainView as GridView; view.CustomColumnDisplayText += View_CustomColumnDisplayText; view.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center; view.Appearance.Row.Options.UseTextOptions = true; view.Appearance.Row.TextOptions.HAlignment = HorzAlignment.Center; view.OptionsView.ColumnHeaderAutoHeight = DefaultBoolean.True; view.RowHeight = rowHeight; view.OptionsView.ShowGroupPanel = false; view.OptionsBehavior.Editable = false; view.OptionsView.ShowDetailButtons = false; view.OptionsView.ShowIndicator = false; view.OptionsMenu.EnableColumnMenu = true; view.OptionsCustomization.AllowFilter = false; view.OptionsCustomization.AllowGroup = false; view.OptionsCustomization.AllowSort = false; view.OptionsCustomization.AllowColumnMoving = true; view.OptionsCustomization.AllowMergedGrouping = DefaultBoolean.False; view.OptionsSelection.MultiSelect = false; view.OptionsCustomization.AllowRowSizing = false; view.OptionsCustomization.AllowQuickHideColumns = false; view.OptionsMenu.EnableGroupPanelMenu = false; view.OptionsMenu.EnableGroupRowMenu = false; view.OptionsMenu.EnableFooterMenu = false; view.OptionsLayout.StoreAllOptions = true; view.OptionsLayout.StoreAppearance = true; view.OptionsLayout.StoreDataSettings = true; view.OptionsLayout.StoreVisualOptions = true; view.OptionsLayout.StoreFormatRules = true; view.PopupMenuShowing += View_PopupMenuShowing; view.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Load += (sender, e) => { var frm = grid.FindForm(); if (frm != null) { frm.FormClosing += (sender2, e2) => { if (e2.CloseReason == CloseReason.UserClosing||e2.CloseReason== CloseReason.MdiFormClosing) { Directory.CreateDirectory("Layout"); grid.MainView?.SaveLayoutToXml($"Layout\\{grid.Name}.xml", OptionsLayoutBase.FullLayout); } }; } }; string file = $"Layout\\{grid.Name}.xml"; if (File.Exists(file)) view.RestoreLayoutFromXml(file, OptionsLayoutBase.FullLayout); view.KeyUp += View_KeyUp; grid.Tag = new GridTag(); return grid; } public static GridControl UseExportCsv(this GridControl grid) { GridTag tag = grid.Tag as GridTag; if (tag.BarM == null) { tag.BarM = new BarManager(); tag.BarM.Form = grid; } if (tag.PopupMenu == null) { tag.PopupMenu = new PopupMenu(); } PopupMenu popupMenu = tag.PopupMenu; BarButtonItem item = new BarButtonItem(); item.ItemClick += (sender, e) => { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "csv|*.csv"; if (dialog.ShowDialog() == DialogResult.OK) { var view = grid.MainView as GridView; view.ExportToCsv(dialog.FileName); } }; item.ImageOptions.SvgImage = DxHelper.SvgHelper.CreateExportCsv(); item.Caption = "导出(CSV)"; tag.BarM.Items.Add(item); popupMenu.AddItem(item); popupMenu.Manager = tag.BarM; tag.PopupMenu = popupMenu; return grid; } public static GridControl UseExportXlsx(this GridControl grid) { GridTag tag = grid.Tag as GridTag; if (tag.BarM == null) { tag.BarM = new BarManager(); tag.BarM.Form = grid; } if (tag.PopupMenu == null) { tag.PopupMenu = new PopupMenu(); } PopupMenu popupMenu = tag.PopupMenu; BarButtonItem item = new BarButtonItem(); item.ItemClick += (sender, e) => { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Excel文件|*.xlsx"; if (dialog.ShowDialog() == DialogResult.OK) { var view = grid.MainView as GridView; view.ExportToXlsx(dialog.FileName); } }; item.ImageOptions.SvgImage = DxHelper.SvgHelper.CreateExportXlsx(); item.Caption = "导出(Excel)"; tag.BarM.Items.Add(item); popupMenu.AddItem(item); popupMenu.Manager = tag.BarM; tag.PopupMenu = popupMenu; return grid; } private static void View_KeyUp(object sender, KeyEventArgs e) { if (e.Control && e.Shift & e.KeyCode == Keys.C) { var view = sender as GridView; if (view.FocusedColumn == null) return; var val = view.GetFocusedRowCellDisplayText(view.FocusedColumn); if (string.IsNullOrWhiteSpace(val)) return; Clipboard.SetText(val); } } private static void View_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column.ColumnType == typeof(DateTime)) { if (e.Column.FieldName == "SigTime") e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm:ss.fff"); else e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm:ss"); } } public static GridControl ShowColumn(this GridControl grid, params string[] colField) { var view = grid.MainView as GridView; if (view.Columns.Count == 0) return grid; if (colField == null || colField.Length == 0) return grid; foreach (GridColumn item in view.Columns) { if (colField.Contains(item.FieldName)) item.Visible = true; } return grid; } public static GridControl UseMultiSelect(this GridControl grid) { var view = grid.MainView as GridView; view.OptionsSelection.MultiSelect = true; view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect; return grid; } public static GridControl UseSort(this GridControl grid) { var view = grid.MainView as GridView; view.OptionsCustomization.AllowSort = true; return grid; } public static GridControl UseGroup(this GridControl grid) { var view = grid.MainView as GridView; view.OptionsView.GroupFooterShowMode = GroupFooterShowMode.Hidden; view.OptionsView.ShowGroupPanel = true; view.OptionsCustomization.AllowGroup = true; view.OptionsCustomization.AllowSort = true; return grid; } public static GridControl UseFooter(this GridControl grid, Action act) { var view = grid.MainView as GridView; view.OptionsView.ShowFooter = true; view.CustomDrawFooter += (s, e) => act(s, e); return grid; } public static GridControl UseFilter(this GridControl grid) { var view = grid.MainView as GridView; view.OptionsCustomization.AllowFilter = true; return grid; } public static GridControl UseRowNumber(this GridControl grid) { var view = grid.MainView as GridView; view.OptionsView.ShowIndicator = true; view.IndicatorWidth = 30; view.CustomDrawRowIndicator += (s, e) => { if (!e.Info.IsRowIndicator) return; if (e.RowHandle < 0) return; e.Handled = true; string txt = (e.RowHandle + 1).ToString(); var txtSize = e.Graphics.MeasureString(txt, e.Appearance.Font); var loc = new PointF(e.Bounds.X + e.Bounds.Width / 2f - txtSize.Width / 2f + 2, e.Bounds.Y + e.Bounds.Height / 2f - txtSize.Height / 2f); e.Cache.FillRectangle(new SolidBrush(e.Appearance.BackColor), e.Bounds); e.Cache.DrawString(txt, e.Appearance.Font, new SolidBrush(e.Appearance.ForeColor), loc); }; return grid; } public static GridControl HideColumn(this GridControl grid, params string[] colField) { var view = grid.MainView as GridView; if (colField == null || colField.Length == 0) return grid; foreach (GridColumn item in view.Columns) { if (colField.Contains(item.FieldName)) item.Visible = false; } return grid; } private static void View_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { if (e.Menu != null) { foreach (DXMenuItem item in e.Menu.Items) { if (!item.Enabled) { item.Visible = false; continue; } } } var view = sender as GridView; var grid = view.GridControl; var p = grid.PointToScreen(e.Point); var tag = grid.Tag as GridTag; tag?.PopupMenu?.ShowPopup(p); } }