栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

DevExpress中使用GridControl控件实现表格(代码动态生成)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DevExpress中使用GridControl控件实现表格(代码动态生成)

一、实现效果

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的构造函数中

 Dictionary 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);
3.2、可以直接绑定数据但不实现分页

该内容需要放在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经验小结

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023325.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号