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