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

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, DataGridViewDataErrorEventArgs e)
        {
           // CommonGlobalUtil.WriteLog("DataGridView_DataError");
            if (e.Exception != null)
            {
                CommonGlobalUtil.WriteLog(e.Exception);

            }
            e.Cancel = false;
        }

        private void DataGridView_DataSourceChanged(object sender, EventArgs e)
        {

            if (DataSource == null)
            {
             //   CommonGlobalUtil.WriteLog("DataGridView_DataSourceChanged");
              //  ClearSummary();
            }
        }

        private void DataGridView_RowHeadersWidthChanged(object sender, EventArgs e)
        {
            //  DisableColumnsResizeEvent();

          //  CommonGlobalUtil.WriteLog("DataGridView_RowHeadersWidthChanged");
            SetStyle();
          //  SetColumnsResizeEvent();
        }


        private void DataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (e.RowIndex < 0 || e.ColumnIndex < 0)
                {
                    return;
                }


                if (dataGridView.Columns[e.ColumnIndex].ValueType == typeof(DateTime))
                {
                    if (String.IsNullOrEmpty(e?.Value.ToString()) || SystemDefault.DateTimeNull == (DateTime)e?.Value)
                    {
                        e.Value = null;
                    }
                }

                switch (AutoIndexMode)
                {
                    case DataGridViewAutoIndexMode.NewColumn:
                        if (e.ColumnIndex == autoIndexColumn.Index)
                        {
                            String item = dataGridView.Rows[e.RowIndex].HeaderCell.Value?.ToString();

                            if (!this.IsUnSelectedableRow(dataGridView.Rows[e.RowIndex]))
                            {
                                e.Value = (e.RowIndex + 1) + currentPageIndex * PageSize;
                            }
                            if (IsEmptyRowHeader(dataGridView.Rows[e.RowIndex]))
                            {
                                e.Value = String.Empty;
                            }

                        }
                        break;
                    case DataGridViewAutoIndexMode.RowHeader:
                        //  dataGridView.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1) + currentPageIndex * PageSize;
                        break;
                    case DataGridViewAutoIndexMode.None:
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex) {
                CommonGlobalUtil.WriteLog(ex);
            }

        }

        private void DataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            DataGridView view = sender as DataGridView;
            if (e.Button == System.Windows.Forms.MouseButtons.Right && e.ColumnIndex > -1 && e.RowIndex > -1)  //点击的是鼠标右键,并且不是表头
            {
                //右键选中单元格
                view.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
                contextMenuStripDataGridView.Show(MousePosition.X, MousePosition.Y); //MousePosition.X, MousePosition.Y 是为了让菜单在所选行的位置显示
            }
        }


        private void DataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                //查找下一个tab控件
                this.TopLevelControl.SelectNextControl(this, true, true, true, true);
            }
        }

        private void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            DisableColumnsResizeEvent();
            switch (AutoIndexMode)
            {
                case DataGridViewAutoIndexMode.NewColumn:
                    break;
                case DataGridViewAutoIndexMode.RowHeader:
                    foreach (DataGridViewRow item in this.dataGridView.Rows)
                    {
                        // item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.NotSet;

                        if (!this.IsUnSelectedableRow(item))
                        {
                            this.dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
                            item.HeaderCell.Value = string.Format("{0}", (item.Index + 1) + currentPageIndex * PageSize);
                            this.dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
                        }

                        if (IsEmptyRowHeader(item))
                        {
                            this.dataGridView.RowHeadersWidthChanged -= DataGridView_RowHeadersWidthChanged;
                            item.HeaderCell.Value = String.Empty;
                            this.dataGridView.RowHeadersWidthChanged += DataGridView_RowHeadersWidthChanged;
                        }

                    }
                    break;
                case DataGridViewAutoIndexMode.None:
                    break;
                default:
                    break;
            }
            if (DataSource != null)
            {
               // CommonGlobalUtil.WriteLog("DataGridView_DataBindingComplete");
                SetStyle();

                // ESBasic.CbGeneric cb = new ESBasic.CbGeneric(this.FormatColumns);
                // cb.BeginInvoke(null, null);
            }

            if (!isPaging)
            {
                //if (ColumnDataPropertyNames != null)
                //{
                //    if (dataGridView.Rows.Count > 0)
                //    {
                //        skinLabelTotalCount.Text = "共" + (dataGridView.Rows.Count - 1).ToString() + "行";
                //    }
                //}
                //else
                //{ 
                skinLabelTotalCount.Text = "共" + dataGridView.Rows.Count.ToString() + "行";
                skinLabelTotalCount.Visible = dataGridView.Visible;
                //}
            }


            SetColumnsResizeEvent();

        }

        private int lastWidth;
        private int lastHeight;
        private void DataGridView_Resize(object sender, EventArgs e)
        {
            if (lastWidth != dataGridView.Width || lastHeight != dataGridView.Height)
            {
                lastWidth = dataGridView.Width;
                lastHeight = dataGridView.Height;
             //   CommonGlobalUtil.WriteLog("DataGridView_Resize");
                //  DisableColumnsResizeEvent();
                SetStyle();
                // SetColumnsResizeEvent();
            }
        }

        private Boolean setStyle = true;
        public void DisableStyle() {
            setStyle = false;
        }
        public void EnableStyle()
        {
            setStyle = true;
            SetStyle();
        }
        /// <summary>
        /// 重新调用界面重刷,有头标题改变时也要重调
        /// </summary>
        /// <param name="isInitialize"></param>
        private void SetStyle(Boolean isInitialize = false, DataGridViewAutoSizeColumnsMode mode = DataGridViewAutoSizeColumnsMode.DisplayedCells)
        {
            if (!setStyle) { return; }
           // setStyle = true;
         //   CommonGlobalUtil.WriteLog("SetStyle");
            // DisableColumnsResizeEvent();
            try
            {
                if (CommonGlobalUtil.EngineUnconnectioned(this)) { return; }
                //CheckRowHeader这里调会闪到界面
                // CheckRowHeader();
                //20180531 界面根据内容全部显示...除了备注
                //不能使用allcells 一般尽量使用NONE,实在不行就用AllCells
                dataGridView.AutoSizeColumnsMode = mode;
                //  dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
                int width = this.dataGridView.Size.Width;
                //去掉头宽度,剩余比例分配
                width = width - this.dataGridView.RowHeadersWidth;
                //获取列数和列标题长度
                int columnCount = this.dataGridView.ColumnCount;
                int columnHeaderCount = 0;
                foreach (DataGridViewColumn item in this.dataGridView.Columns)
                {

                    if (item.Visible)
                    {
                        SetAlignment(item);
                        if (!this.dataGridView.AllowUserToOrderColumns)
                        {
                            item.SortMode = DataGridViewColumnSortMode.NotSortable;
                        }
                        //    item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                        //设置长度为标题的长相关
                        item.Resizable = DataGridViewTriState.True;

                        item.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                        //20180531新增判断,如果有特定的列格式,则以这个格式计算适应长度
                        if (specAutoSizeMode != null && specAutoSizeMode.Exists(t => t.Key == item))
                        {
                            TKeyValue<DataGridViewColumn, DataGridViewAutoSizeColumnMode> keyValue = specAutoSizeMode.Find(t => t.Key == item);
                            if (keyValue != null)
                            {
                                item.AutoSizeMode = keyValue.Value;

                                //noset,none,fill会报错20180614,修改盘点时
                                switch (keyValue.Value)
                                {
                                    case DataGridViewAutoSizeColumnMode.NotSet:
                                    case DataGridViewAutoSizeColumnMode.None:
                                    case DataGridViewAutoSizeColumnMode.Fill:
                                        item.Width = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
                                        break;
                                    default:
                                        //  if (CheckAutoSizeMode(keyValue.Value)) { 
                                        item.Width = item.GetPreferredWidth(keyValue.Value, true);
                                        //  }
                                        break;
                                }
                                //不能是noset/none/fill

                                //  if (CheckAutoSizeMode(keyValue.Value))
                                //{
                                item.Width = item.GetPreferredWidth(keyValue.Value, true);
                                //}

                            }

                        }
                        else if (ValidateUtil.IsNumericType(item.ValueType))
                        {
                            //item.Width = item.HeaderText.Length * 20;
                            //根据类型判断 数字
                            int headerWidth = item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.ColumnHeader, true);
                            //数字默认撑满,但是计算肯定慢,初始的时候不需要撑满,拉动的时候也不需要
                            if (isInitialize)
                            {
                                int AllCellsWidth = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
                                item.Width = AllCellsWidth > headerWidth ? AllCellsWidth : headerWidth;
                            }
                            else
                            {
                                int AllCellsWidth = item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
                                item.Width = AllCellsWidth > headerWidth ? AllCellsWidth : headerWidth;
                            }
                        }
                        else
                        {
                            item.Width = item.GetPreferredWidth(GetDataGridViewAutoSizeColumnMode(mode), true);
                        }
                        // }
                        item.FillWeight = item.Width;

                        // item.GetPreferredWidth(DataGridViewAutoSizeColumnMode.ColumnHeader, true);
                        item.MinimumWidth = item.Width;
                        columnHeaderCount += item.Width;
                        // item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
                        //标题总长度
                        SetColumnAutoSizeMode(item);
                    }
                }
                // dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                // 如果

                //行标题宽度会影响整个datagridview的长度20180524,数据加载前没有标题,加载后标题长了。
                if (columnHeaderCount <= width)
                {
                    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                }
                if (isInitialize)
                {
                    if (specAutoSizeMode != null && specAutoSizeMode.Count > 0)
                    {
                        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
                    }
                    else
                    {
                        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
                    }

                }
                else
                {
                    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                }
            }
            catch (Exception ex)
            {
                //  CommonGlobalUtil.ShowError(ex);
            }
            finally
            {
                CommonGlobalUtil.UnLockPage(this);
            }
            //}
          //  SetColumnsResizeEvent();
        }


        /// <summary>
        /// 这个接口未必使用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="totalRow"></param>
        //public void ReLoadSummary<T>(T totalRow) where T : class, new()
        //{
        //    ClearSummary();
        //    if (dataGridView.DataSource != null)
        //    {


        //        if (dataGridView.DataSource != null && dataGridView.DataSource is DataTable)
        //        {
        //            if (totalRow != null)
        //            {
        //                List<T> list = new List<T>();
        //                list.Add(totalRow);
        //                ShowSummary(dataGridView, list, ColumnDataPropertyNames);
        //            }
        //            else
        //            {

        //                DataRow dr = DataGridViewUtil.GetSumRow(dataGridView.DataSource as DataTable, ColumnDataPropertyNames);
        //                ShowSummary(dr, ColumnDataPropertyNames);
        //            }
        //        }
        //        else
        //        {

        //            List<T> calList = new List<T>();
        //            List<T> list =  dataGridView.DataSource as List<T>;

        //            DataGridViewHelper.AddSumRow1(dataGridView, list, calList, ColumnDataPropertyNames, abs4Column);
        //            //   DataGridViewHelper.AddSumRow1<T>(dataGridView, list, calList, ColumnDataPropertyNames, abs4Column);
        //            if (totalRow != null)
        //            {
        //                IStatisticabled obj = totalRow as IStatisticabled;
        //                if (obj != null)
        //                {
        //                    obj.IsStatistics = true;
        //                }
        //                calList.Add(totalRow);
        //            }

        //            ShowSummary(dataGridView, calList, ColumnDataPropertyNames);
        //        }
        //    }
        //}

        private void CheckRowHeader()
        {
            switch (this.autoIndexMode)
            {
                case DataGridViewAutoIndexMode.NewColumn:
                    break;
                case DataGridViewAutoIndexMode.RowHeader:
                    ////加上序号
                    this.dataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
                    this.dataGridView.RowHeadersWidth = 70;
                    dataGridView.RowHeadersDefaultCellStyle.ForeColor = Color.Black;
                    dataGridView.RowHeadersDefaultCellStyle.Font = new Font(DataGridView.DefaultFont, FontStyle.Regular);
                    //  dataGridView.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    break;
                case DataGridViewAutoIndexMode.None:
                    break;
                default:
                    break;
            }
            this.dataGridView.Refresh();
        }

        private DataGridViewAutoSizeColumnMode GetDataGridViewAutoSizeColumnMode(DataGridViewAutoSizeColumnsMode mode)
        {
            DataGridViewAutoSizeColumnMode columnMode = DataGridViewAutoSizeColumnMode.NotSet;
            switch (mode)
            {
                case DataGridViewAutoSizeColumnsMode.AllCells:
                    columnMode = DataGridViewAutoSizeColumnMode.AllCells;
                    break;
                case DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:
                    columnMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
                    break;
                case DataGridViewAutoSizeColumnsMode.DisplayedCells:
                    columnMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                    break;
                case DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:
                    columnMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
                    break;
                case DataGridViewAutoSizeColumnsMode.None:
                    columnMode = DataGridViewAutoSizeColumnMode.None;
                    break;
                case DataGridViewAutoSizeColumnsMode.ColumnHeader:
                    columnMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
                    break;
                case DataGridViewAutoSizeColumnsMode.Fill:
                    columnMode = DataGridViewAutoSizeColumnMode.Fill;
                    break;
                default:
                    break;
            }
            return columnMode;
        }

        private void SetColumnAutoSizeMode(DataGridViewColumn item)
        {
            if (!item.Frozen)
            {
                if (item.GetType() == typeof(DataGridViewLinkColumn))
                {
                    item.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
                else if (item.ValueType == typeof(DateTime))
                {
                    item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
                }
                else
                {
                    item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
                }
            }
        }

        private void SetAlignment(DataGridViewColumn item)
        {
            item.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            if (item.ValueType == typeof(DateTime))
            {
                if (String.IsNullOrEmpty(item.DefaultCellStyle.Format))
                {
                    item.DefaultCellStyle.Format = DateTimeUtil.DEFAULT_DATETIME_FORMAT;
                }
                // item.ValueType = typeof(String);
            }
            else if (item.ValueType == typeof(Date))
            {
                if (String.IsNullOrEmpty(item.DefaultCellStyle.Format))
                {
                    item.DefaultCellStyle.Format = DateTimeUtil.DEFAULT_DATE_FORMAT;
                }
            }
            else
              if (ValidateUtil.IsNumericType(item.ValueType))
            {
                item.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            }
        }
        private EventHandlerList GetEventHandlerList()
        {
            PropertyInfo propertyInfo = dataGridView.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
            EventHandlerList eventList = null;
            if (propertyInfo != null)
            {
                eventList = (EventHandlerList)propertyInfo.GetValue(dataGridView, null);
            }
            return eventList;
        }
        /// <summary>
        /// 获取对应事件的委托
        /// </summary>
        //private void GetDelegate() {
        //    EventHandlerList eventList = GetEventHandlerList();
        //    //  FieldInfo[] fieldInfos=  dataGridView.GetType().GetFields(BindingFlags.Static | BindingFlags.NonPublic);
        //    FieldInfo fieldInfo = dataGridView.GetType().GetField("EVENT_DATAGRIDVIEWSELECTIONCHANGED", BindingFlags.Static | BindingFlags.NonPublic);
        //    if (fieldInfo != null)
        //    {
        //        Delegate delegateInfo = eventList[fieldInfo.GetValue(dataGridView)];
        //        if (delegateInfo != null)
        //        {

        //            Delegate[] delegateList = delegateInfo.GetInvocationList();

        //            foreach (Delegate dInfo in delegateList)
        //            { 
        //               // selectionChanged = dInfo;
        //            }
        //        }
        //    }


        //}
        public void Initialize()
        {
            try
            {

                //   GetDelegate();
                DisableEvents();
                //  dataGridView.SelectionChanged+= selectionChanged;
                //   dataGridView.SelectionChanged-= selectionChanged;
                //   this.Events
                /* 下面的代码是用来获取btnDemo的Click事件注册的方法的 */

                panel5.Visible = false;

                switch (this.autoIndexMode)
                {
                    case DataGridViewAutoIndexMode.NewColumn:
                        ////加上序号 
                        AddIndexRow();
                        break;
                    case DataGridViewAutoIndexMode.RowHeader:
                        //放在SETSTYLE链接界面会闪
                        //dataGridView.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                        CheckRowHeader();
                        break;
                    case DataGridViewAutoIndexMode.None:
                        break;
                    default:
                        break;
                }
                this.pageControlPanel21.Visible = false;
                //if (this.IsInitialized())
                //{
                //    return;
                //}
                //    int[] size = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ,};
                List<ListItem<int>> list = new List<ListItem<int>>();
                for (int i = 1; i < 11; i++)
                {
                    int value = i * 10;
                    list.Add(new ListItem<int>(value.ToString(), value));
                }
                list.Add(new ListItem<int>("最大", int.MaxValue));
                skinComboBoxPageSize.DisplayMember = "Key";
                skinComboBoxPageSize.ValueMember = "Value";
                this.skinComboBoxPageSize.DataSource = list;
                skinComboBoxPageSize.SelectedIndex = 1;
                //设置单选
                this.dataGridView.MultiSelect = false;
                this.dataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
                this.dataGridView.AllowUserToResizeRows = false;

                //已优化:
                //先设置AutoSizeRowsMode = none; 很重要,
                //我的就是因为是allcell所以很慢,修改后快多了。
                DoubleBufferedGridView();

                this.dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
                //设置列头样式
                this.dataGridView.AllowUserToResizeColumns = true;
                //this.dataGridView.RowHeadersWidthSizeMode =  DataGridViewRowHeadersWidthSizeMode.DisableResizing;
                //this.dataGridView.RowHeadersWidth = 70;
                this.dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
                this.dataGridView.BackgroundColor = Color.White;
                //设置列自适应
                //如果是linkcolumn那么就是allCell mode

                //this.dataGridView.= false;
                //设置右键菜单
                this.dataGridView.ContextMenuStrip = this.contextMenuStripDataGridView;
                Control parent = this.dataGridView.Parent;
                ControlCollection collection = parent.Controls;
                int index = 0;
                for (int i = 0; i < collection.Count; i++)
                {
                    Control ctrl = collection[i];

                    if (ctrl == this.dataGridView)
                    {
                        index = i;
                        break;
                    }
                }
                // this.panel1.Dock = this.DataGridView.Dock; 
                this.Dock = this.dataGridView.Dock;
                this.Anchor = this.dataGridView.Anchor;
                if (this.dataGridView.Dock == DockStyle.None)
                {
                    this.Size = this.dataGridView.Size;
                    this.Location = this.dataGridView.Location;
                }
                this.dataGridView.Dock = DockStyle.Fill;
                this.panel4.Controls.Add(this.dataGridView);
                parent.Controls.Add(this);
                parent.Controls.SetChildIndex(this, index);
                this.TabIndex = dataGridView.TabIndex;
                this.BringToFront();
                this.dataGridView.BringToFront();

                this.dataGridView.AccessibleName = "DataGridViewPagingSumCtrl";
                this.PageSizeChange = PageSizeChange;

                SetVisible();
                //skinPanel2.Visible = isPaging;

                ClearSummary();
                SetStyle(true);
                SetPrivateEvent();
            }
            catch (Exception ex)
            {
                CommonGlobalUtil.ShowError(ex);
            }

        }

        private void SetVisible()
        {
            this.pageControlPanel21.Visible = isPaging;
            this.skinComboBoxPageSize.Visible = isPaging;
            this.skinLabel1.Visible = isPaging;
            this.skinPanel2.Visible = this.showRowCounts || isPaging; 
        }

        private DataGridViewTextBoxColumn autoIndexColumn = null;
        public DataGridViewTextBoxColumn AutoIndexColumn { get { return autoIndexColumn; } }
        private DataGridViewAutoIndexMode autoIndexMode = DataGridViewAutoIndexMode.RowHeader;
        /// <summary>
        /// 设置是否添加序列
        /// </summary>
        public DataGridViewAutoIndexMode AutoIndexMode { get { return autoIndexMode; } set { autoIndexMode = value; } }

        private Object DataSource
        {
            get { return this.dataGridView.DataSource; }
            set
            {
                DisableEvents();
                this.dataGridView.DataSource = value;
                EnableEvents();
            }
        }

        private void AddIndexRow()
        {
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.HeaderText = "序号";
            column.Name = "AutoIndexColumn";
            column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            column.SortMode = DataGridViewColumnSortMode.NotSortable;
            autoIndexColumn = column;
            column.Frozen = true;
            dataGridView.Columns.Insert(0, column);
            //  dataGridView.Columns["AutoIndexColumn"].DisplayIndex = 0;//调整列顺序
            // column.DisplayIndex = 0;
        }

        private void DoubleBufferedGridView()
        {
            Type dgvType = this.dataGridView.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
                BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(this.dataGridView, true, null);
        }

        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                DataGridView dgv = sender as DataGridView;

                if (dgv.Columns[e.ColumnIndex].SortMode != DataGridViewColumnSortMode.NotSortable)
                {
                    string columnBindingName = dgv.Columns[e.ColumnIndex].DataPropertyName;
                    switch (dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)
                    {
                        case System.Windows.Forms.SortOrder.None:
                        case System.Windows.Forms.SortOrder.Ascending:
                            CustomSort(columnBindingName, false);
                            dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Descending;
                            break;
                        case System.Windows.Forms.SortOrder.Descending:
                            CustomSort(columnBindingName, true);
                            dgv.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.Ascending;
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                CommonGlobalUtil.ShowError(ex);
            }
        }

        /// <summary>
        /// 关闭一些界面显示影响的事件
        /// </summary>
        private void DisableEvents()
        {
            if (selectionChanged != null)
            {
                //GetDelegate();
                //  EventHandlerList eventHandlerList= GetEventHandlerList();
                //  eventHandlerList.RemoveHandler("EVENT_DATAGRIDVIEWSELECTIONCHANGED", selectionChanged);

                dataGridView.SelectionChanged -= selectionChanged;
            }

          //  DisablePrivateEvent();
        }

        /// <summary>
        /// 开启一些界面显示影响的事件
        /// </summary>
        private void EnableEvents()
        {
            if (selectionChanged != null)
            {
                //  GetDelegate();
                // EventHandlerList eventHandlerList = GetEventHandlerList();
                //   eventHandlerList.AddHandler("EVENT_DATAGRIDVIEWSELECTIONCHANGED", selectionChanged);
                dataGridView.SelectionChanged -= selectionChanged;
                dataGridView.SelectionChanged += selectionChanged;
                // 调用以下
                //   selectionChanged?.Invoke(dataGridView, new EventArgs());
            }
           // SetPrivateEvent();
        }

        /// <summary>
        /// 自定义排序
        /// </summary> 
        private void CustomSort(string columnBindingName, bool ascend)
        {
            ColumnSorting?.Invoke(columnBindingName, ascend);
            //   CommonGlobalUtil.Debug("排序开始:" + columnBindingName);
            DisableEvents();
            List<DataGridViewRow> rowHeaders = new List<DataGridViewRow>();
            foreach (DataGridViewRow row in this.dataGridView.Rows)
            {
                if (!String.IsNullOrEmpty(ValidateUtil.CheckEmptyValue(row.HeaderCell.Value)) && IsUnSelectedableRow(row))
                {

                    rowHeaders.Add(row);
                }
            }
            if (DataSource is DataTable)
            {
                foreach (var item in rowHeaders)
                {
                    dataGridView.Rows.Remove(item);
                }
                if (this.DataSource != null)
                {

                    DataTable dt = this.DataSource as DataTable;
                    DataView dv = dt.DefaultView;
                    dv.Sort = columnBindingName + " " + (ascend ? "ASC" : "DESC");
                    this.DataSource = dv.ToTable();
                    //this.BindingDataSource();
                }
            }
            else if (DataSource is IList)
            { //重新调用服务端查询
                if (OrderPara != null)
                {
                    //483 报表:所有报表都需要排序功能
                    //增加反序字段处理,通过cellFormat渲染显示的值,排序依照指定字段排序
                    if (columnBindingName.Contains("#Revert"))
                    {
                        OrderPara.Ascend = !ascend;
                        OrderPara.ColumnOrderby = columnBindingName.Substring(0, columnBindingName.IndexOf("#Revert"));
                    }
                    else
                    {
                        OrderPara.Ascend = ascend;
                        OrderPara.ColumnOrderby = columnBindingName;
                    }
                    if (isPaging)
                    {
                        PageControlPanel21_CurrentPageIndexChanged(0);
                    }
                    else
                    {
                        OrderSearch.Invoke(null, null);
                    }

                }
            }

            EnableEvents();
            // CommonGlobalUtil.Debug("排序结束:" + columnBindingName);

        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        private void PageControlPanel21_CurrentPageIndexChanged(int obj)
        {
            ///20180618,如果是分页刷新,总数还是有问题,总数只是在初始化查询给的,数据有变也获取 
            currentPageIndex = obj;
          
            this.CurrentPageIndexChanged?.Invoke(obj);
        }


        /// <summary>
        /// 分页查询时触发, 序号、总行数相关显示调用
        /// </summary>
        /// <param name="listPage"></param>
        public void Initialize(BasePage listPage)
        {
            if (listPage != null)
            {
                UpdatePageCount(listPage.TotalEntityCount);

                Initialize(pageCount);

            }
            else
            {
                Initialize(1);
            }
        }

        public void Initialize(int index)
        {
            this.pageCount = index;
            this.pageControlPanel21.Initialize(index);
            this.currentPageIndex = 0;
        }

        private void UpdatePageCount(int totalEntityCount)
        {
            int pageCount = (int)Math.Ceiling((double)totalEntityCount / PageSize);
            this.skinLabelTotalCount.Text = "共" + totalEntityCount + "行";
            InitializePageControl(pageCount);
        }

        private void InitializePageControl(int pageCount)
        {
            this.pageCount = pageCount;
            this.pageControlPanel21.Initialize(pageCount);
            //必须指定跳转到指定页面,否则初始化会重置
            pageControlPanel21.GotoPage(this.currentPageIndex, false);
           // this.currentPageIndex = 0;
        }


        public void ClearSummary()
        {
            // DisableColumnsResizeEvent();
            panel5.Visible = false;
            summaryControlContainer1.Unable();
            summaryControlContainer2.Unable();
            
         //   this.summaryControlContainer1.Visible = false;
           // this.summaryControlContainer2.Visible = false;
           // panel5.Controls.Remove(summaryControlContainer1);
           // panel5.Controls.Remove(summaryControlContainer2);
          //  SetColumnsResizeEvent();
        }

        private void ShowSummary(DataRow dr, string[] columnDataPropertyNames)
        {
            if (dr != null)
            {
                panel5.Visible = true;

               // summaryControlContainer2 = new SummaryControlContainer();
              
                panel5.Controls.Add(summaryControlContainer2);
                summaryControlContainer1.Dock = DockStyle.Top;

                summaryControlContainer2.Init(dataGridView, "总计", dr, columnDataPropertyNames);
                summaryControlContainer2.Visible = true;
            }
        }

        public void ShowSummary<T>(DataGridView dataGridView, List<T> list, string[] columnDataPropertyNames)
        {
            //  CommonGlobalUtil.Debug(" begin ShowSummary");

            if (list != null && list.Count > 0)
            {
                panel5.Visible = true;

             //   summaryControlContainer1 = new SummaryControlContainer(); 
        
                /**
                 * 这里会触发resize事件,name原来的尺寸会变,然后这个时候他也变了、多了这一行,会导致datagridview的高度变化
                 * 
                 * 
                 * */
                panel5.Controls.Add(summaryControlContainer1);
                summaryControlContainer1.Init(dataGridView, list.Count > 1 ? "小计" : "总计", list[0], columnDataPropertyNames);
                summaryControlContainer1.Visible = true;
                if (list.Count > 1)
                {

                 //   summaryControlContainer2 = new SummaryControlContainer();
                 
                    panel5.Controls.Add(summaryControlContainer2);
                    summaryControlContainer1.Dock = DockStyle.Top;
                    summaryControlContainer2.Dock = DockStyle.Bottom;
                    summaryControlContainer2.Init(dataGridView, "总计", list[1], columnDataPropertyNames);
                    summaryControlContainer2.Visible = true;
                }
            }
            //  CommonGlobalUtil.Debug(" end ShowSummary");
        }


         

        public void BindingDataSource<T>(List<T> list,  string[] columns, int? totalCount, T totalRow = default(T), bool[] abs4Column = null,bool isPaging = true) where T : class, new()
        {
            DisableEvents();
            if (columns == null) {
                if (ColumnDataPropertyNames != null) {
                    columns = ColumnDataPropertyNames;
                }
            }
            int count = 0;
            if (totalCount == null) {
                count = 0;
            }
            else {
                count =(int) totalCount;
            }
            UpdatePageCount(count);
            DataGridViewHelper.BindSource4Reports<T>(this, dataGridView, list,  columns, pageCount > 1 ? totalRow : null,abs4Column,isPaging);
            EnableEvents();
        }

        //针对排序用,不支持分页
        /// <summary>
        /// DisableEvents 比如selectchange事件,必须设置否则会刷很多次
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="sortColumn"></param>
        /// <param name="listSortDirection"></param>
        /// 
        //public void BindingDataSource<T>(DataTable dt, T totalRow = default(T))
        //{
        //    BindingDataSource(dt,null, ListSortDirection.Descending, totalRow);
        //}

        public void BindingDataSource<T>(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending, T totalRow = default(T))
        {

            // CommonGlobalUtil.Debug("开始绑定: BindingDataSource(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending)");

            DisableEvents();
            DataRow dr = null;
            this.dataGridView.AllowUserToOrderColumns = true;
            foreach (DataGridViewColumn item in dataGridView.Columns)
            {
                if (item.SortMode != DataGridViewColumnSortMode.NotSortable)
                {
                    //在点击列标题可作为判断是否排序
                    item.SortMode = DataGridViewColumnSortMode.Programmatic;
                }
            }
            ClearSummary();
            if (ColumnDataPropertyNames != null)
            {


                //小计

                if (dt != null && dt.Rows.Count > 0)
                {

                    //    DataRow row = dt.NewRow();
                    //  dt.Rows.Add(row);    
                    this.DataSource = dt;
                    if (totalRow != null)
                    {
                        List<T> list = new List<T>();
                        list.Add(totalRow);
                        ShowSummary(dataGridView, list, ColumnDataPropertyNames);
                    }
                    else
                    {
                        dr = DataGridViewUtil.GetSumRow(dt, ColumnDataPropertyNames);
                        ShowSummary(dr, ColumnDataPropertyNames);
                    }

                    //DataGridViewCellStyle style = new DataGridViewCellStyle();
                    //style.Font = new Font(dataGridView.DefaultCellStyle.Font.Name, dataGridView.DefaultCellStyle.Font.Size, FontStyle.Bold);
                    //this.dataGridView.Rows[this.dataGridView.RowCount - 1].HeaderCell.Value = String.Empty;
                    //this.dataGridView.Rows[this.dataGridView.RowCount - 1].DefaultCellStyle = style;
                    //DataGridViewCellStyle emptyStyle = new DataGridViewCellStyle();
                    //emptyStyle.ForeColor = Color.Transparent;
                    //emptyStyle.SelectionForeColor = Color.Transparent; 
                    // DataGridViewHelper.SetCellContentEmpty(this.dataGridView.Rows[this.dataGridView.RowCount - 1], new String[] { }, emptyStyle);
                }
                else
                {
                    this.DataSource = null;
                }
            }
            else
            {
                if (dt != null)
                {
                    this.DataSource = null;
                }
                this.DataSource = dt;
            }


            if (sortColumn != null)
            {
                dataGridView1_ColumnHeaderMouseClick(dataGridView, new DataGridViewCellMouseEventArgs(sortColumn.Index, 0, 0, 0, new MouseEventArgs(new MouseButtons(), 0, 0, 0, 0)));
            }
            else
            {
                EnableEvents();
            }

            //      CommonGlobalUtil.Debug("开始绑定: BindingDataSource(DataTable dt, DataGridViewColumn sortColumn = null, ListSortDirection listSortDirection = ListSortDirection.Descending)");
        }

        /// <summary>
        /// 需要统计的时候调用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <param name="pageSumEntity"></param>
        /// <param name="toDataTable"></param>
        public void BindingDataSource<T>(List<T> list, T totalRow = default(T), bool isPaging = true) where T : class, new()
        {
            DisableEvents();
            T t = new T();
            if (isPaging)
            {
                t = pageCount > 1 ? totalRow : null;
            }
            else
            {
                t = totalRow;
            }

           // DisableColumnsResizeEvent();
            DataGridViewHelper.BindSource4Reports<T>(this, dataGridView, list, this.ColumnDataPropertyNames, t, isPaging);
      //    SetColumnsResizeEvent();
          //  SetStyle();
            EnableEvents();
        }

        /// <summary>
        /// 判断是否为统计行
        /// </summary>
        /// <param name="row"></param>
        /// <returns></returns>
        public bool IsUnSelectedableRow(DataGridViewRow row)
        {
            if (row != null)
            {
                return (ROW_HEADERS[0] == (row.HeaderCell.Value?.ToString())) || (ROW_HEADERS[1] == (row.HeaderCell.Value?.ToString()));
            }
            else { return false; }
        }
        public bool IsEmptyRowHeader(DataGridViewRow row)
        {
            if (row != null)
            {
                return (DataGridViewHelper.EMPTY_ROW_HEADER == (row.HeaderCell.Value?.ToString()));
            }
            else { return false; }
        }

        private void 复制CToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Clipboard.SetDataObject(this.dataGridView.GetClipboardContent());
        }

    }
}
 

猜你喜欢

转载自blog.csdn.net/jasonhongcn/article/details/86486794