实例介绍
【实例简介】
如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将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 日期分组类型
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论