多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

DevExpress GridControl 常用属性设置:从列宽到分组汇总的实战清单

DevExpress GridControl 常用属性设置:从列宽到分组汇总的实战清单 1. 从一次“列宽失控”说起GridControl 高频属性到底该配哪些如果你正在做 WinForms 数据列表DevExpress GridControl 大概率是你绕不开的控件。它功能强但属性多到让人眼花OptionsView、OptionsCustomization、OptionsSelection、ColumnEdit、AppearanceCell……一个表格要看起来专业、用起来顺手往往不是拖几个列就完事而是要把列宽、分组、汇总、行样式、编辑权限这些属性按场景配好。这篇面向 WinForms 开发者聚焦 DevExpress GridControl 在数据列表场景中的高频属性配置覆盖列宽自适应、分组汇总、行样式与编辑控制。我会给出可直接复制的属性代码片段与设计器操作步骤并给出运行后逐项验证的检查动作。你可以把它当成一份“属性设置实战清单”遇到具体需求直接翻到对应小节抄配置。先说一个我踩过的坑很多人第一次用 GridControl绑定数据后发现列宽要么挤成一团要么留一大片空白手动拖完换个分辨率又乱了。根本原因是OptionsView.ColumnAutoWidth和BestFitColumns的配合没搞对。下面从列宽开始一项项拆。核心检索词先明确DevExpress GridControl 常用属性设置本质是围绕 GridView 的 Options 系列、列级 OptionsColumn、以及 RepositoryItem 编辑器三类对象做配置。适合谁适合已经能把数据绑上 GridControl、但想让表格更“像成品”的 WinForms 开发者。2. 列宽自适应与基础外观BestFitColumns 与 OptionsView 属性设置实战列宽是 GridControl 最容易被吐槽的点。默认ColumnAutoWidth true时所有列平分宽度长文本被截断设成 false 后列宽固定数据少时右边一大片灰。正确做法是先关闭自动宽度逐列 BestFit再根据总宽决定是否回退到自动铺满。下面这段是我常用的列宽自适应方法直接放进静态工具类即可public static void BestFitColumns(GridView gridView) { gridView.BeginUpdate(); gridView.BestFitMaxRowCount 1000; // 最多采样1000行避免大数据卡顿 gridView.OptionsView.ColumnAutoWidth false; // 先关自动宽度 int iWidth 0; foreach (GridColumn col in gridView.Columns) { if (!col.Visible) continue; col.OptionsColumn.FixedWidth false; col.OptionsColumn.AllowSize true; col.BestFit(); // 单列按内容自适应 iWidth col.Width; } // 如果所有列加起来还没控件宽就回退到自动铺满 if (gridView.GridControl ! null iWidth gridView.GridControl.Width) { gridView.OptionsView.ColumnAutoWidth true; gridView.BestFitColumns(); } gridView.EndUpdate(); }关键点有三个。第一BestFitMaxRowCount一定要设默认值在大数据量下会遍历所有行算宽度界面直接卡死设成 1000 表示只采样前 1000 行足够代表列宽。第二BeginUpdate/EndUpdate包住避免每列调整都触发重绘。第三回退逻辑很重要列少时自动铺满列多时保持各自宽度并出现横向滚动条。基础外观方面OptionsView控制的是“表格长什么样”。常用组合如下gridView.OptionsView.ShowGroupPanel false; // 隐藏顶部分组拖拽区 gridView.OptionsView.EnableAppearanceEvenRow true; // 偶数行底色 gridView.OptionsView.EnableAppearanceOddRow false; gridView.OptionsView.ShowIndicator false; // 隐藏左侧行指示器 gridView.OptionsView.ShowFooter true; // 显示底部汇总行 gridView.OptionsView.RowAutoHeight false; // 行高固定性能更好EnableAppearanceEvenRow配合Appearance.EvenRow.BackColor就能做出斑马纹。注意别同时开 EvenRow 和 OddRow否则视觉上会打架。行高方面RowAutoHeight false是性能优先的选择如果某列文本必须换行再单独开Column.AutoHeight或用AppearanceCell.TextOptions.WordWrap。设计器操作步骤选中 GridControl在属性窗口找到MainView展开OptionsView逐项勾选。ColumnAutoWidth在OptionsView下BestFitMaxRowCount在 GridView 根级。改完记得点“应用”运行时用gridView.BestFitColumns()触发一次。验证动作绑定 5 列、20 行数据运行后看列宽是否贴合内容把窗口拉宽列少时应自动铺满列多时应出现横向滚动条把窗口拉窄确认没有列被压到 0 宽。3. 分组、汇总与编辑控制OptionsCustomization 与 OptionsColumn 配置清单分组和汇总是数据列表的“专业感”来源。GridControl 默认允许用户拖列头到分组区但很多业务场景不希望用户乱拖这时就要用OptionsCustomization关掉。gridView.OptionsCustomization.AllowColumnMoving false; // 禁止拖动列 gridView.OptionsCustomization.AllowGroup false; // 禁止用户分组 gridView.OptionsCustomization.AllowFilter false; // 禁止筛选 gridView.OptionsCustomization.AllowSort false; // 禁止排序 gridView.OptionsMenu.EnableColumnMenu false; // 关列头右键菜单 gridView.OptionsMenu.EnableFooterMenu false; gridView.OptionsMenu.EnableGroupPanelMenu false;如果你需要“程序控制分组”而不是“用户分组”就把AllowGroup设为 false然后在代码里手动加分组列gridView.Columns[Department].GroupIndex 0; // 按部门分组 gridView.ExpandAllGroups(); // 展开所有组汇总行用GridColumn.SummaryItem配置。比如对“金额”列求和、对“数量”列求平均var amountCol gridView.Columns[Amount]; amountCol.SummaryItem.SummaryType DevExpress.Data.SummaryItemType.Sum; amountCol.SummaryItem.DisplayFormat 合计{0:n2}; amountCol.SummaryItem.FieldName Amount; var qtyCol gridView.Columns[Qty]; qtyCol.SummaryItem.SummaryType DevExpress.Data.SummaryItemType.Average; qtyCol.SummaryItem.DisplayFormat 均值{0:n0};分组内的汇总需要GroupSummary在gridView.GroupSummary里 Add 一个GridGroupSummaryItem指定FieldName、SummaryType、ShowInGroupColumnFooter。这样每个分组底部会显示小计。编辑控制是另一个高频需求。默认所有列可编辑但业务上往往只有部分列能改。列级用OptionsColumn.AllowEditgridView.Columns[Id].OptionsColumn.AllowEdit false; // 主键只读 gridView.Columns[Name].OptionsColumn.AllowEdit true; // 名称可改 gridView.Columns[Status].OptionsColumn.AllowEdit true;批量设置只读foreach (GridColumn col in gridView.Columns) col.OptionsColumn.AllowEdit false;下拉列表列用RepositoryItemLookUpEdit这是 GridControl 里最常用的编辑器之一。配置时注意DataSource、DisplayMember、ValueMember三件套以及DropDownRows控制下拉显示行数var riLookup new RepositoryItemLookUpEdit(); riLookup.DataSource statusList; // ListStatus 之类 riLookup.DisplayMember Name; // 显示文本 riLookup.ValueMember Code; // 实际值 riLookup.DropDownRows 6; riLookup.NullText 请选择; gridView.Columns[Status].ColumnEdit riLookup;这里有个容易忽略的点ValueMember必须和绑定字段类型一致。如果字段是 intValueMember是 string运行时会报类型转换错误。验证动作双击单元格确认下拉出现且选中后值正确回写把AllowEdit设为 false 的列双击确认无法进入编辑态。4. 行样式、对齐与列头Appearance 系列属性逐项验证表格好不好看一半在行样式和对齐。Appearance系列属性分三层Appearance.Row管整行AppearanceCell管单元格AppearanceHeader管列头。优先级是单元格 行 全局。斑马纹配置gridView.Appearance.EvenRow.BackColor Color.FromArgb(245, 248, 252); gridView.Appearance.EvenRow.Options.UseBackColor true; gridView.OptionsView.EnableAppearanceEvenRow true;注意Options.UseBackColor true必须设否则颜色不生效——这是新手最常见的“设了没反应”原因。对齐方式用TextOptions.HAlignment。数值列右对齐、文本列左对齐、状态列居中是通用做法gridView.Columns[Amount].AppearanceCell.TextOptions.HAlignment HorzAlignment.Far; gridView.Columns[Amount].AppearanceHeader.TextOptions.HAlignment HorzAlignment.Center; gridView.Columns[Name].AppearanceCell.TextOptions.HAlignment HorzAlignment.Near; gridView.Columns[Status].AppearanceCell.TextOptions.HAlignment HorzAlignment.Center;批量设置foreach (GridColumn col in gridView.Columns) { col.AppearanceHeader.TextOptions.HAlignment HorzAlignment.Center; col.AppearanceCell.TextOptions.HAlignment HorzAlignment.Near; }列头高度和字体gridView.ColumnPanelRowHeight 32; gridView.Appearance.HeaderPanel.Font new Font(微软雅黑, 9F, FontStyle.Bold); gridView.Appearance.HeaderPanel.Options.UseFont true; gridView.Appearance.HeaderPanel.TextOptions.HAlignment HorzAlignment.Center;行高和选中样式gridView.RowHeight 28; gridView.OptionsSelection.EnableAppearanceFocusedCell false; // 不单独高亮单元格 gridView.OptionsSelection.EnableAppearanceFocusedRow true; // 高亮整行 gridView.Appearance.FocusedRow.BackColor Color.FromArgb(204, 232, 255); gridView.Appearance.FocusedRow.Options.UseBackColor true;条件行样式用RowStyle事件比如金额为负标红gridView.RowStyle (s, e) { if (e.RowHandle 0) return; var amount Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, Amount)); if (amount 0) e.Appearance.ForeColor Color.Red; };验证动作运行后逐项检查——偶数行是否有底色、列头是否居中加粗、选中行是否整行高亮、负数行是否变红。如果某项没生效先查对应的Options.UseXxx是否为 true。5. 常见报错与排查从 NullReference 到编辑态异常的定位方法GridControl 的报错大多集中在“列名找不到”“编辑器类型不匹配”“事件里取值为空”三类。下面按真实报错逐条排查。报错一NullReferenceException位置在gridView.Columns[Xxx]。原因通常是列名拼错或列还没创建就访问。排查先打印所有列名确认。foreach (GridColumn col in gridView.Columns) Console.WriteLine(${col.FieldName} / {col.Name} / {col.Caption});注意Columns[Xxx]索引的是FieldName或Name不是Caption。如果绑定的是 DataTableFieldName 就是列名如果是对象列表FieldName 是属性名。报错二InvalidCastException下拉列选中后报类型转换。原因ValueMember类型和绑定字段类型不一致。排查确认ValueMember指向的属性类型和 GridColumn 绑定字段类型一致。比如字段是int StatusIdValueMember就应是 int 类型的属性。报错三编辑后值没保存。原因gridView.PostEditor()没调用或数据源不支持通知。排查在CellValueChanged事件里确认新值如果用的是ListT需要实现INotifyPropertyChanged或改用BindingListT。gridView.CellValueChanged (s, e) { if (e.Column.FieldName Status) { gridView.PostEditor(); // 提交编辑器值 gridView.UpdateCurrentRow(); // 更新到数据源 } };报错四BestFitColumns后界面卡顿。原因BestFitMaxRowCount没设或设太大。排查设成 500~1000并用BeginUpdate/EndUpdate包裹。报错五分组后汇总不显示。原因只设了SummaryItem没设GroupSummary或ShowFooter为 false。排查确认OptionsView.ShowFooter true分组汇总要加到gridView.GroupSummary而不是列上。报错六AllowEdit false但单元格仍可编辑。原因列级OptionsColumn.AllowEdit被 View 级OptionsBehavior.Editable覆盖。排查确认gridView.OptionsBehavior.Editable的值View 级为 false 时所有列都不可编辑。报错七设计器改了属性但运行不生效。原因代码里在InitializeComponent之后又覆盖了属性。排查把代码里的属性设置放到InitializeComponent之后或统一在Form_Load里配置。排查通用思路先确认属性设在了正确的对象上View 级还是 Column 级再确认Options.UseXxx是否开启最后确认设置时机在数据绑定之前还是之后。多数“没反应”都是这三步里的一步错了。6. 把属性配置沉淀成工具类复用与后续扩展建议属性配置写多了会发现很多设置是跨项目复用的。建议把常用配置抽成静态工具类比如DevGridControl把BestFitColumns、SetGridViewOptions、SetGridViewColumnEdit、SetGridViewColumnLookUpEdit这些方法收进去。这样新项目里一行调用就能把表格初始化好。工具类设计上注意两点。第一方法参数尽量用GridView而不是GridControl因为属性都在 View 上。第二涉及列名的方法要加空判断避免列不存在时抛异常public static void SetColumnVisible(GridView view, string fieldName, bool visible) { var col view.Columns.ColumnByFieldName(fieldName); if (col ! null) col.Visible visible; }ColumnByFieldName比Columns[Xxx]更安全找不到时返回 null 而不是抛异常。后续扩展方向如果表格要支持导出可以在工具类里加ExportToExcel如果要支持列布局保存用gridView.SaveLayoutToXml和RestoreLayoutFromXml用户调整过的列宽、分组、排序都能持久化。这两个功能配合属性配置基本能覆盖大部分数据列表场景。最后给一个实用技巧调试属性时把gridView.OptionsView.ShowIndicator true临时打开能看到行号方便定位是哪一行触发了RowStyle。调完再关掉。属性配置没有银弹关键是理解每个 Options 控制的是哪一层然后按场景组合。上面这些片段你可以直接复制到项目里改改列名就能跑。
返回列表