feat: 完善个人设置及表格功能

This commit is contained in:
cyf
2026-08-31 18:03:47 +08:00
parent 769aa52241
commit c1d10f22f5
11 changed files with 1033 additions and 88 deletions
@@ -122,6 +122,8 @@ namespace Lskj.Control
this.bandedGridView.PopupMenuShowing += new DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventHandler(this.OnGridViewPopupMenuShowing);
this.bandedGridView.Click += new EventHandler(OnBandedGridView_Click);
this.bandedGridView.DoubleClick += new EventHandler(OnBandedGridViewDoubleClick);
// 多表头的操作列使用 BandedGridView,复用基类的禁编按钮点击处理。
this.bandedGridView.MouseDown += GridView_MouseDown;
this.bandedGridView.CustomDrawGroupRow += new RowObjectCustomDrawEventHandler(OnGridCustomDrawGroupRow);
this.bandedGridView.LeftCoordChanged += OnBandedLeftCoordChanged;
this.SetGridRowHeightAndFont();
@@ -133,6 +135,236 @@ namespace Lskj.Control
this.bandedGridView.ShowingEditor += GridView_ShowingEditor;
}
/// <summary>
/// 多表头创建或重建操作列。
/// 操作列不参与业务列配置,只挂到空白一级表头的最右侧。
/// </summary>
protected override void TryInitRightMenuBtnEdit(bool rebuild)
{
if (!this.gridColumnsInitialized || this.Model == null ||
(this.CustomColumKey ?? string.Empty).Contains("BaseLeftGridView_"))
{
return;
}
BandedGridColumn oldColumn = this.bandedGridView.Columns["RightMenuBtnEdit"];
bool showButtonColumn = this.rightMenuButtonTable != null &&
this.rightMenuButtonTable.Rows.Cast<DataRow>().Any(row =>
(row.Table.Columns.Contains("IcoName") &&
!string.IsNullOrWhiteSpace(row["IcoName"] + "")) ||
(row.Table.Columns.Contains("showtoolbar") &&
"1".Equals(row["showtoolbar"] + "")));
if (!showButtonColumn)
{
if (oldColumn != null)
{
this.RemoveRightMenuButtonColumn(oldColumn);
}
return;
}
if (oldColumn != null)
{
if (!rebuild)
{
return;
}
this.RemoveRightMenuButtonColumn(oldColumn);
}
this.InitRightMenuBtnEdit(this.rightMenuButtonTable);
DataTable dataSource = this.GridControl == null ? null : this.GridControl.DataSource as DataTable;
if (dataSource != null && !dataSource.Columns.Contains("RightMenuBtnEdit"))
{
dataSource.Columns.Add("RightMenuBtnEdit");
}
}
/// <summary>
/// 删除旧操作列,同时保持空白一级表头下其他列的现有宽度。
/// </summary>
private void RemoveRightMenuButtonColumn(BandedGridColumn oldColumn)
{
GridBand ownerBand = oldColumn.OwnerBand;
int oldColumnWidth = oldColumn.Width;
int originalBandWidth = ownerBand == null ? 0 : ownerBand.Width;
Dictionary<BandedGridColumn, int> originalColumnWidths = ownerBand == null
? new Dictionary<BandedGridColumn, int>()
: ownerBand.Columns.Cast<BandedGridColumn>()
.Where(column => column != oldColumn)
.ToDictionary(column => column, column => column.Width);
this.bandedGridView.BeginUpdate();
try
{
this.bandedGridView.Columns.Remove(oldColumn);
if (ownerBand == null)
{
return;
}
if (ownerBand.Columns.Count == 0)
{
this.bandedGridView.Bands.Remove(ownerBand);
}
else
{
ownerBand.Width = Math.Max(0, originalBandWidth - oldColumnWidth);
foreach (KeyValuePair<BandedGridColumn, int> item in originalColumnWidths)
{
item.Key.Width = item.Value;
}
}
}
finally
{
this.bandedGridView.EndUpdate();
}
}
/// <summary>
/// 创建多表头操作列,并将其放到空白一级表头的最右侧。
/// </summary>
protected override void InitRightMenuBtnEdit(DataTable rightMenuTab)
{
if (rightMenuTab == null)
{
return;
}
BandedGridColumn gridColumn = new BandedGridColumn();
gridColumn.FieldName = "RightMenuBtnEdit";
gridColumn.Name = "RightMenuBtnEdit";
gridColumn.Caption = "操作列";
gridColumn.Visible = true;
gridColumn.OptionsColumn.AllowEdit = true;
RepositoryItemButtonEdit itemButtonEdit = new RepositoryItemButtonEdit();
itemButtonEdit.Buttons.Clear();
itemButtonEdit.AppearanceDisabled.Options.UseTextOptions = true;
itemButtonEdit.AppearanceDisabled.TextOptions.HAlignment = HorzAlignment.Center;
itemButtonEdit.TextEditStyle = TextEditStyles.HideTextEditor;
itemButtonEdit.ButtonsStyle = BorderStyles.UltraFlat;
itemButtonEdit.BorderStyle = BorderStyles.NoBorder;
itemButtonEdit.ButtonClick += new ButtonPressedEventHandler(OnItemButtonEdit_ButtonClick);
int columnWidth = 0;
if (rightMenuTab.Columns.Contains("IcoName"))
{
DataRow[] rightMenuButtons = rightMenuTab.Select()
.Where(n => !string.IsNullOrEmpty(n["IcoName"] + ""))
.ToArray();
int pictureWidth = 30;
foreach (DataRow rightMenu in rightMenuButtons)
{
GridRightMenuModel menuModel = new GridRightMenuModel(rightMenu);
if (string.IsNullOrWhiteSpace(menuModel.MenuName))
{
continue;
}
EditorButton editorButton = new EditorButton();
editorButton.Appearance.BackColor = Color.Transparent;
if (!string.IsNullOrEmpty(menuModel.IcoName))
{
try
{
Image image = GetRightMenuButtonImage(menuModel.IcoName);
if (image != null && image.Width > 30)
{
pictureWidth = image.Width;
}
editorButton.Image = image;
}
catch (Exception)
{
}
}
editorButton.ToolTip = menuModel.MenuName;
editorButton.Kind = ButtonPredefines.Glyph;
editorButton.Width = pictureWidth;
editorButton.Tag = menuModel;
itemButtonEdit.Buttons.Add(editorButton);
}
columnWidth = rightMenuButtons.Length * pictureWidth;
}
if (rightMenuTab.Columns.Contains("showtoolbar"))
{
DataRow[] rightMenuTextButtons = rightMenuTab.Select()
.Where(n => "1".Equals(n["showtoolbar"] + ""))
.ToArray();
foreach (DataRow rightMenu in rightMenuTextButtons)
{
GridRightMenuModel menuModel = new GridRightMenuModel(rightMenu);
if (string.IsNullOrWhiteSpace(menuModel.MenuName))
{
continue;
}
EditorButton editorButton = new EditorButton();
editorButton.Caption = menuModel.MenuName + "";
editorButton.ToolTip = menuModel.MenuName;
editorButton.Kind = ButtonPredefines.Glyph;
editorButton.Width = this.CalculateTextWidth(editorButton.Caption, editorButton.Appearance.Font);
editorButton.Tag = menuModel;
editorButton.Appearance.BackColor = Color.FromArgb(240, 240, 240);
editorButton.Appearance.BorderColor = Color.FromArgb(180, 180, 180);
editorButton.Appearance.ForeColor = Color.FromArgb(50, 50, 50);
editorButton.Appearance.Options.UseBackColor = true;
editorButton.Appearance.Options.UseBorderColor = true;
editorButton.Appearance.Options.UseForeColor = true;
itemButtonEdit.Buttons.Add(editorButton);
columnWidth += editorButton.Width;
}
}
gridColumn.ColumnEdit = itemButtonEdit;
gridColumn.MaxWidth = columnWidth;
gridColumn.MinWidth = columnWidth;
gridColumn.Width = columnWidth;
GridBand emptyBand = this.bandedGridView.Bands.Cast<GridBand>()
.FirstOrDefault(x => string.IsNullOrEmpty(x.Caption));
if (emptyBand == null)
{
emptyBand = new GridBand();
emptyBand.Caption = "";
emptyBand.AppearanceHeader.Options.UseFont = true;
emptyBand.AppearanceHeader.Font = new Font("宋体", 9, FontStyle.Bold);
emptyBand.AppearanceHeader.Options.UseTextOptions = true;
emptyBand.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
this.bandedGridView.Bands.Add(emptyBand);
}
int originalBandWidth = emptyBand.Width;
Dictionary<BandedGridColumn, int> originalColumnWidths = emptyBand.Columns
.Cast<BandedGridColumn>()
.ToDictionary(column => column, column => column.Width);
this.bandedGridView.BeginUpdate();
try
{
emptyBand.Columns.Add(gridColumn);
this.bandedGridView.Columns.Add(gridColumn);
gridColumn.ColVIndex = emptyBand.Columns.Count - 1;
// DevExpress 默认保持 Band 总宽度,新增列时会压缩同一 Band 下的原列。
// 恢复原列宽,并单独为操作列扩展一级表头宽度。
emptyBand.Width = originalBandWidth + columnWidth;
foreach (KeyValuePair<BandedGridColumn, int> item in originalColumnWidths)
{
item.Key.Width = item.Value;
}
gridColumn.Width = columnWidth;
}
finally
{
this.bandedGridView.EndUpdate();
}
this.bandedGridView.OptionsBehavior.EditorShowMode = EditorShowMode.MouseDown;
}
/// <summary>
@@ -574,6 +806,7 @@ namespace Lskj.Control
protected void AddBandColumns(DataTable table, bool readOnly = true)
{
if (table == null) return;
this.gridColumnsInitialized = false;
this.InitGridColumsTab = table;
this.mControlList.Clear();
List<String> bandFieldstr = new List<String>();
@@ -844,6 +1077,8 @@ namespace Lskj.Control
// 加载数据源
//BindDataSource();
this.SetCustomColumns();//加载多表头自定义列
this.gridColumnsInitialized = true;
this.TryInitRightMenuBtnEdit(false);
//多表头冻结
foreach (BandedGridColumn item in FrozenColumns)