这是一篇基础性由浅入深的文章,这篇举例说明了怎样实现并怎样使用一个DataSetHelper类,该类使用简洁代码来创建一个新的使某个DataTable对象指定的某列的的值具有唯一性的DataTable对象。 ????? 为了实现这个目的,你可以使用SelectDistinct这个公开方法,也可以使用一个私有的通过比较可能包含NULL值(DBNull.Value)的字段的辅助方法。 ?????? DataSetHelper类包含一个DataSet成员变量,你可以随意的指定现有的一个DataSet对象作为这个DataSet成员的变量。如果这个成员变量是一个有效的DataSet,任一一个SelectDistinct方法创建的DataTable对象都能被填充到这个DataSet里。那样,这个方法就请求返回涉及的DataTable对象。 要求: 下列清单列出的是推荐的硬件、软件、网络基础设施和必须的补丁包: (1)、Microsoft Windows XP, Windows 2000, or Windows NT 4.0 Service Pack 6a (2)、Microsoft Visual Studio .NET 这篇文章假设你已熟悉下面的主题: (1)、Visual C# .NET的语法 (2)、ADO.NET基本原理和语法 DataSetHelper 构造类: (1)、开始Microsoft Visual Studio .NET。 (2)、在文件(File)菜单,点新建(New),和然后点击项目(Project)。 (3)、在新建项目(New Project)对话框, 点击Visual C#项目(Visual C# Projects)下的项目类型(Project Types),然后点击类库(Class Library)下的模板(Templates)。 (4)、在名称栏里填上DataSetHelper。 (5)、用以下代码替换类代码: public class DataSetHelper { ???????? public DataSet ds; ???????? public DataSetHelper(ref DataSet DataSet) ???????? { ???????? ??????? ds = DataSet; ???????? } ???????? public DataSetHelper() ???????? { ???????? ??????? ds = null; ???????? } } 你可以用2次重载的构造函数来创建一个带或不带一个有效的DataSet的实例类。因为类是涉及一个有效的DataSet,那么这个方法返回的DataTable对象这就自动的填充到这个DataSet里。 注: 增加下面代码在代码窗口的顶部: using System.Data; ? SelectDistinct 方法: 这个部分包含代码为公开的SelectDistinct方法和私有的ColumnEqual辅助方法。 (1)、在类定义里增加下面的私有方法,该方法同样被用在其他的DataSetHelper 文章里,它被用做来比较字段的值(包括NULL值) 。 private bool ColumnEqual(object A, object B) { ???????? ?? // Compares two values to see if they are equal. Also compares DBNULL.Value. ??????? // Note: If your DataTable contains object fields, then you must extend this ??????? // function to handle them in a meaningful way if you intend to group on them. ??????????????????????????? ??????? if ( A == DBNull.Value && B == DBNull.Value ) //? both are DBNull.Value ??????????? return true; ??????? if ( A == DBNull.Value || B == DBNull.Value ) //? only one is DBNull.Value ??????????? return false; ??????? return ( A.Equals(B) );? // value type standard comparison } (2)、在类定义里增加下面的公开方法。这个方法复制你选定的字段的互异值到一个新的DataTable里。如果这个字段包含NULL值,在目标列里的一条记录里也会包含NULL值。 public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName) {?????? ??????? DataTable dt = new DataTable(TableName); ??????? dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType); ??????????????????????????? ??????? object LastValue = null; ??????? foreach (DataRow dr in SourceTable.Select("", FieldName)) ??????? { ??????????? if (? LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) ??????????? { ??????????????? LastValue = dr[FieldName]; ??????????????? dt.Rows.Add(new object[]{LastValue}); ??????????? } ??????? } ??????? if (ds != null) ??????????? ds.Tables.Add(dt); ??????? return dt; } 测试应用 (1)、保存并编译你先前创建的这部分的DataSetHelper类,然后关闭解决方案。 (2)、在下面的步骤里在Visual Studio .NET里创建一个新的Visual C# Windows Form程序: A、启动 Visual Studio .NET; B、在文件(File)菜单,点新建(New),和然后点击项目(Project)。 C、在新建项目(New Project)对话框, 点击Visual C#项目(Visual C# Projects)下的项目类型(Project Types),然后点击Windows应用程序(Windows Application)下的模板(Templates)。 (3)、在解决方案资源管理器里右击解决方案,然后点击添加现有项目,加入DataSetHelper这个项目。 (4)、在项目菜单里,点击项目依赖项(Add Reference)。 (5)、在项目依赖项对话框里,选中依赖项(Projects)标签,然后增加这个DataSetHelper项目和这个Windows Form程序的关系。 (6)、在窗口设计界面里,从工具箱里拖拉一个Button控件和一个DataGrid控件到窗体上,指定这个按钮名为btnSelectDistinct,继续保持DataGrid控件的默认名字(DataGrid1)。 (7)、窗体代码界面里,在代码窗口顶部增加下面的引用声明: using System.Data; (8)、在窗体的定义增加下面的变量声明: DataSet ds; DataSetHelper.DataSetHelper dsHelper; (9)、增加下面的构造代码(在the InitializeComponent();的下面): ds = new DataSet(); dsHelper = new DataSetHelper.DataSetHelper(ref ds); ? // Create source table DataTable dt = new DataTable("Orders"); dt.Columns.Add("EmployeeID", Type.GetType("System.String")); dt.Columns.Add("OrderID", Type.GetType("System.Int32")); dt.Columns.Add("Amount", Type.GetType("System.Decimal")); ??????????????????????????? dt.Rows.Add(new object[] {"Sam", 5, 25.00}); dt.Rows.Add(new object[] {"Tom", 7, 50.00}); dt.Rows.Add(new object[] {"Sue", 9, 11.00}); dt.Rows.Add(new Object[] {"Tom", 12, 7.00}); dt.Rows.Add(new Object[] {"Sam", 14, 512.00}); dt.Rows.Add(new Object[] {"Sue", 15, 17.00}); dt.Rows.Add(new Object[] {"Sue", 22, 2.50}); dt.Rows.Add(new object[] {"Tom", 24, 3.00}); dt.Rows.Add(new object[] {"Tom", 33, 78.75}); ? ds.Tables.Add(dt); (10)、增加下面的代码在btnSelectDistinct.Click的事件里: dsHelper.SelectDistinct("DistinctEmployees", ds.Tables["Orders"], "EmployeeID"); dataGrid1.SetDataBinding(ds, "DistinctEmployees"); (11)、运行这个程序,点击按钮一次,观察DataGrid绑定上从代码生成的表和数据。 注意:你只能点击btnSelectDistinct一次。如果你点击这个按钮超过一次的话,你将收到一条错误信息——你2次都在尝试添加同一个表。 进一步的想法: 你用这个功能只能筛选一个字段为互异,可是你可以类似性的扩展到多个字段。做为另一种选择,你可以调用CreateGroupByTable、InsertGroupByInto, 和 SelectGroupByInto 方法,通过使用GROUP BY-type的函数得到同样的结果。 |
|