OutlookGrid:以Outlook样式分组和排列数据项(C#)

2016-01-29 12:10 102 1 收藏

OutlookGrid:以Outlook样式分组和排列数据项(C#),OutlookGrid:以Outlook样式分组和排列数据项(C#)

【 tulaoshi.com - C语言心得技巧 】

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控件到您的窗体之前,确保您首先编译所有文件。在此之后,控件被添加到您的工具箱中。您现在可以将其拖至您的窗体。

一旦控件就位,这里有两个方法来填充网格:手动(非绑定的)添加列、行及单元格,或使用数据绑定(绑定的)。

正如在示例代码中所示:后面的一个方法是最简单的实现。

在本文中,我将不会讨论所有选项,然而,在演示项目和资源的例子中它们已被实现。

数据绑定

通常,只有两个数据类型可以被用于数据绑定:DataSet或一个对象数组列表(该列表必须实现IList接口,比如:ArrayList)其它类型到现在为止仍然不被支持,例如像:DataTable或DataTableView。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


在创建窗体时添加以下代码:

//创建一个dataset(数据集)对象
DataSet dataset = new DataSet();

//填充dataset,举例来说,通过从一个xml文件中读取数据
dataset.ReadXml(@"invoices.xml");

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

//绑定dataset到OutlookGrid(在这个例子中命名为outlookGrid1)。
//设置dataMember(数据成员)变量为“invoice”,指示dataset中的表的名称以显示该表到网格中。
outlookGrid1.BindData(dataset, "invoice");


注意OutlookGrid使用BindData()来绑定数据,而不是设置DataSource和DataMember属性。DataSo

来源:http://www.tulaoshi.com/n/20160129/1484904.html

延伸阅读
本示例是用于将ListView中的内容倒入到Excel,与常用的逐单元格写不同的是,本例子采用数据写入到range的方法。该方法效率明显较高。 Excel.Application app = new Excel.ApplicationClass(); if( app == null) { MessageBox.Show("Excel无法启动"); return; } app.Visible = true; Excel.Workbooks w...
/*********************************** 作者:trieagle(让你望见影子的墙) 日期:2009.8.14 注: 转载请保留此信息 ************************************/ 使用c#构造date数据类型 在sql server2005没有实现date类型,但是提供了很好的扩展性,可以利用CLR来构造date类型。有一部分是参考了Fc的代码写的。 步骤: 1、在vs 2005中新建...
标签: ASP
       欢迎您加入C#的世界!      这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣。      为什么是另外一种编程语言?      必须回答...
类(class)是C#类型中最基础的类型。类是一个数据结构,将状态(字段)和行为(方法和其他函数成员)组合在一个单元中。类提供了用于动态创建类实例的定义,也就是对象(object)。类支持继承(inheritance)和多态(polymorphism),即派生类能够扩展和特殊化基类的机制。使用类声明可以创建新的类。类声明以一个声明头开始,其组成方式如...
委托 和 事件 在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、...

经验教程

828

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部