|
@@ -7,19 +7,16 @@ using DevExpress.XtraEditors.Controls;
|
|
|
using DevExpress.XtraGrid;
|
|
|
using DevExpress.XtraGrid.Columns;
|
|
|
using DevExpress.XtraGrid.Views.Grid;
|
|
|
-using DevExpress.XtraGrid.Views.Tile;
|
|
|
+using DxHelper;
|
|
|
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 static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView;
|
|
|
public static class GridControlEx
|
|
|
{
|
|
|
class GridTag
|
|
@@ -30,17 +27,17 @@ public static class GridControlEx
|
|
|
public BarManager BarM { get; set; }
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// <para>初始化表格</para>
|
|
|
- /// <para>禁用列菜单、排序、分组、过滤、列拖动等</para>
|
|
|
+ /// 初始化表格(默认禁用分组)
|
|
|
/// </summary>
|
|
|
/// <param name="grid"></param>
|
|
|
- /// <param name="rowHeight"></param>
|
|
|
- /// <param name="showScrollH"></param>
|
|
|
+ /// <param name="dataSource">绑定的数据源</param>
|
|
|
+ /// <param name="rowHeight">行高(默认24px)</param>
|
|
|
+ /// <param name="showScrollH">是否显示水平滚动条(默认不显示)</param>
|
|
|
/// <typeparam name="T">绑定的数据源模型类型</typeparam>
|
|
|
- /// <param name="searchLookUpEdit">searchLookUpEditd控件</param>
|
|
|
/// <returns></returns>
|
|
|
- public static GridControl Init<T>(this GridControl grid, int rowHeight = 24, bool showScrollH = false, Control searchLookUpEdit = null)
|
|
|
+ public static GridControl UseDefault<T>(this GridControl grid,List<T> dataSource, int rowHeight = 24, bool showScrollH = false)
|
|
|
{
|
|
|
+ grid.DataSource = dataSource;
|
|
|
grid.MainView.BorderStyle = BorderStyles.Flat;
|
|
|
var view = grid.MainView as GridView;
|
|
|
view.CustomColumnDisplayText += View_CustomColumnDisplayText;
|
|
@@ -57,9 +54,9 @@ public static class GridControlEx
|
|
|
view.OptionsView.ShowIndicator = false;
|
|
|
|
|
|
view.OptionsMenu.EnableColumnMenu = true;
|
|
|
- view.OptionsCustomization.AllowFilter = false;
|
|
|
+ view.OptionsCustomization.AllowFilter = true;
|
|
|
view.OptionsCustomization.AllowGroup = false;
|
|
|
- view.OptionsCustomization.AllowSort = false;
|
|
|
+ view.OptionsCustomization.AllowSort = true;
|
|
|
view.OptionsCustomization.AllowColumnMoving = true;
|
|
|
view.OptionsCustomization.AllowMergedGrouping = DefaultBoolean.False;
|
|
|
view.OptionsSelection.MultiSelect = false;
|
|
@@ -75,11 +72,12 @@ public static class GridControlEx
|
|
|
view.OptionsLayout.StoreFormatRules = true;
|
|
|
view.OptionsView.ColumnAutoWidth = !showScrollH;
|
|
|
view.PopupMenuShowing += View_PopupMenuShowing;
|
|
|
+
|
|
|
view.OptionsSelection.EnableAppearanceFocusedCell = false;
|
|
|
string GetLayoutName()
|
|
|
{
|
|
|
Control ctrl;
|
|
|
- if (searchLookUpEdit != null)
|
|
|
+ if (view.Tag is SearchLookUpEdit searchLookUpEdit)
|
|
|
ctrl = searchLookUpEdit;
|
|
|
else
|
|
|
ctrl = grid;
|
|
@@ -95,8 +93,8 @@ public static class GridControlEx
|
|
|
sb.Append(item.Name);
|
|
|
}
|
|
|
var md5 = MD5Helper.StrToMD5(sb.ToString());
|
|
|
- if (searchLookUpEdit != null)
|
|
|
- return $"{ctrl.Name}_{searchLookUpEdit.Name}_{md5}";
|
|
|
+ if (view.Tag is SearchLookUpEdit searchLookUpEdit2)
|
|
|
+ return $"{ctrl.Name}_{searchLookUpEdit2.Name}_{md5}";
|
|
|
else
|
|
|
return $"{ctrl.Name}_{grid.Name}_{md5}";
|
|
|
}
|
|
@@ -104,10 +102,11 @@ public static class GridControlEx
|
|
|
void SaveLayoutAction()
|
|
|
{
|
|
|
Form frm = null;
|
|
|
- if (searchLookUpEdit == null)
|
|
|
- frm = grid.FindForm();
|
|
|
+ if (view.Tag is SearchLookUpEdit edit)
|
|
|
+ frm = edit.FindForm();
|
|
|
else
|
|
|
- frm = searchLookUpEdit.FindForm();
|
|
|
+ frm = grid.FindForm();
|
|
|
+
|
|
|
if (frm != null)
|
|
|
{
|
|
|
frm.VisibleChanged += (sender2, e2) =>
|
|
@@ -136,6 +135,230 @@ public static class GridControlEx
|
|
|
return grid;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 为GirdControl启用右键新增数据的功能
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="callback">一个回调函数,返回新增的数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseAdd<T>(this GridControl grid, Func<T> callback, string menuCaption = "新增")
|
|
|
+ {
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ view.CustomDrawEmptyForeground += (sender, e) =>
|
|
|
+ {
|
|
|
+ string emptyText = "右键添加";
|
|
|
+ var s = e.Appearance.CalcTextSize(e.Cache, emptyText, e.Bounds.Width).ToSize();
|
|
|
+ var x = (e.Bounds.Width - s.Width) / 2;
|
|
|
+ var y = (e.Bounds.Height - s.Height) / 2;
|
|
|
+ e.Appearance.ForeColor = Color.Gray;
|
|
|
+ e.Appearance.DrawString(e.Cache, emptyText, new Rectangle(x, y, s.Width, s.Height));
|
|
|
+ };
|
|
|
+ grid.AddContentMenu<T>(menuCaption, DxHelper.SvgHelper.CreateAdd(), data =>
|
|
|
+ {
|
|
|
+ if (callback != null)
|
|
|
+ {
|
|
|
+ var addRow = callback();
|
|
|
+ if (addRow == null) return;
|
|
|
+ var ds = grid.DataSource as List<T>;
|
|
|
+ ds.Add(addRow);
|
|
|
+ view.RefreshData();
|
|
|
+ }
|
|
|
+
|
|
|
+ }, true);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GirdControl启用右键新增数据的功能
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="callback">一个回调函数,返回新增的数据</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseAddAsync<T>(this GridControl grid, Func<Task<T>> callback, string menuCaption = "新增")
|
|
|
+ {
|
|
|
+ grid.AddContentMenu<T>(menuCaption, DxHelper.SvgHelper.CreateAdd(), async data =>
|
|
|
+ {
|
|
|
+ if (callback != null)
|
|
|
+ {
|
|
|
+ var addRow = await callback();
|
|
|
+ if (addRow == null) return;
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ var ds = grid.DataSource as List<T>;
|
|
|
+ ds.Add(addRow);
|
|
|
+ view.RefreshData();
|
|
|
+ }
|
|
|
+
|
|
|
+ }, true);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GridControl启用右编辑选中的单行功能
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="callback"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseEdit<T>(this GridControl grid, Func<T, T> callback, string menuCaption = "编辑")
|
|
|
+ {
|
|
|
+ grid.AddRowMenu<T>(menuCaption, DxHelper.SvgHelper.CreateEdit(), data =>
|
|
|
+ {
|
|
|
+ if (callback != null)
|
|
|
+ {
|
|
|
+ var newRow = callback(data);
|
|
|
+ if (newRow == null) return;
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ var ds = grid.DataSource as List<T>;
|
|
|
+ var idx = ds.IndexOf(data);
|
|
|
+ ds.Remove(data);
|
|
|
+ ds.Insert(idx, newRow);
|
|
|
+ view.RefreshData();
|
|
|
+ }
|
|
|
+
|
|
|
+ }, null);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GridControl启用右编辑选中的单行功能
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="callback"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseEditAsync<T>(this GridControl grid, Func<T, Task<T>> callback, string menuCaption = "编辑")
|
|
|
+ {
|
|
|
+ grid.AddRowMenu<T>(menuCaption, DxHelper.SvgHelper.CreateEdit(), async data =>
|
|
|
+ {
|
|
|
+ if (callback != null)
|
|
|
+ {
|
|
|
+ var newRow = await callback(data);
|
|
|
+ if (newRow == null) return;
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ var ds = grid.DataSource as List<T>;
|
|
|
+ var idx = ds.IndexOf(data);
|
|
|
+ ds.Remove(data);
|
|
|
+ ds.Insert(idx, newRow);
|
|
|
+ view.RefreshData();
|
|
|
+ }
|
|
|
+
|
|
|
+ }, null);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GridControl启用右删除选中的一行或多行功能(自动启用UseMultiSelect)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="action"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseDelete<T>(this GridControl grid, Func<List<T>, bool> action = null, string menuCaption = "删除")
|
|
|
+ {
|
|
|
+ grid.AddMultRowMenu<T>(menuCaption, DxHelper.SvgHelper.CreateClose(), data =>
|
|
|
+ {
|
|
|
+ if (!DxHelper.MsgBoxHelper.ShowConfirm($"确认删除选中的记录?共[{data.Count}]条")) return;
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ bool succeed = action(data);
|
|
|
+ if (!succeed) return;
|
|
|
+ }
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ view.DeleteSelectedRows();
|
|
|
+ view.RefreshData();
|
|
|
+
|
|
|
+ });
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GridControl启用右删除选中的一行或多行功能(自动启用UseMultiSelect)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="action"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseDeleteAsync<T>(this GridControl grid, Func<List<T>, Task<bool>> action = null, string menuCaption = "删除")
|
|
|
+ {
|
|
|
+ grid.AddMultRowMenu<T>(menuCaption, DxHelper.SvgHelper.CreateClose(), async data =>
|
|
|
+ {
|
|
|
+ if (!DxHelper.MsgBoxHelper.ShowConfirm($"确认删除选中的记录?共[{data.Count()}]条")) return;
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ bool succeed = await action(data);
|
|
|
+ if (!succeed) return;
|
|
|
+ }
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ view.DeleteSelectedRows();
|
|
|
+ view.RefreshData();
|
|
|
+
|
|
|
+ });
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GirdControl启用右键清除所有数据的功能(action执行完成后会自动清空表格中对应的数据)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="action"></param>
|
|
|
+ /// <param name="existMenu"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseClear<T>(this GridControl grid, Func<List<T>, bool> action = null, string menuCaption = "清除")
|
|
|
+ {
|
|
|
+ grid.AddContentMenu<T>(menuCaption, DxHelper.SvgHelper.CreateClear(), data =>
|
|
|
+ {
|
|
|
+ if (data == null || data.Count == 0) return;
|
|
|
+ if (!DxHelper.MsgBoxHelper.ShowConfirm($"确认清空所有记录?共[{data.Count}]条")) return;
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ bool succeed = action(data);
|
|
|
+ if (!succeed) return;
|
|
|
+ }
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ data.Clear();
|
|
|
+ view.RefreshData();
|
|
|
+
|
|
|
+ }, false);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 为GirdControl启用右键清除所有数据的功能(action执行完成后会自动清空表格中对应的数据)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
+ /// <param name="grid"></param>
|
|
|
+ /// <param name="menuCaption"></param>
|
|
|
+ /// <param name="action"></param>
|
|
|
+ /// <param name="existMenu"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl UseClearAsync<T>(this GridControl grid, Func<List<T>, Task<bool>> action = null, string menuCaption = "清除")
|
|
|
+ {
|
|
|
+ grid.AddContentMenu<T>(menuCaption, DxHelper.SvgHelper.CreateClear(), async data =>
|
|
|
+ {
|
|
|
+ if (data == null || data.Count == 0) return;
|
|
|
+ if (!DxHelper.MsgBoxHelper.ShowConfirm($"确认清空所有记录?共[{data.Count}]条")) return;
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ bool succeed = await action(data);
|
|
|
+ if (!succeed) return;
|
|
|
+ }
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ data.Clear();
|
|
|
+ view.RefreshData();
|
|
|
+
|
|
|
+ }, false);
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
|
|
|
public static GridControl UseExportCsv(this GridControl grid)
|
|
|
{
|
|
@@ -170,6 +393,7 @@ public static class GridControlEx
|
|
|
tag.PopupMenu = popupMenu;
|
|
|
return grid;
|
|
|
}
|
|
|
+
|
|
|
public static GridControl UseExportXlsx(this GridControl grid)
|
|
|
{
|
|
|
GridTag tag = grid.Tag as GridTag;
|
|
@@ -246,13 +470,6 @@ public static class GridControlEx
|
|
|
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;
|
|
@@ -271,12 +488,6 @@ public static class GridControlEx
|
|
|
return grid;
|
|
|
|
|
|
}
|
|
|
- public static GridControl UseFilter(this GridControl grid)
|
|
|
- {
|
|
|
- var view = grid.MainView as GridView;
|
|
|
- view.OptionsCustomization.AllowFilter = true;
|
|
|
- return grid;
|
|
|
- }
|
|
|
public static GridControl UseEdit(this GridControl grid)
|
|
|
{
|
|
|
var view = grid.MainView as GridView;
|
|
@@ -319,8 +530,6 @@ public static class GridControlEx
|
|
|
return grid;
|
|
|
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
public static GridControl HideColumn(this GridControl grid, params string[] colField)
|
|
|
{
|
|
|
|
|
@@ -333,59 +542,153 @@ public static class GridControlEx
|
|
|
}
|
|
|
return grid;
|
|
|
}
|
|
|
- private static void View_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// GridControl添加单行元素选择后的右键菜单(没有选中的数据或showCondition返回false时不会显示此菜单按钮)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T">GridControl绑定数据源的泛型类型</typeparam>
|
|
|
+ /// <param name="grid">GridControl控件</param>
|
|
|
+ /// <param name="menuText">菜单标题</param>
|
|
|
+ /// <param name="meunImage">菜单图标</param>
|
|
|
+ /// <param name="action">菜单要执行的事件,参数为选中的单行元素</param>
|
|
|
+ /// <param name="showCondition">菜单显示的条件</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl AddRowMenu<T>(this GridControl grid, string menuText, SvgImage meunImage,
|
|
|
+ Action<T> action, Func<T, bool> showCondition = null)
|
|
|
{
|
|
|
- if (e.Menu != null)
|
|
|
+ GridTag tag = grid.Tag as GridTag;
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+
|
|
|
+ if (tag.BarM == null)
|
|
|
{
|
|
|
- foreach (DXMenuItem item in e.Menu.Items)
|
|
|
- {
|
|
|
- if (!item.Enabled)
|
|
|
- {
|
|
|
- item.Visible = false;
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
+ tag.BarM = new BarManager();
|
|
|
+ tag.BarM.Form = grid;
|
|
|
}
|
|
|
- if (e.HitInfo.HitTest == DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.EmptyRow)
|
|
|
+ if (tag.PopupMenu == null)
|
|
|
{
|
|
|
- return;
|
|
|
+ tag.PopupMenu = new PopupMenu();
|
|
|
}
|
|
|
- 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);
|
|
|
+ var popupMenu = tag.PopupMenu;
|
|
|
+ BarButtonItem item = new BarButtonItem();
|
|
|
+ Func<bool> showConditionAll = () =>
|
|
|
+ {
|
|
|
+ if (!view.GetSelectedRows().Any()) return false;
|
|
|
+ if (showCondition == null)
|
|
|
+ return true;
|
|
|
+ else
|
|
|
+ return showCondition((T)view.GetFocusedRow());
|
|
|
+ };
|
|
|
+ item.Tag = showConditionAll;
|
|
|
+ item.ItemClick += (sender, e) =>
|
|
|
+ {
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ if (view.GetFocusedRow() == null) return;
|
|
|
+ item.Enabled = false;
|
|
|
+ action.Invoke((T)view.GetFocusedRow());
|
|
|
+ item.Enabled = true;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ item.ImageOptions.SvgImage = meunImage;
|
|
|
+ item.Caption = menuText;
|
|
|
+ tag.BarM.Items.Add(item);
|
|
|
+ popupMenu.AddItem(item);
|
|
|
+ popupMenu.Manager = tag.BarM;
|
|
|
+ tag.PopupMenu = popupMenu;
|
|
|
+ return grid;
|
|
|
}
|
|
|
|
|
|
- public static GridControl AddMenu(this GridControl grid, string menuText, SvgImage meunImage, Action onClick, PopupMenu existMenu = null)
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// GridControl添加多行选择元素的右键菜单(没有选中的数据时不会显示此菜单按钮)
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T">GridControl绑定数据源的泛型类型</typeparam>
|
|
|
+ /// <param name="grid">GridControl控件</param>
|
|
|
+ /// <param name="menuText">菜单标题</param>
|
|
|
+ /// <param name="meunImage">菜单图标</param>
|
|
|
+ /// <param name="action">菜单要执行的事件,参数为选中的一行或多行元素</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl AddMultRowMenu<T>(this GridControl grid, string menuText, SvgImage meunImage,
|
|
|
+ Action<List<T>> action)
|
|
|
{
|
|
|
+ grid.UseMultiSelect();
|
|
|
GridTag tag = grid.Tag as GridTag;
|
|
|
- PopupMenu popupMenu;
|
|
|
- if (existMenu == null)
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ if (tag.BarM == null)
|
|
|
{
|
|
|
- if (tag.BarM == null)
|
|
|
- {
|
|
|
- tag.BarM = new BarManager();
|
|
|
- tag.BarM.Form = grid;
|
|
|
- }
|
|
|
- if (tag.PopupMenu == null)
|
|
|
+ tag.BarM = new BarManager();
|
|
|
+ tag.BarM.Form = grid;
|
|
|
+ }
|
|
|
+ if (tag.PopupMenu == null)
|
|
|
+ {
|
|
|
+ tag.PopupMenu = new PopupMenu();
|
|
|
+ }
|
|
|
+ var popupMenu = tag.PopupMenu;
|
|
|
+ BarButtonItem item = new BarButtonItem();
|
|
|
+ item.ItemClick += (sender, e) =>
|
|
|
+ {
|
|
|
+ if (action != null)
|
|
|
{
|
|
|
- tag.PopupMenu = new PopupMenu();
|
|
|
+ var rows = view.GetSelectedRows();
|
|
|
+ List<T> list = new List<T>();
|
|
|
+ foreach (var row in rows)
|
|
|
+ {
|
|
|
+ if (row < 0) continue;
|
|
|
+ list.Add((T)view.GetRow(row));
|
|
|
+ }
|
|
|
+ if (list.Any())
|
|
|
+ action.Invoke(list);
|
|
|
}
|
|
|
- popupMenu = tag.PopupMenu;
|
|
|
+ };
|
|
|
+ item.ImageOptions.SvgImage = meunImage;
|
|
|
+ item.Caption = menuText;
|
|
|
+ Func<bool> showCondition = () => view.GetSelectedRows().Any();
|
|
|
+ item.Tag = showCondition;
|
|
|
+ tag.BarM.Items.Add(item);
|
|
|
+ popupMenu.AddItem(item);
|
|
|
+ popupMenu.Manager = tag.BarM;
|
|
|
+ tag.PopupMenu = popupMenu;
|
|
|
+ return grid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// GridControl添加内容区的右键菜单
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T">GridControl绑定数据源的泛型类型</typeparam>
|
|
|
+ /// <param name="grid">GridControl控件</param>
|
|
|
+ /// <param name="menuText">菜单标题</param>
|
|
|
+ /// <param name="meunImage">菜单图标</param>
|
|
|
+ /// <param name="action">菜单要执行的事件,参数为绑定的数据源</param>
|
|
|
+ /// <param name="showWithNoneDataRow">内容区没有元素时是否显示此菜单,默认显示</param>
|
|
|
+ /// <param name="existMenu">如果GirdControl行元素已经存在PopupMenu,则需要传入存在的PopupMenu)</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static GridControl AddContentMenu<T>(this GridControl grid, string menuText, SvgImage meunImage,
|
|
|
+ Action<List<T>> action, bool showWithNoneDataRow = true)
|
|
|
+ {
|
|
|
+ GridTag tag = grid.Tag as GridTag;
|
|
|
+ var view = grid.MainView as GridView;
|
|
|
+ if (tag.BarM == null)
|
|
|
+ {
|
|
|
+ tag.BarM = new BarManager();
|
|
|
+ tag.BarM.Form = grid;
|
|
|
}
|
|
|
- else
|
|
|
+ if (tag.PopupMenu == null)
|
|
|
{
|
|
|
- popupMenu = existMenu;
|
|
|
- tag.PopupMenu = existMenu;
|
|
|
- tag.BarM = existMenu.Manager;
|
|
|
+ tag.PopupMenu = new PopupMenu();
|
|
|
}
|
|
|
+ var popupMenu = tag.PopupMenu;
|
|
|
BarButtonItem item = new BarButtonItem();
|
|
|
item.ItemClick += (sender, e) =>
|
|
|
{
|
|
|
- item.Enabled = false;
|
|
|
- onClick?.Invoke();
|
|
|
- item.Enabled = true;
|
|
|
+ if (action != null)
|
|
|
+ {
|
|
|
+ var ds = grid.DataSource as List<T>;
|
|
|
+ if (!showWithNoneDataRow && (ds == null || ds.Count == 0)) return;
|
|
|
+ item.Enabled = false;
|
|
|
+ action.Invoke(ds);
|
|
|
+ item.Enabled = true;
|
|
|
+ }
|
|
|
};
|
|
|
item.ImageOptions.SvgImage = meunImage;
|
|
|
item.Caption = menuText;
|
|
@@ -395,4 +698,46 @@ public static class GridControlEx
|
|
|
tag.PopupMenu = popupMenu;
|
|
|
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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //if (e.HitInfo.HitTest == DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.EmptyRow)
|
|
|
+ //{
|
|
|
+ // return;
|
|
|
+ //}
|
|
|
+ var view = sender as GridView;
|
|
|
+ var grid = view.GridControl;
|
|
|
+ var p = grid.PointToScreen(e.Point);
|
|
|
+ var tag = grid.Tag as GridTag;
|
|
|
+ if (tag?.PopupMenu != null)
|
|
|
+ {
|
|
|
+ foreach (BarButtonItemLink item in tag?.PopupMenu?.ItemLinks)
|
|
|
+ {
|
|
|
+ var buttonItem = item.Item;
|
|
|
+ if (buttonItem.Tag != null && buttonItem.Tag is Func<bool> showCondition)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (showCondition())
|
|
|
+ buttonItem.Visibility = BarItemVisibility.Always;
|
|
|
+ else
|
|
|
+ buttonItem.Visibility = BarItemVisibility.Never;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tag?.PopupMenu?.ShowPopup(p);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|