欢迎莅临 SUN WU GANG 的园子!!!

世上无难事,只畏有心人。有心之人,即立志之坚午也,志坚则不畏事之不成。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;

namespace ZB.QueueSys.Common
{
    public class DataGridViewHelper
    {
        //定义一个用于保存静态变量的实例
        private static DataGridViewHelper instance = null;
        //定义一个保证线程同步的标识
        private static readonly object locker = new object();
        //构造函数为私有,使外界不能创建该类的实例
        private DataGridViewHelper() { }
        public static DataGridViewHelper Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (locker)
                    {
                        if (instance == null) instance = new DataGridViewHelper();
                    }
                }
                return instance;
            }
        }

        public TModel GetCurrentRowModelObj<TModel>(DataGridView dgv)
        {
            return (TModel)dgv.CurrentRow.DataBoundItem;
        }

        public List<DataGridViewRow> GetSelectRowByColName(DataGridView dgv, string colName)
        {
            if (dgv.Rows.Count == 0) return null;
            var checkedRows = from DataGridViewRow row in dgv.Rows
                              where (bool)row.Cells[colName].Value//(bool)row.Cells["ColSelect"].Value
                              select row;
            List<DataGridViewRow> temp = checkedRows as List<DataGridViewRow>;
            return temp;
        }

        public DgvSortHelper<T> GetSorDataSource<T>(List<T> list)
        {
            DgvSortHelper<T> temps = new DgvSortHelper<T>();
            foreach (T item in list)
            {
                temps.Add(item);
            }
            return temps;
        }

        public void SelectAllDgv(DataGridView dgv, string cellName, bool isChecked)
        {
            if (dgv.Rows.Count == 0) return;

            dgv.ClearSelection();
            int count = dgv.Rows.Count;
            for (int i = 0; i < count; i++)
            {
                dgv.Rows[i].Cells[cellName].Value = isChecked;
            }
            dgv.RefreshEdit();
        }

        public void SetDgvColTextByColName(DataGridView dgv, string colName, string headerText)
        {
            if (headerText.EndsWith(":") || headerText.EndsWith(":"))
            {
                headerText = headerText.Replace(":", "");
                headerText = headerText.Replace(":", "");
            }
            dgv.Columns[colName].HeaderText = headerText;
        }

        public void SetDgvRowColor(DataGridView dgv)
        {
            dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(204, 224, 233);
        }

        public void SetDgvRowColor(DataGridView dgv, Color color)
        {
            dgv.AlternatingRowsDefaultCellStyle.BackColor = color;
            dgv.AutoGenerateColumns = false;
        }

        public void SetDgvStyle(DataGridView dgv, Color color)
        {
            dgv.AlternatingRowsDefaultCellStyle.BackColor = color;
            dgv.AutoGenerateColumns = false;
        }
        public Color StrAGBToColor(string agb)
        {
            string[] colors = agb.Split(',');
            return Color.FromArgb(int.Parse(colors[0]), int.Parse(colors[1]), int.Parse(colors[2]));
        }

        /// <summary>
        /// 重绘DataGridView
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="e"></param>
        public void PaintDgv(DataGridView dgv, DataGridViewRowPostPaintEventArgs e)
        {
            try
            {
                SolidBrush b = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
                e.Graphics.DrawString((e.RowIndex + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture),
                    dgv.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 5, e.RowBounds.Location.Y + 4);

                // 改变第一列列头内容
                dgv.EnableHeadersVisualStyles = false;//允许更改行、列头的字体颜色
                dgv.TopLeftHeaderCell.Value = dgv.RowCount.ToString();
                dgv.TopLeftHeaderCell.Style.ForeColor = Color.Salmon;
                dgv.TopLeftHeaderCell.Style.Font = new Font("微软雅黑", 10, FontStyle.Bold);
                dgv.TopLeftHeaderCell.ToolTipText = "查询数据总量为:" + dgv.RowCount.ToString() + "(条)";
            }
            catch { return; }
        }

        public void SetDgvNumCloByRowStateChanged(DataGridView dgv, DataGridViewRowStateChangedEventArgs e)
        {
            int rowCounts = dgv.Rows.Count;
            // 改变第一列列头内容
            if (rowCounts == 0) dgv.TopLeftHeaderCell.Value = string.Empty;
        }

    }

    #region DgvSortHelper
    public class DgvSortHelper<T> : BindingList<T>
    {
        private bool isSortedCore = true;
        private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
        private PropertyDescriptor sortPropertyCore = null;
        private string defaultSortItem;

        public DgvSortHelper() : base() { }

        public DgvSortHelper(IList<T> list) : base(list) { }

        protected override bool SupportsSortingCore
        {
            get { return true; }
        }

        protected override bool SupportsSearchingCore
        {
            get { return true; }
        }

        protected override bool IsSortedCore
        {
            get { return isSortedCore; }
        }

        protected override ListSortDirection SortDirectionCore
        {
            get { return sortDirectionCore; }
        }

        protected override PropertyDescriptor SortPropertyCore
        {
            get { return sortPropertyCore; }
        }

        protected override int FindCore(PropertyDescriptor prop, object key)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (Equals(prop.GetValue(this[i]), key)) return i;
            }
            return -1;
        }

        protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
        {
            isSortedCore = true;
            sortPropertyCore = prop;
            sortDirectionCore = direction;
            Sort();
        }

        protected override void RemoveSortCore()
        {
            if (isSortedCore)
            {
                isSortedCore = false;
                sortPropertyCore = null;
                sortDirectionCore = ListSortDirection.Ascending;
                Sort();
            }
        }

        public string DefaultSortItem
        {
            get { return defaultSortItem; }
            set
            {
                if (defaultSortItem != value)
                {
                    defaultSortItem = value;
                    Sort();
                }
            }
        }

        private void Sort()
        {
            List<T> list = (this.Items as List<T>);
            list.Sort(CompareCore);
            ResetBindings();
        }

        private int CompareCore(T o1, T o2)
        {
            int ret = 0;
            if (SortPropertyCore != null)
            {
                ret = CompareValue(SortPropertyCore.GetValue(o1), SortPropertyCore.GetValue(o2), SortPropertyCore.PropertyType);
            }
            if (ret == 0 && DefaultSortItem != null)
            {
                PropertyInfo property = typeof(T).GetProperty(DefaultSortItem, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.IgnoreCase, null, null, new Type[0], null);
                if (property != null)
                {
                    ret = CompareValue(property.GetValue(o1, null), property.GetValue(o2, null), property.PropertyType);
                }
            }
            if (SortDirectionCore == ListSortDirection.Descending) ret = -ret;
            return ret;
        }

        private static int CompareValue(object o1, object o2, Type type)
        {
            if (o1 == null) return o2 == null ? 0 : -1;
            else if (o2 == null) return 1;
            else if (type.IsPrimitive || type.IsEnum) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));
            else if (type == typeof(DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);
            else return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
        }
    }
    #endregion

}

  

posted on 2023-06-16 10:21  sunwugang  阅读(57)  评论(0编辑  收藏  举报