OutlookGrid:以Outlook样式分组和排列数据项
作者:Herre Kuijpers
译者:小刀人
原文链接
源代码下载
摘要:一个允许分组和排列数据项的网格,很像Outlook。
运行环境:C#,Windows (Win2K, WinXP, Win2003), .NET (.NET 2.0)
Win32, VS (VS2005), WinForms Dev
简介
如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将items译为数据项),过滤、查找、分类,以及其它分组功能将很快变得困难而单调乏味。特别是排序和分组大大提高了一个列表中数据项的结构,默认情况下,这是我想要应用到我的所有列表的功能特性。特别情况下,我还会寻找一个允许将相似的项一起安排和分组列表/网格的控件,很像在Outlook 2003中使用的网格(或列表?)。
我知道这里有一些支持这类功能的商业列表/网格(控件);然而,在试用它们的时候我也遇到过若干bug。不能访问源代码(译注:因为商业目的)使得这非常令人沮丧,因此我想倒不如我写篇CodeProject文章,看看我是否可以拿出一个自定义解决方案。
因为网格比列表更加灵活,我决定实现一个可以一起分组的网格控件,正如Outlook一样。这个控件用C#2.0在VS 2005上实现的。现在,我不能保证这个实现没有bug,但至少它是免费的,并且它有源代码。因而,您可以根据您的需要修改它们,以适合于您自己的用途。无论如何要注意:这个控件并没有完成!一些功能也许不能正确地工作或完全不能工作。该控件主要关注于排序、分组并在网格上显示数据项,这些功能特性我想已做得相当地好了。在网格中插入、更新和删除行及单元格不在我考虑的范围之内。
在这篇文章中,我将解释这个控件怎么用,和它能做什么,并且也包含了什么它不能做,主要把焦点集中在只想要按现在的样子复用该控件的开发组。然后,对于为了他们自己的用途想要扩展或改变这个控件的实现的开发者,我将对这个控件内部运作做一点更为详细的解释。
背景
OutlookGrid继承于VS2005新推出的DataGridView控件。如果您对DataGridView熟悉,将OutlookGrid整合进您的解决方案应该是相当容易。如果您之前已做过一些GDI+编程和用户控件,OutlookGrid应该不难被扩展。
我想要用尽可能少的代码尽可能简单地创建OutlookGrid。因此,该控件不能使用复杂的钩子、回调及Windows API。该控件只简单地重写了一些DataGridView的事件处理器。不幸的是,DataGridView只实现了很少的事件,这让我花费了数个小时决定重写哪个事件。同样,这也花费了我不少的时间来找到一个可工作的解决方案以使得网格容易使用。
使用该代码
假定您已创建了一个VS2005下的C# Windows应用程序项目,添加OutlookGrid.cs、OutlookGrid.Designer.cs、OutlookGridRow.cs、OutlookGridGroup.cs和DataSourceManager.cs文件到您的项目。在添加OutlookGrid控件到您的窗体之前,确保您首先编译所有文件。在此之后,控件被添加到您的工具箱中。您现在可以将其拖至您的窗体。
一旦控件就位,这里有两个方法来填充网格:手动(非绑定的)添加列、行及单元格,或使用数据绑定(绑定的)。
正如在示例代码中所示:后面的一个方法是最简单的实现。
在本文中,我将不会讨论所有选项,然而,在演示项目和资源的例子中它们已被实现。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)数据绑定
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)通常,只有两个数据类型可以被用于数据绑定:DataSet或一个对象数组列表(该列表必须实现IList接口,比如:ArrayList)其它类型到现在为止仍然不被支持,例如像:DataTable或DataTableView。
在创建窗体时添加以下代码:
//创建一个dataset(数据集)对象
DataSet dataset = new DataSet();//填充dataset,举例来说,通过从一个xml文件中读取数据
dataset.ReadXml(@"invoices.xml");//绑定dataset到OutlookGrid(在这个例子中命名为outlookGrid1)。
//设置dataMember(数据成员)变量为“invoice”,指示dataset中的表的名称以显示该表到网格中。
outlookGrid1.BindData(dataset, "invoice");
注意OutlookGrid使用BindData()来绑定数据,而不是设置DataSource和DataMember属性。DataSo