在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → 原生自定义表格控件outlookgrid

原生自定义表格控件outlookgrid

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.07M
  • 下载次数:55
  • 浏览次数:695
  • 发布时间:2018-08-24
  • 实例类别:C#语言基础
  • 发 布 人:随风任飘遥
  • 文件格式:.zip
  • 所需积分:5

实例介绍

【实例简介】

如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将items译为数据项),过滤、查找、分类,以及其它分组功能将很快变得困难而单调乏味。特别是排序和分组大大提高了一个列表中数据项的结构,默认情况下,这是我想要应用到我的所有列表的功能特性。特别情况下,我还会寻找一个允许将相似的项一起安排和分组列表/网格的控件,很像在Outlook 2003中使用的网格(或列表?)。

我知道这里有一些支持这类功能的商业列表/网格(控件);然而,在试用它们的时候我也遇到过若干bug。不能访问源代码(译注:因为商业目的)使得这非常令人沮丧,因此我想倒不如我写篇CodeProject文章,看看我是否可以拿出一个自定义解决方案。

因为网格比列表更加灵活,我决定实现一个可以一起分组的网格控件,正如Outlook一样。这个控件用C#2.0在VS 2005上实现的。现在,我不能保证这个实现没有bug,但至少它是免费的,并且它有源代码。因而,您可以根据您的需要修改它们,以适合于您自己的用途。无论如何要注意:这个控件并没有完成!一些功能也许不能正确地工作或完全不能工作。该控件主要关注于排序、分组并在网格上显示数据项,这些功能特性我想已做得相当地好了。
                            在网格中插入、更新和删除行及单元格不在我考虑的范围之内。

【实例截图】

【核心代码】

