winform 自定义dataGridView 包装控件,带分页自动列宽,小计总计

这是一个关于如何创建一个自定义的Windows Forms DataGridView控件的实现,该控件带有分页功能和自动列宽调整。控件还支持小计和总计的显示,以及上下文菜单。文章详细介绍了控件的各个方法和属性,包括设置数据源、排序事件、显示统计信息等。
摘要由CSDN通过智能技术生成

 

namespace Common.Components
{
    public enum DataGridViewAutoIndexMode
    {
        NewColumn = 1,
        RowHeader = 0,
        None = 2
    }

    public partial class DataGridViewPagingSumCtrl : UserControl
    {

        public void SetDataSource<T>(List<T> list)
        {
            DisableEvents();
            DisableColumnsResizeEvent();
            this.dataGridView.DataSource = null;
            SetColumnsResizeEvent();
            if (list != null && list.Count > 0)
            {
                DataSource = list;
            }
            EnableEvents();
        }
        /// <summary>
        /// 返回菜单组件
        /// </summary>
        public ContextMenuStrip InnerContextMenuStrip
        {
            get
            {
                return this.contextMenuStripDataGridView;
            }
        }

        public ESBasic.Action<String, bool> ColumnSorting;
        /// <summary>
        /// 检查是否显示统计信息,默认不显示
        /// </summary>
      //  private Boolean showSummaryRows = false;
        private const string NEW_COLUMN_NAME_DATETIME_TO_STR = "_DATETIME_TO_STR";

        private bool showRowCounts = true;
        public bool ShowRowCounts
        {
            get
            {
                return showRowCounts;
            }
            set
            {
                showRowCounts = value;
                skinLabelTotalCount.Visible = value;
                SetVisible();
            }
        }
        /// <summary>
        /// 增加序号
        /// </summary>
        public bool AutoIndex
        {
            get { return dataGridView.Columns.Contains(autoIndexColumn); }
            set
            {
                if (value)
                {
                    if (!dataGridView.Columns.Contains(autoIndexColumn))
                    {
                        AddIndexRow();
                        SetStyle();
                    }
                }
                else
                {
                    if (dataGridView.Columns.Contains(autoIndexColumn))
                    {
                        dataGridView.Columns.Remove(autoIndexColumn);
                    }
                }
            }
        }
        //这个要在调用初始化的时候先使用,否则字段模式会变成NOSET,或者直接使用SpecAutoSizeMode设置即可
        public void SpecAutoSizeModeColumns(DataGridViewColumn[] dataGridViewColumn)
        {
            foreach (var item in dataGridViewColumn)
            {
                SpecAutoSizeMode(new TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>(item, item.AutoSizeMode));
            }
        }


        /// <summary>
        /// 解决排序时闪烁的问题,多次变更当前行,致使页面多次刷新,还有重新排序时,禁用刷新页面
        ///</summary>
        public EventHandler SelectionChanged
        {
            get { return selectionChanged; }
            set
            {

                selectionChanged = value;
                //  dataGridView.SelectionChanged
            }
        }
        // internal Delegate selectionChanged;
        private EventHandler selectionChanged;
        private static string[] ROW_HEADERS = new string[] { "小计", "总计" };
        private DataGridView dataGridView;
        private bool isPaging;
        //   private int calRowsCount;
        private PageControlPanel PageControlPanel { get; set; }
        private List<TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>> specAutoSizeMode;
        /// <summary>
        /// 设定特定列的显示方式
        /// </summary>
        /// <param name="keyValue"></param>
        public void SpecAutoSizeMode(TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode> keyValue)
        {
            if (specAutoSizeMode == null)
            {
                specAutoSizeMode = new List<TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode>>();
            }
            specAutoSizeMode.Add(keyValue);
        }

        /// <summary>
        /// 总页数
        /// </summary>
        private int pageCount;
        /// <summary>
        /// 当前页数
        /// </summary>
        private int currentPageIndex;
        private DataTable SourceDataTable { get; set; }
        /// <summary>
        /// 要进行统计的列绑定字段
        /// </summary>
     //   public List<DataGirdViewCalculateColumn> CalculateColumns { get; internal set; }
        public string[] ColumnDataPropertyNames { get; internal set; }

        private CbGeneric<int> CurrentPageIndexChanged;

        public CbGeneric<int> SelectionChange;

        internal void Change_Color(int rowIndex, int columnIndex)
        {
            dataGridView.Rows[rowIndex].Cells[columnIndex].ReadOnly = true;
            DataGridViewCell cell = new DataGridViewTextBoxCell();
            cell.Style.BackColor = Color.Wheat;
            //cell.ReadOnly = true;
            cell.Value = "N";
            cell.Style.BackColor = Color.White;
            dataGridView.Rows[rowIndex].Cells[columnIndex] = cell;
            dataGridView.Rows[rowIndex].Cells[columnIndex].Style.ForeColor = Color.White;
            dataGridView.Rows[rowIndex].Cells[columnIndex].Style.SelectionBackColor = Color.White;
            dataGridView.Rows[rowIndex].Cells[columnIndex].Style.SelectionForeColor = Color.White;
        }

