DataView 过滤、排序、DISTINCT功能

2023年1月25日09:55:38

DataView不知道还有这么好用的功能,真是一种享受。

多说无益,还是让我们一起去享受下这种快感吧

这里首先新建了一个数据集testDataSet,新建一testDataTableDataTable

添加了4列字段

字段名                      类型

stringVar          System.String

intVar               System.Int32

boolVar            System.Boolean

datetimeVar     System.DateTime

首先声明下,我这里是在WinForm环境下测试的

好,进入关键代码区

view plaincopy to clipboardprint?
private void AddOneRow(testDataSet.testDataTableDataTable dt, string strVar, int intVar,bool boolVar,DateTime datetimeVar)  
{  
    // 插入一条新数据记录  
    dt.AddtestDataTableRow(strVar, intVar, boolVar, datetimeVar);  
}  
 
    // 关键代码  
 
    testDataSet ds = new testDataSet();  
 
    // 先填充些许数据以便后续测试(没有数据怎么能测呢,呵呵~)  
    AddOneRow(ds.testDataTable, "20100001", 1, true, DateTime.Now);  
    AddOneRow(ds.testDataTable, "20100002", 2, true, Convert.ToDateTime("2010-4-25 13:00:36"));  
    AddOneRow(ds.testDataTable, "20100003", 3, false, Convert.ToDateTime("2008-10-25 12:59:36"));  
    AddOneRow(ds.testDataTable, "20100001", 1, true, DateTime.Now);  
    AddOneRow(ds.testDataTable, "20100002", 2, true, Convert.ToDateTime("2010-4-25 13:00:36"));  
    AddOneRow(ds.testDataTable, "20100003", 3, false, Convert.ToDateTime("2008-10-25 12:59:36"));  
 
    /* 这句的作用是相当巨大的,可别小瞧了这句Copy,它把表结构及数据拷贝到另一个内存区域, 
     * 在这里不能用Clone,因为Clone只是把数据结构“克隆”,不包含数据。 */ 
    DataTable dt = ds.testDataTable.Copy();  
 
    /* 这里若把ds.testDataTable.DefaultView直接赋给dv,则意味着下面的dt1与 
     * ds.testDataTable紧紧的捆绑在了一起,它们共享同一块内存区域,调试的 
     * 时候可发现dt1与ds.testDataTable的数据已经不一样,但运行后dataGridView1 
     * 和dataGridView2的显示的数据却是完全一样的。所以我们得事先把ds.testDataTable 
     * 挪到另一内存区域,这还是前面Copy那句的功能(作用巨大吧~)。这样我们就帮dt1和 
     * ds.testDataTable给“松绑”了哈~   */ 
    DataView dv = dt.DefaultView;  
 
    // 其实本文要说的核心是以下这三句  
 
    // RowFilter,顾名思义就是一个过滤器,相当于SQL的条件查询,可以多条件过滤,中间用and/or等连接  
    dv.RowFilter = "stringVar = '20100002'";  
 
    /* Sort即排序,默认按升序排序(不过我还是习惯手动加上ASC,以便区分),若要降序,则在字段名后面 
     * 加DESC关键字(如"stringVar DESC")即可 */ 
    dv.Sort = "stringVar ASC";  
 
    /* ToTable()有4个重载方法,个人认为只有distinct(bool型)和columnNames(params string[]型)这两个 
     * 参数比较有实用价值,distinct参数置为true时就相当于我们SQL的DISTINCT关键字一样的作用,而 
     * columnNames参数就给我们提供了具体抽取哪个字段。下面这句其实就相当于 
     * "SELECT DISTINCT stringVar,intVar from table" */ 
    DataTable dt1 = dv.ToTable(true, "stringVar", "intVar");  
 
    this.dataGridView1.DataSource = ds.testDataTable;  
    this.dataGridView2.DataSource = dt1;  
 
 
    /* 下面这两句也相当重要,若没有这两句,则我们在dataGridView标题栏所设置的颜色就无法显示了 
     * 当然也可以在属性框里直接设置 */ 
    this.dataGridView1.EnableHeadersVisualStyles = false;  
    this.dataGridView2.EnableHeadersVisualStyles = false; 
        private void AddOneRow(testDataSet.testDataTableDataTable dt, string strVar, int intVar,bool boolVar,DateTime datetimeVar)
        {
            // 插入一条新数据记录
            dt.AddtestDataTableRow(strVar, intVar, boolVar, datetimeVar);
        }

            // 关键代码

            testDataSet ds = new testDataSet();

            // 先填充些许数据以便后续测试(没有数据怎么能测呢,呵呵~)
            AddOneRow(ds.testDataTable, "20100001", 1, true, DateTime.Now);
            AddOneRow(ds.testDataTable, "20100002", 2, true, Convert.ToDateTime("2010-4-25 13:00:36"));
            AddOneRow(ds.testDataTable, "20100003", 3, false, Convert.ToDateTime("2008-10-25 12:59:36"));
            AddOneRow(ds.testDataTable, "20100001", 1, true, DateTime.Now);
            AddOneRow(ds.testDataTable, "20100002", 2, true, Convert.ToDateTime("2010-4-25 13:00:36"));
            AddOneRow(ds.testDataTable, "20100003", 3, false, Convert.ToDateTime("2008-10-25 12:59:36"));

            /* 这句的作用是相当巨大的,可别小瞧了这句Copy,它把表结构及数据拷贝到另一个内存区域,
             * 在这里不能用Clone,因为Clone只是把数据结构“克隆”,不包含数据。 */
            DataTable dt = ds.testDataTable.Copy();

            /* 这里若把ds.testDataTable.DefaultView直接赋给dv,则意味着下面的dt1与
             * ds.testDataTable紧紧的捆绑在了一起,它们共享同一块内存区域,调试的
             * 时候可发现dt1与ds.testDataTable的数据已经不一样,但运行后dataGridView1
             * 和dataGridView2的显示的数据却是完全一样的。所以我们得事先把ds.testDataTable
             * 挪到另一内存区域,这还是前面Copy那句的功能(作用巨大吧~)。这样我们就帮dt1和
             * ds.testDataTable给“松绑”了哈~   */
            DataView dv = dt.DefaultView;

            // 其实本文要说的核心是以下这三句

            // RowFilter,顾名思义就是一个过滤器,相当于SQL的条件查询,可以多条件过滤,中间用and/or等连接
            dv.RowFilter = "stringVar = '20100002'";

            /* Sort即排序,默认按升序排序(不过我还是习惯手动加上ASC,以便区分),若要降序,则在字段名后面
             * 加DESC关键字(如"stringVar DESC")即可 */
            dv.Sort = "stringVar ASC";

            /* ToTable()有4个重载方法,个人认为只有distinct(bool型)和columnNames(params string[]型)这两个
             * 参数比较有实用价值,distinct参数置为true时就相当于我们SQL的DISTINCT关键字一样的作用,而
             * columnNames参数就给我们提供了具体抽取哪个字段。下面这句其实就相当于
             * "SELECT DISTINCT stringVar,intVar from table" */
            DataTable dt1 = dv.ToTable(true, "stringVar", "intVar");

            this.dataGridView1.DataSource = ds.testDataTable;
            this.dataGridView2.DataSource = dt1;

            /* 下面这两句也相当重要,若没有这两句,则我们在dataGridView标题栏所设置的颜色就无法显示了
             * 当然也可以在属性框里直接设置 */
            this.dataGridView1.EnableHeadersVisualStyles = false;
            this.dataGridView2.EnableHeadersVisualStyles = false;

本就想整理一下DataView这三个功能,没想获得额外的收获,

意味的惊喜,呵呵~

学习的过程本该就是这么充满乐趣的~

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luols/archive/2010/04/28/5539573.aspx

  • 作者:lokuwa
  • 原文链接:https://blog.csdn.net/lokuwa/article/details/5640012
    更新时间:2023年1月25日09:55:38 ,共 4832 字。