public class OutlookGridDefaultGroup : IOutlookGridGroup
    {
        /// <summary>
        /// 点击列的值
        /// </summary>
        protected object val;
        /// <summary>
        /// 分组标题
        /// </summary>
        protected string text;
        /// <summary>
        /// 是否折叠当前分组
        /// </summary>
        protected bool collapsed;
        /// <summary>
        /// DataGridViewColumn列
        /// </summary>
        protected DataGridViewColumn column;
        /// <summary>
        /// 当前分组包含的记录数目
        /// </summary>
        protected int itemCount;
        /// <summary>
        /// 分组行高度
        /// </summary>
        protected int height;

        /// <summary>
        /// OutlookgGridDefaultGroup对象 默认构造函数
        /// </summary>
        public OutlookGridDefaultGroup()
        {
            val = null;

            this.column = null;
            height = 34; // default height
        }

        #region IOutlookGridGroup Members

        /// <summary>
        /// 分组对象显示的文本
        /// </summary>
        public virtual string Text
        {
            get {
                if (column == null)
                    return string.Format("Unbound group: {0} ({1})", Value.ToString(), itemCount == 1 ? "1 item" : itemCount.ToString()   " items");
                else
                    return string.Format("{0}: {1} ({2})", column.HeaderText, Value.ToString(), itemCount == 1 ? "1 item" : itemCount.ToString()   " items"); 
                }
            set { text = value; }
        }

        /// <summary>
        /// 值
        /// </summary>
        public virtual object Value
        {
            get { return val; }
            set { val = value; }
        }

        /// <summary>
        /// 是否折叠
        /// </summary>
        public virtual bool Collapsed
        {
            get { return collapsed; }
            set { collapsed = value; }
        }

        /// <summary>
        /// DataGridViewColumn列对象
        /// </summary>
        public virtual DataGridViewColumn Column
        {
            get { return column; }
            set { column = value; }
        }

        /// <summary>
        /// 分组中包含的记录数目
        /// </summary>
        public virtual int ItemCount
        {
            get { return itemCount; }
            set { itemCount = value; }
        }

        /// <summary>
        /// 分组行高度
        /// </summary>
        public virtual int Height
        {
            get { return height; }
            set { height = value; }
        }

        #endregion

        #region ICloneable Members

        /// <summary>
        /// 实现ICloneable接口
        /// </summary>
        /// <returns></returns>
        public virtual object Clone()
        {
            OutlookGridDefaultGroup gr = new OutlookGridDefaultGroup();
            gr.column = this.column;
            gr.val = this.val;
            gr.collapsed = this.collapsed;
            gr.text = this.text;
            gr.height = this.height;
            return gr;
        }

        #endregion

        #region IComparable Members

        /// <summary>
        /// this is a basic string comparison operation. 
        /// all items are grouped and categorised based on their string-appearance.
        /// </summary>
        /// <param name="obj">the value in the related column of the item to compare to</param>
        /// <returns></returns>
        public virtual int CompareTo(object obj)
        {
            return string.Compare(val.ToString(), obj.ToString());
        }

        #endregion
    }
    #endregion OutlookGridDefaultGroup - implementation of the default grouping style

    #region OutlookGridAlphabeticGroup - an alphabet group implementation
    /// <summary>
    /// this group simple example of an implementation which groups the items into Alphabetic categories
    /// based only on the first letter of each item
    /// 
    /// for this we need to override the Value property (used for comparison)
    /// and the CompareTo function.
    /// Also the Clone method must be overriden, so this Group object can create clones of itself.
    /// Cloning of the group is used by the OutlookGrid
    /// </summary>
    public class OutlookGridAlphabeticGroup : OutlookGridDefaultGroup
    {
        /// <summary>
        /// 按值首字母分组
        /// </summary>
        public OutlookGridAlphabeticGroup()
            : base()
        {
            
        }

        /// <summary>
        /// 重写基类OutlookgGridDefaultGroup的Text属性
        /// </summary>
        public override string Text
        {
            get
            {
                return string.Format("Alphabetic: {1} ({2})", column.HeaderText, Value.ToString(), itemCount == 1 ? "1 item" : itemCount.ToString()   " items");
            }
            set { text = value; }
        }

        /// <summary>
        /// 重写基类OutlookgGridDefaultGroup的Value属性
        /// </summary>
        public override object Value
        {
            get { return val; }
            set { val = value.ToString().Substring(0,1).ToUpper(); }
        }

        #region ICloneable Members
        /// <summary>
        /// each group class must implement the clone function
        /// </summary>
        /// <returns></returns>
        public override object Clone()
        {
            OutlookGridAlphabeticGroup gr = new OutlookGridAlphabeticGroup();
            gr.column = this.column;
            gr.val = this.val;
            gr.collapsed = this.collapsed;
            gr.text = this.text;
            gr.height = this.height;
            return gr;
        }

        #endregion

        #region IComparable Members
        /// <summary>
        /// overide the CompareTo, so only the first character is compared, instead of the whole string
        /// this will result in classifying each item into a letter of the Alphabet.
        /// for instance, this is usefull when grouping names, they will be categorized under the letters A, B, C etc..
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override int CompareTo(object obj)
        {
            return string.Compare(val.ToString(), obj.ToString().Substring(0, 1).ToUpper());
        }

        #endregion IComparable Members

    }
    #endregion OutlookGridAlphabeticGroup - an alphabet group implementation

    #region 金额汇总分组

    /// <summary>
    /// each arrange/grouping class must implement the IOutlookGridGroup interface
    /// the Group object will determine for each object in the grid, whether it
    /// falls in or outside its group.
    /// It uses the IComparable.CompareTo function to determine if the item is in the group.
    /// </summary>
    public class OutlookGridMoneyGroup : IOutlookGridGroup
    {
        /// <summary>
        /// 点击列的值
        /// </summary>
        protected object val;
        /// <summary>
        /// 分组标题
        /// </summary>
        protected string text;
        /// <summary>
        /// 是否折叠当前分组
        /// </summary>
        protected bool collapsed;
        /// <summary>
        /// DataGridViewColumn列
        /// </summary>
        protected DataGridViewColumn column;
        /// <summary>
        /// 当前分组包含的记录数目
        /// </summary>
        protected int itemCount;
        /// <summary>
        /// 分组行高度
        /// </summary>
        protected int height;
        /// <summary>
        /// 金额汇总列
        /// </summary>
        protected int sumColumn = -1;
        /// <summary>
        /// 汇总金额数目
        /// </summary>
        protected decimal total = 0.0m;

        /// <summary>
        /// 汇总金额
        /// </summary>
        public decimal Total
        {
            get { return total; }
            set { total = value; }
        }

        /// <summary>
        /// 金额汇总列,默认没有-1
        /// </summary>
        public int SumColumn
        {
            get { return sumColumn; }
            set { sumColumn = value; }
        }

        /// <summary>
        /// 金额分组对象 默认构造函数
        /// </summary>
        public OutlookGridMoneyGroup()
        {
            val = null;

            this.column = null;
            height = 34; // default height
        }

        #region IOutlookGridGroup Members

        /// <summary>
        /// 分组对象显示的文本
        /// </summary>
        public virtual string Text
        {
            get
            {
                if (column == null)
                    return string.Format("未绑定组: {0}  记录数目: {1} (合计金额:{2})", Value.ToString(), itemCount, total.ToString("C"));
                else
                    return string.Format("按{0}分组: {1}  记录数目: {2} (合计金额:{3})", column.HeaderText, Value.ToString(), itemCount, total.ToString("C"));
            }
            set { text = value; }
        }

        /// <summary>
        /// 值
        /// </summary>
        public virtual object Value
        {
            get { return val; }
            set { val = value; }
        }

        /// <summary>
        /// 是否折叠
        /// </summary>
        public virtual bool Collapsed
        {
            get { return collapsed; }
            set { collapsed = value; }
        }

        /// <summary>
        /// DataGridViewColumn列对象
        /// </summary>
        public virtual DataGridViewColumn Column
        {
            get { return column; }
            set { column = value; }
        }

        /// <summary>
        /// 分组中包含的记录数目
        /// </summary>
        public virtual int ItemCount
        {
            get { return itemCount; }
            set { itemCount = value; }
        }

        /// <summary>
        /// 分组行高度
        /// </summary>
        public virtual int Height
        {
            get { return height; }
            set { height = value; }
        }

        #endregion

        #region ICloneable Members

        /// <summary>
        /// 实现ICloneable接口
        /// </summary>
        /// <returns></returns>
        public virtual object Clone()
        {
            OutlookGridMoneyGroup gr = new OutlookGridMoneyGroup();
            gr.column = this.column;
            gr.val = this.val;
            gr.collapsed = this.collapsed;
            gr.text = this.text;
            gr.height = this.height;
            gr.sumColumn = this.sumColumn;
            gr.total = this.total;
            return gr;
        }

        #endregion

        #region IComparable Members

        /// <summary>
        /// this is a basic string comparison operation. 
        /// all items are grouped and categorised based on their string-appearance.
        /// </summary>
        /// <param name="obj">the value in the related column of the item to compare to</param>
        /// <returns></returns>
        public virtual int CompareTo(object obj)
        {
            return string.Compare(val.ToString(), obj.ToString());
        }

        #endregion
    }
    #endregion 金额汇总分组

    #region 日期分组(带金额汇总功能) 继承OutlookGridMoneyGroup对象

    /// <summary>
    /// each arrange/grouping class must implement the IOutlookGridGroup interface
    /// the Group object will determine for each object in the grid, whether it
    /// falls in or outside its group.
    /// It uses the IComparable.CompareTo function to determine if the item is in the group.
    /// </summary>
    public class OutlookGridDateGroup : OutlookGridMoneyGroup
    {
        /// <summary>
        /// 日期分组类型
        /// </summary>
        protected DateGroupType groupType=DateGroupType.Day;

        /// <summary>
        /// 日期分组(带金额汇总功能) 继承OutlookGridMoneyGroup对象
        /// </summary>
        public OutlookGridDateGroup()
            : base()
        {
            
        }

        /// <summary>
        /// 日期分组类型
        /// </summary>
        public DateGroupType GroupType
        {
          get { return groupType; }
          set { groupType = value; }
        }

        /// <summary>
        /// 重写基类OutlookGridMoneyGroup的Text属性
        /// </summary>
        public override string Text
        {
            get
            {
                //判断是否是绑定数据源
                if (base.column == null)
                {
                    //判断是否有金额列需要汇总
                    if (base.SumColumn < 0)
                    {
                        return string.Format("未绑定组: {0}  记录数目: {1} ", Value.ToString(), itemCount);
                    }
                    else
                    {
                        return string.Format("未绑定组: {0}  记录数目: {1} (合计金额:{2})", Value.ToString(), itemCount, total.ToString("C"));
                    }
                }
                else
                {
                    if (base.SumColumn < 0)
                    {
                        return string.Format("按{0}分组: {1}  记录数目: {2} ", column.HeaderText, val.ToString(), itemCount);
                    }
                    else
                    {
                        return string.Format("按{0}分组: {1}  记录数目: {2} (合计金额:{3})", column.HeaderText, val.ToString(), itemCount, total.ToString("C"));
                    }
                }
            }
            set { text = value; }
        }

        /// <summary>
        /// 重写基类OutlookGridMoneyGroup的Value属性
        /// </summary>
        public override object Value
        {
            get { return val; }
            set 
            {
                val = GetFormatDate(value.ToString()); 
            }
        }

        /// <summary>
        /// 得到格式化后的日期
        /// </summary>
        /// <param name="date">日期</param>
        /// <returns></returns>
        private string GetFormatDate(string date)
        {
            string fomatValue;
            try
            {
                DateTime dt = DateTime.Parse(date);
                switch (groupType)
                {
                    case DateGroupType.Day:
                        fomatValue = dt.ToString("yyyy-M-d");
                        break;
                    case DateGroupType.Week:
                        //显示中文日期名称
                        //dt.DayOfWeek.ToString();   
                        fomatValue = dt.ToString("dddd", new System.Globalization.CultureInfo("zh-CN"));
                        break;
                    case DateGroupType.Month:
                        fomatValue = dt.ToString("yyyy年M月");
                        break;
                    case DateGroupType.Quarter:
                        fomatValue = dt.Year   "年第"   ((dt.Month % 3 == 0) ? (dt.Month / 3) : (dt.Month / 3   1))   "季度";
                        break;
                    case DateGroupType.Year:
                        fomatValue = dt.Year   "年度";
                        break;
                    default:
                        fomatValue = dt.ToString("yyyy-M-d");
                        break;
                }
            }
            catch
            {
                fomatValue = date;
            }
            return fomatValue;
        }

        /// <summary>
        /// 获得中文星期名称
        /// </summary>
        /// <param name="dt">日期对象</param>
        /// <returns></returns>
        public static string GetCnWeek(DateTime dt)
        {
            switch (dt.DayOfWeek)
            {
                case DayOfWeek.Monday:
                    return "星期一";
                case DayOfWeek.Tuesday:
                    return "星期二";
                case DayOfWeek.Wednesday:
                    return "星期三";
                case DayOfWeek.Thursday:
                    return "星期四";
                case DayOfWeek.Friday:
                    return "星期五";
                case DayOfWeek.Saturday:
                    return "星期六";
                case DayOfWeek.Sunday:
                    return "星期日";
                default:
                    return "";
            }
        }
        
        //在C#的WinForm开发中,使用DateTime.Now.DayOfWeek输出星期时,都是英文的,
        //如何输出中文呢?其实很简单,下面的的一个小小的函数即可实现:
        public static string WeekDayOfCN(DateTime dt)
        {
            string[] arrCnNames = new string[] { "日", "一", "二", "三", "四", "五", "六" };
            return "星期"   arrCnNames[(int)dt.DayOfWeek];
            //System.DateTime.Now.GetDateTimeFormats('D')[2].Substring(0, 3).ToString(); 
        }
        #region ICloneable Members

        /// <summary>
        /// 实现ICloneable接口
        /// </summary>
        /// <returns></returns>
        public override object Clone()
        {
            OutlookGridDateGroup gr = new OutlookGridDateGroup();
            gr.column = this.column;
            gr.val = this.val;
            gr.collapsed = this.collapsed;
            gr.text = this.text;
            gr.height = this.height;
            gr.sumColumn = this.sumColumn;
            gr.total = this.total;
            gr.groupType = this.groupType;
            return gr;
        }

        #endregion

        #region IComparable Members

        /// <summary>
        /// this is a basic string comparison operation. 
        /// all items are grouped and categorised based on their string-appearance.
        /// </summary>
        /// <param name="obj">the value in the related column of the item to compare to</param>
        /// <returns></returns>
        public override int CompareTo(object obj)
        {
            return string.Compare(val.ToString(), GetFormatDate(obj.ToString()));
        }

        #endregion
    }
    #endregion 日期分组(带金额汇总功能)

    #region 日期分组类型
    /// <summary>
    /// 日期分组类型
    /// </summary>
    public enum DateGroupType
    {
        /// <summary>
        /// 按天分组
        /// </summary>
        Day,
        /// <summary>
        /// 按星期分组
        /// </summary>
        Week,
        /// <summary>
        /// 按月份分组
        /// </summary>
        Month,
        /// <summary>
        /// 按季度分组
        /// </summary>
        Quarter,
        /// <summary>
        /// 按年度分组
        /// </summary>
        Year
    }

    #endregion 日期分组类型

实例下载地址

原生自定义表格控件outlookgrid

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警