基本信息
源码名称:原生自定义表格控件outlookgrid
源码大小:0.07M
文件格式:.zip
开发语言:C#
更新时间:2018-08-24
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 5 元×
微信扫码支付:5 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将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 日期分组类型