GirdControl控件实现代码动态生成表格功能工程下载
二、实现GridControl核心操作类关于GridControl控件的实现表格设置的常用操作,我这边已经封装了一个核心操作类控制,直接使用代码动态操作。
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Test_DevExpressWinform_V1._0.View;
namespace Common
{
class GridControlOpc
{
#region 基础参数
//虚拟数据表
private DataTable _dataTable=new DataTable();
//奇、偶行默认颜色
private Color _oddColor= Color.FromArgb(150, 199, 237, 204);
private Color _evenColor = Color.FromArgb(150, 237, 243, 254);
//选中行、聚焦行的背景颜色
private Color _selectedRowColor= Color.FromArgb(50, 150, 150, 150);
private Color _focusedRowColor= Color.FromArgb(80, 150, 150, 150);
#endregion
#region 公有方法
///
/// 获取到虚拟数据表
///
public DataTable GetDataTable
{
get { return _dataTable; }
}
///
/// 获取到默认的奇数行颜色
///
public Color GetOddColor
{
get { return _oddColor; }
}
///
/// 获取到默认的偶数行颜色
///
public Color GetEvenColor
{
get { return _evenColor;}
}
///
/// 获取到选中行的默认颜色
///
public Color GetSeletedRowColor
{
get { return _selectedRowColor; }
}
///
/// 获取到聚焦行的默认颜色
///
public Color GetFocusedColor
{
get { return _focusedRowColor; }
}
///
/// 获取到当前表格字体
///
/// gridControl组件
/// 返回表格字体
public Font GetGridControlFont(GridControl gridControl)
{
return gridControl.Font;
}
///
/// 绑定表头列、标题、数据
///
/// 实体类模型
/// 表格的列名称和标题显示名称
/// GridControl组件
/// 需要绑定的数据列表
public void BindHeaderAndDataToGridControl(Dictionary columnNameAndCaption,
GridControl gridControl, List dataList) where T:class
{
BindHeaderToGridControl(columnNameAndCaption);
BindDataToGridControl(gridControl, dataList);
}
///
/// 绑定表头列和标题
///
/// 表格的列名称和标题显示名称
public void BindHeaderToGridControl(Dictionary columnNameAndCaption)
{
if (columnNameAndCaption == null || columnNameAndCaption.Count <= 0) return ;
int count = columnNameAndCaption.Count;
for (int i = 0; i < count; i++)
{
DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = columnNameAndCaption.ElementAt(i).Key;
dataColumn.Caption = columnNameAndCaption.ElementAt(i).Value;
if (!_dataTable.Columns.Contains(dataColumn.ColumnName))
{
_dataTable.Columns.Add(dataColumn);
}
}
}
///
/// 绑定数据
///
/// 实体类模型
/// GridControl组件
/// 需要绑定的数据列表
public void BindDataToGridControl(GridControl gridControl, List dataList) where T : class
{
ClearGridControlDatas(gridControl);
if (dataList == null || dataList.Count <= 0) return;
foreach (var item in dataList)
{
//返回信息为类的属性名:值,以逗号分割的字符串(示例【ID:JK001,Name:杨万里,Sex:男,IdCard:523033199001026780,】)
string allPropertiesString = Common.ClassOpc.GetAllProperties(item);
AnalyAllPropertiesToDataTable(allPropertiesString,ref _dataTable);
}
gridControl.DataSource = _dataTable;
}
///
/// 隐藏指定列
///
/// gridView组件
/// 需要隐藏的列索引
public void HideAppointColumn(GridView gridView, int needHideColumnIndex)
{
if (needHideColumnIndex < 0 || needHideColumnIndex > _dataTable.Columns.Count) return;
gridView.Columns[needHideColumnIndex].Visible = false;
}
//
/// 隐藏指定列
///
/// gridView组件
/// 需要隐藏的列索引
public void HideAppointColumn(GridView gridView, string needHideColumnName)
{
if (string.IsNullOrEmpty(needHideColumnName)) return;
GetGridColumn(gridView, needHideColumnName).Visible = false;
}
///
/// 自动适配所有字段列宽度
///
/// gridView组件
public void AutoMatchAllColumnWidth(GridView gridView)
{
gridView.BestFitColumns();
}
///
/// 自动适配某列字段宽度
///
/// gridView组件
/// gridView组件
public void AutoMatchSingleColumnWidth(GridView gridView,int columnIndex)
{
if (columnIndex<0 ||columnIndex > _dataTable.Columns.Count) return;
gridView.Columns[columnIndex].BestFit();
}
///
/// 自动适配某列字段宽度
///
/// gridView组件
/// 列字段名称
public void AutoMatchSingleColumnWidth(GridView gridView, string columnName)
{
if (string.IsNullOrEmpty(columnName)) return;
GetGridColumn(gridView,columnName).BestFit();
}
///
/// 获取到指定列名称对应的列
///
/// gridView组件
/// 列字段名称
/// 返回当前指定列名称对应的列
public GridColumn GetGridColumn(GridView gridView, string columnName)
{
if (string.IsNullOrEmpty(columnName)) return null;
foreach (GridColumn item in gridView.Columns)
{
if (columnName == item.FieldName)
{
return item;
}
}
return null;
}
///
/// 设置标题头的ShowGroupPanel
///
/// gridView组件
/// showGroupPanel显示的标题文本
/// 是否显示(true:表示显示)
public void SettingShowHeaderGroup(GridView gridView, string showGroupPanelText, bool isShow)
{
gridView.OptionsView.ShowGroupPanel = isShow;
gridView.GroupPanelText = showGroupPanelText;
}
///
/// 设置自动生成序号
///
/// gridView组件
/// 宽度
public void SettingAutoGenerateNumber(GridView gridView,int numberWidth=36)
{
gridView.IndicatorWidth = numberWidth;
}
///
/// 设置表头显示名称的字体
///
/// gridView组件
/// 字体
public void SettingGirdHeaderFont(GridView gridView,Font font)
{
gridView.Appearance.HeaderPanel.Font = font;
}
///
/// 设置表头显示名称字体颜色
///
/// gridView组件
/// 字体颜色
public void SettingGridHeaderFontColor(GridView gridView, Color color)
{
int count = gridView.Columns.Count;
for (int i = 0; i < count; i++)
{
gridView.Columns[i].AppearanceHeader.ForeColor = color;
}
}
///
/// 设置表格行显示名称的字体
///
/// gridView组件
/// 字体
public void SettingGirdRowFont(GridView gridView, Font font)
{
gridView.Appearance.Row.Font = font;
}
///
/// 设置奇偶行背景颜色,统一风格
///
/// gridView组件
/// 奇数行颜色
/// 偶数行颜色
public void SettingOddEvenRowColor(GridView gridView,Color oddColor, Color evenColor)
{
gridView.Appearance.OddRow.BackColor = oddColor;
gridView.Appearance.EvenRow.BackColor = evenColor;
gridView.OptionsView.EnableAppearanceOddRow = true;
gridView.OptionsView.EnableAppearanceEvenRow = true;
}
///
/// 设置奇偶行默认背景颜色,统一风格
///
/// grid组件
public void SettingOddEvenRowDefaultColor(GridView gridView)
{
gridView.Appearance.OddRow.BackColor = _oddColor;
gridView.Appearance.EvenRow.BackColor = _evenColor;
gridView.OptionsView.EnableAppearanceOddRow = true;
gridView.OptionsView.EnableAppearanceEvenRow = true;
}
///
/// 设置选中行颜色
///
/// GridView组件
public void SettingSelectedRowColor(GridView gridView, Color selectedRowColor, Color focusedColor)
{
gridView.Appearance.SelectedRow.BackColor = selectedRowColor;
gridView.Appearance.FocusedRow.BackColor = focusedColor;
}
///
/// 设置选中行默认颜色
///
/// GridView组件
public void SettingSelectedRowDefaultColor(GridView gridView)
{
gridView.Appearance.SelectedRow.BackColor = _selectedRowColor;
gridView.Appearance.FocusedRow.BackColor = _focusedRowColor;
}
///
/// 设置表格是否允许编辑
///
/// GridView组件
/// 是否允许编辑(true:表示允许)
public void SettingGridIsEdit(GridView gridView,bool isEdit)
{
gridView.OptionsBehavior.Editable = isEdit;
}
///
/// 设置GridView中可编辑的列
///
/// GridView组件
/// 需要编辑的列列表
public void SettingEditColumn(GridView gridView, string needEditColumnName)
{
if (!string.IsNullOrEmpty(needEditColumnName))
{
//打开可编辑的开关
SettingGridIsEdit(gridView, true);
//先全部设置为不可编辑
foreach (GridColumn item in gridView.Columns)
{
item.OptionsColumn.AllowEdit = false;
}
//打开允许编辑的列
foreach (GridColumn item in gridView.Columns)
{
if (needEditColumnName == item.FieldName)
{
item.OptionsColumn.AllowEdit = true;
break;
}
}
}
}
///
/// 设置GridView中可编辑的列
///
/// GridView组件
/// 需要编辑的列列表
public void SettingEditColumns(GridView gridView, List needEditColumnNameList)
{
if (needEditColumnNameList != null && needEditColumnNameList.Count > 0)
{
//打开可编辑的开关
SettingGridIsEdit(gridView, true);
//先全部设置为不可编辑
foreach (GridColumn item in gridView.Columns)
{
item.OptionsColumn.AllowEdit = false;
}
//打开允许编辑的列
for (int i = 0; i < needEditColumnNameList.Count; i++)
{
foreach (GridColumn item in gridView.Columns)
{
if (needEditColumnNameList[i] == item.FieldName)
{
item.OptionsColumn.AllowEdit = true;
break;
}
}
}
}
}
///
/// 清空数据
///
public void ClearGridControlDatas(GridControl gridControl, GridView gridView=null)
{
_dataTable?.Clear();
gridControl.DataSource = null;
//gridView.Columns?.Clear();
}
#region 设置表格多选
///
/// 设置表格行能够多选全选
///
/// gridView组件
public void SettingGridRowsMutiSelect(GridView gridView)
{
//禁用数据编辑功能
gridView.OptionsBehavior.Editable = false;
//设置可以选中多行
gridView.OptionsSelection.MultiSelect = true;
gridView.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
}
///
/// 获取到所有选中行的所有数据
///
/// gridView组件
public string GetSelectedAllDatas(GridView gridView)
{
//获取到当前选择行的行号
int[] rows = gridView.GetSelectedRows();
string strTmp = null;
int len = rows.Length;
for (int i = 0; i < len; i++)
{
//获取到每一行的数据
foreach (GridColumn item in gridView.Columns)
{
//获取到当前行的所有数据
strTmp += gridView.GetDataRow(rows[i])[item.FieldName].ToString() + ",";
}
strTmp += ",";
}
return strTmp;
}
#endregion
#endregion
#region 私有方法
///
/// 解析类中的所有属性和对应值字符串到DataTable中
///
/// 实体类的所有属性和值信息字符串
/// 虚拟数据表
private static void AnalyAllPropertiesToDataTable(string strClassAllProperties, ref DataTable dt)
{
if (string.IsNullOrEmpty(strClassAllProperties)) return;
DataRow row = dt.Rows.Add();
string[] splitDatas = strClassAllProperties.Split(',');
int len = splitDatas.Length - 1;
for (int i = 0; i < len; i++)
{
string[] strSingle = splitDatas[i].Split(':');
row[strSingle[0]] = strSingle[1];
}
}
#endregion
}//Class_end
}
三、使用方法
准备测试实体类和数据
//人员信息模型类
internal class PeopleInfo
{
public string ID { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public string IdCard { get; set; }
}
//模拟数据
List peopeoInfos = new List()
{
new PeopleInfo{ ID="SL009",Name="谭维维",Sex="男",IdCard="523033100001"},
new PeopleInfo{ ID="SL008",Name="司一航",Sex="男",IdCard="523033100002"},
new PeopleInfo{ ID="SL007",Name="周倩",Sex="男",IdCard="523033100003"},
new PeopleInfo{ ID="SL006",Name="王一星",Sex="男",IdCard="523033100004"},
new PeopleInfo{ ID="SL005",Name="策俊逸",Sex="男",IdCard="523033100005"},
new PeopleInfo{ ID="SL004",Name="周茜",Sex="男",IdCard="523033100006"},
new PeopleInfo{ ID="SL003",Name="司王成",Sex="男",IdCard="523033100007"},
new PeopleInfo{ ID="SL002",Name="杨思凡",Sex="男",IdCard="523033100008"},
new PeopleInfo{ ID="SL001",Name="策一方",Sex="男",IdCard="523033100009"},
};
3.1、绑定列表的字段和显示名称
该内容需要放在GridControl的构造函数中
Dictionary3.2、可以直接绑定数据但不实现分页dic = new Dictionary (); dic.Add("ID","编号"); dic.Add("Name", "姓名"); dic.Add("Sex", "性别"); dic.Add("IdCard", "身份证号"); //绑定表头列和标题 gridControlOpc.BindHeaderToGridControl(dic); //获取GridControl的字体(可选) Font font = gridControlOpc.GetGridControlFont(gridControl1); //设置表格标题头的字体(可选) gridControlOpc.SettingGirdHeaderFont(gridView1,font); //设置表格头字体颜色(可选) gridControlOpc.SettingGridHeaderFontColor(gridView1,Color.Gray); //设置表格行的字体(可选) gridControlOpc.SettingGirdRowFont(gridView1, font); //设置标题头的ShowGroupPanel(可选) gridControlOpc.SettingShowHeaderGroup(gridView1,"人员信息表",false);
该内容需要放在GridControl的构造函数中
//绑定数据 gridControlOpc.BindDataToGridControl(gridControl1,GetPeopeoInfos());3.3、也可以直接使用分页功能绑定数据
该内容需要放在GridControl的构造函数中【只用在该构造函数中调用: //初始化分页
InitSplitGridPages(peopeoInfos,3);方法即可】
#region 表格分页
private int _curPage = 1;
private int _pageSize = 3;
private int _totalSize = 0;
///
/// 表格分页初始化
///
/// 数据实体类
/// 数据列表
/// 每页显示的数据条数(需要大于 0)
/// 当前页码(一般默认为 1)
private void InitSplitGridPages(List dataList, int pageSize,int curPageIndex=1) where T:class
{
if (dataList == null || dataList.Count <= 0 || curPageIndex<1 || pageSize <=0) return;
_curPage = curPageIndex;
_pageSize = pageSize;
_totalSize =dataList.Count;
gridPageOpcTools1.pageDataEvent += gridPageOpcTools1_pageEvent;
gridPageOpcTools1.SettingSinglePageSize(_pageSize);
gridPageOpcTools1.pageSizeEvent += gridPageOpcTools1_pageSizeEvent;
FillGridByPage(_curPage, _pageSize, _totalSize);
}
///
/// 表格分页事件
///
/// 当前页面索引
/// 当前页面显示的数据行数
private void gridPageOpcTools1_pageEvent(int curPage, int pageSize)
{
_curPage = curPage;
_pageSize = pageSize;
FillGridByPage(_curPage, _pageSize, _totalSize);
}
///
/// 通过指定页面填充表格(一次加载数据到缓存,然后进行分页)
///
/// 当前页面索引
/// 当前页面显示的数据行数
/// 当前需要显示的数据总数
private void FillGridByPage(int curPage ,int pageSize,int totalSize)
{
if (curPage < 1 || pageSize<=0
||_totalSize < 1|| _totalSize tmpData = new List();
int curPageIndex = (curPage-1)*pageSize;
int curPageSizeIndex = curPage * pageSize;
if (pageSize>totalSize|| curPageSizeIndex>totalSize)
{
curPageSizeIndex = totalSize;
}
for (int i = curPageIndex; i < curPageSizeIndex; i++)
{
tmpData.Add(peopeoInfos[i]);
}
BindCurPageDatas(gridControl1,
gridPageOpcTools1, curPage, pageSize, totalSize, tmpData);
gridPageOpcTools1.RefreshPage(pageSize, totalSize, curPage);
}
///
/// 绑定当前页面数据
///
/// 数据实体类
/// gridControl组件名称
/// 自定义的分页组件名称
/// 当前页索引
/// 当前页面显示的数据行数
/// 需要显示的数据总数
/// 数据列表
public void BindCurPageDatas(GridControl gridControl,
GridPageOpcTools gridPageOpcTools, int curpage,
int pageSize,int totalSize, List dataList) where T : class
{
gridControlOpc.BindDataToGridControl(gridControl, dataList);
gridControl.MainView.PopulateColumns();
gridPageOpcTools.RefreshPage(pageSize, totalSize, curpage);
}
///
/// 选择页码事件
///
/// 当前页码显示的数据条数
private void gridPageOpcTools1_pageSizeEvent(int pageSize)
{
_pageSize = pageSize;
FillGridByPage(_curPage, pageSize, _totalSize);
}
#endregion
3.4、设置表格全选
该内容需要放在GridControl的构造函数中
//设置表格全选 gridControlOpc.SettingGridRowsMutiSelect(gridView1);3.5、其他设置
该内容需要放在GridControl的构造函数中
//自动适配所有字段列宽度
gridControlOpc.AutoMatchAllColumnWidth(gridView1);
//自动适配某列字段宽度
//gridControlOpc.AutoMatchSingleColumnWidth(gridView1,0);
gridControlOpc.AutoMatchSingleColumnWidth(gridView1, "IdCard");
//设置奇偶行颜色
gridControlOpc.SettingOddEvenRowDefaultColor(gridView1);
//设置选择行颜色
gridControlOpc.SettingSelectedRowDefaultColor(gridView1);
//设置表格是否允许编辑
gridControlOpc.SettingGridIsEdit(gridView1, false);
关于GridControl的其他细节操作可以参考
①DevExpress GridControl 使用方法技巧 总结 收录整理 - 电子灵魂 - 博客园 (cnblogs.com)
②DevExpress使用教程:GridView经验小结