        /// <summary>
        /// 在第一次传参时设置排序参数的默认查询结果,供OrderSearch调用,这个跟服务端功能关系有点多
        /// </summary>
        public BaseOrderPara OrderPara { get; set; }

        public CbGeneric<Object, EventArgs> PageSizeChange { get; set; }
        public int PageSize
        {
            get
            {
                int value = 0;
                try
                {
                    value = int.Parse(this.skinComboBoxPageSize.Text);
                }
                catch (Exception ex)
                {
                    value = (int)this.skinComboBoxPageSize.SelectedValue;
                }
                return value;

            }

        }

        public bool[] abs4Column { get; internal set; }

        /// <summary>
        /// 初始化后调用Search事件调用服务端查询 dataGridViewPagingSumCtrl.OrderSearch += Search;
        /// </summary>
        public ESBasic.Action<Object, EventArgs> OrderSearch;

        public DataGridViewCellFormattingEventHandler CellFormatting;

        internal void Clear()
        {
            this.dataGridView.DataSource = null;
            this.pageControlPanel21.Initialize(1);
        }


        ///没有分页的
        public DataGridViewPagingSumCtrl(DataGridView view, string[] calculateColumns = null)
        {
            InitializeComponent();
            this.dataGridView = view;
            summaryControlContainer1.DGV = view;
            summaryControlContainer2.DGV = view;
            ColumnDataPropertyNames = calculateColumns;
            this.isPaging = false;
        }

        /// <summary>
        /// 需要分页的
        /// </summary>
        /// <param name="view"></param>
        /// <param name="calculateColumns"></param>
        /// <param name="CurrentPageIndexChanged"></param>
        /// <param name="PageSizeChange"></param>
        /// <param name="pagePara">排序的时候使用</param>
        public DataGridViewPagingSumCtrl(DataGridView view, CbGeneric<int> CurrentPageIndexChanged, CbGeneric<object, EventArgs> PageSizeChange, string[] calculateColumns = null)
        {
            InitializeComponent();
            this.dataGridView = view;
            this.isPaging = true;
            summaryControlContainer1.DGV = view;
            summaryControlContainer2.DGV = view;
            ColumnDataPropertyNames = calculateColumns;
            this.CurrentPageIndexChanged = CurrentPageIndexChanged;
            //   Initialize();
        }

        private void SetColumnsResizeEvent()
        {
            DisableColumnsResizeEvent();
             
            dataGridView.Resize += DataGridView_Resize;
            dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
           dataGridView.DataSourceChanged += DataGridView_DataSourceChanged;
           dataGridView.CellFormatting += DataGridView_CellFormatting;
        }
         

        private void DisableColumnsResizeEvent()
        { 
            dataGridView.Resize -= DataGridView_Resize;
            dataGridView.DataSourceChanged -= DataGridView_DataSourceChanged;
            dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
            dataGridView.CellFormatting -= DataGridView_CellFormatting;
        }

        private void SetPrivateEvent()
        {  //分页标签索引改变时触发
          //  DisablePrivateEvent();
            this.dataGridView.DataBindingComplete += DataGridView_DataBindingComplete;
            pageControlPanel21.CurrentPageIndexChanged += PageControlPanel21_CurrentPageIndexChanged;
            dataGridView.DataError += DataGridView_DataError;
            this.dataGridView.CellMouseDown += DataGridView_CellMouseDown;
            dataGridView.ColumnHeaderMouseClick += dataGridView1_ColumnHeaderMouseClick;
            dataGridView.KeyDown += DataGridView_KeyDown;
            //  dataGridView.RowStateChanged += DataGridView_RowStateChanged;

        }


        //private void DisablePrivateEvent()
        //{
        //    DisableColumnsResizeEvent();
        //    this.dataGridView.DataBindingComplete -= DataGridView_DataBindingComplete;
        //    pageControlPanel21.CurrentPageIndexChanged -= PageControlPanel21_CurrentPageIndexChanged;
        //    dataGridView.DataError -= DataGridView_DataError;
        //    this.dataGridView.CellMouseDown -= DataGridView_CellMouseDown;
        //    dataGridView.ColumnHeaderMouseClick -= dataGridView1_ColumnHeaderMouseClick;
        //    dataGridView.KeyDown -= DataGridView_KeyDown;
        //}


        public new void DoubleBuffered(bool buffered)
        {
            if (dataGridView != null)
            {
                dataGridView.DoubleBuffered(buffered);
            }
        }

        /// <summary>
        /// 自动定焦点到指定的可写单元格内
        /// </summary>
        public void AutoFocusToWritableCell()
        {
            DataGridViewUtil.AutoFocusToFirstWritableCell(this.dataGridView);
        }

        //自动滚动到最后一行
        public void ScrollToEnd()
        {
            if (dataGridView != null && dataGridView.RowCount > 0)
            {
                int index = dataGridView.RowCount - 1;
                DataGridViewUtil.ScrollToRowIndex(dataGridView,index);
            }
        }

        public void ScrollToRowIndex(int index)
        {
            DataGridViewUtil.ScrollToRowIndex(dataGridView, index);
        }

        private void DataGridView_DataError(object sender,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟V-SpHeNIC

支持科研技术

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值