精华内容
下载资源
问答
  • dataTable

    千次阅读 2016-10-10 16:00:34
    项目中使用的一款表格框架,整合了大量的有的没有的功能 需要导包:jquery.dataTables.js和H-ui.min.css ... 翻页操作什么的都是交给dataTable。...dataTable的参数配置:一般而言根据自己的需求配置(并不需要

    项目中使用的一款表格框架,整合了大量的有的没有的功能

    需要导包:jquery.dataTables.js

    官网:https://www.datatables.net/

    中文官网:http://datatables.club/


    翻页操作什么的都是交给dataTable。


    使用操作步骤

    dataTable的参数配置:一般而言根据自己的需求配置(并不需要改变什么),最多修改一下每页显示的数据量和排序功能。

    <span style="font-size:18px;">"bStateSave": true,//状态保存
    "bPaginate": true, //翻页功能
    "bLengthChange": false, //改变每页显示数据数量
    "bFilter": false, //过滤功能
    "bSort": false, //排序功能
    "bInfo": true,//页脚信息,显示于左下角,显示有几条记录,
    "bAutoWidth": false,//自动宽度,当需要自定义table的显示宽度时设置为false
    "iDisplayLength": 20, //每页显示20条记录,默认条件为20
    
    //显示样式需要修改时,如第一列需要左对齐,第二列需要右对齐,dataTable是不能在columnDefs的render来给td复制属性的,改样式表是无法做到每个都是特定的,
    
    //好在dataTable提供了createdRow属性
    
    "createdRow": function (row, data, dataIndex) {
       $(row).children('td').eq(4).attr('style', 'text-align: right;');
       $(row).children('td').eq(5).attr('style', 'text-align: right;');
       $(row).children('td').eq(6).attr('style', 'text-align: left;')
    },</span>

    一次性请求所有数据:(后端不分页,前段分页)

    <span style="font-size:18px;">$.ajax({
       url: "userMappermissionList.aspx",
       data: {
          "method": "canclePermission", "UserId": UserIdVar, "MapId": id
       },
    });
    
    //根据后台封装好的json取数据,具体可以查看相应报文(dataTable的th个数要和你要显示的属性个数匹配,不然会报错)
    
    "columns":[
    
       {"data":"id" },
    
       {"data":"name"}
    
    .....
    
    ]
    </span>

    多次查询:每次翻页操作都是重新向数据库请求新的数据,而且每次都自请求一页的数据

    fnServerData属性为请求操作。

    sSource:对应sAjaxSource请求数据源操作

    aoData:dataTable封装的数据,包括echo,起始id,每页长度,后台获取方式是使用request[*][value]获取

    <span style="font-size:18px;">"bProcessing": false, // 是否显示取数据时的那个等待提示
    "bServerSide": true,//这个用来指明是通过服务端来取数据
    "sAjaxSource": "userMappermissionList.aspx",//这个是请求的地址
    "fnServerData": function (sSource, aoData, fnCallback) {// 获取数据的处理函数
    $.ajax({
       "dataType": 'json',
       "type": "POST",
       "url": sSource,//这个就是请求地址对应sAjaxSource
    
       //aoData是把datatable的一些基本数据传给后台,比如起始位置,每页显示的行数
       "data": { "aoData": aoData, "method": "GetMapInfoByUserId", "UserId": UserIdVar, "DataStatus": DataStatus, "dateMin": dateMin, "dateMax": dateMax },
    
    //回调函数,显示
    "success": function (msg) {
         fnCallback(msg);
    },
    error: function (xhr, textStatus, error) {
        if (typeof console == "object") {
           console.log(xhr.status + "," + xhr.responseText + "," + textStatus + "," + error);
        }
      }
    });
    </span>

    (分页查询的响应正文是在后台自己封装的)

    columnDefs属性设置每个列的属性要怎么显示,targets对应的列数,data对应传入的参数,render返回显示结果,bvisible是否显示。

    外部设置查询条件:

    外部根据对象的属性来查询响应的数据

    <span style="font-size:18px;">var table = $('#table').DataTable();
    
    	table.ajax.reload();</span>

    重新载入dataTable。

    补充:

    在dataTable使用时遇到的问题:

    1、一个单元格需要同一行的多个数据来决定时(需要传入id、再根据此时的状态status来决定显示样式)。

    columnDefs 中有时为了根据多个对象决定一些显示时,可以使用columnDefs 的render中的full,full包含一行的所有数据,full是一个数组格式


    完整实例:

    <span style="font-size:18px;">var ip = "";
    var dateMin = "";
    var dateMax = "";
    var table = {
       "bStateSave": true,//状态保存
       "bPaginate": true, //翻页功能
       "bLengthChange": false, //改变每页显示数据数量
       "bFilter": false, //过滤功能
       "bSort": false, //排序功能
       "bInfo": true,//页脚信息
       "bAutoWidth": false,//自动宽度
       "iDisplayLength": 20, //每页显示20条记录</div>
    
        "createdRow": function (row, data, dataIndex) {
             $(row).children('td').eq(4).attr('style', 'text-align: right;');
             $(row).children('td').eq(5).attr('style', 'text-align: right;');
            $(row).children('td').eq(6).attr('style', 'text-align: left;')
        },
        "bProcessing": false, // 是否显示取数据时的那个等待提示
        "bServerSide": true,//这个用来指明是通过服务端来取数据
        "sAjaxSource": "userLog.aspx",//这个是请求的地址
        "fnServerData": function (sSource, aoData, fnCallback) {// 获取数据的处理函数
        $.ajax({
           "dataType": 'json',
           "type": "POST",
           "url": sSource,//这个就是请求地址对应sAjaxSource
           "data": { "aoData": aoData, "method": "loadUserLog", "IP": ip, "dateMin": dateMin, "dateMax": dateMax },//这个是把datatable的一些基本数据传给后台,比如起始位置,每页显示的行数
           "success": function (msg) {
               fnCallback(msg);
           },
           error: function (xhr, textStatus, error) {
              if (typeof console == "object") {
                 console.log(xhr.status + "," + xhr.responseText + "," + textStatus + "," + error);
              }
           }
        });
      },
       //时间输出格式的修改
       "columnDefs": [{
       "targets": [3],
       "data": [3],
       "render": function (data, type, full) {
           if (data == "0001/1/1 0:00:00") {
              return "<td class='td-manage'></td>";
           } else {
              return "<td class='td-manage'>" + data + "</td>";
           }
         }
       }
      ]
    }
      //search
    function search() {
       ip = $("#IP").val();
       dateMin = $("#datemin").val();
       dateMax = $("#datemax").val();
       var table = $('#table').DataTable();
       table.ajax.reload();
    }
    $(document).ready(function () {
       $("#table").dataTable(table);
    });
    </span>

    展开全文
  • DataTable

    2014-12-11 15:39:48
    Clear:清除所有数据的 DataTable。 Clone:克隆 DataTable 的结构,包括所有 DataTable 架构和约束。 Compute:计算用来传递筛选条件的当前行上的给定表达式。 Copy:复制该 DataTable 的结构和数据。 Load...
    Clear:清除所有数据的 DataTable。
    Clone:克隆 DataTable 的结构,包括所有 DataTable 架构和约束。
    Compute:计算用来传递筛选条件的当前行上的给定表达式。
    Copy:复制该 DataTable 的结构和数据。
    Load(IDataReader):通过所提供的 IDataReader,用某个数据源的值填充 DataTable。 如果 DataTable 已经包含行,则从数据源传入的数据将与现有的行合并。
    Merge(DataTable):将指定的 DataTable 与当前的 DataTable 合并。
    Select():获取所有 DataRow 对象的数组。
    WriteXml(Stream):使用指定的 Stream 以 XML 格式写入 DataTable 的当前内容。
    展开全文
  • DataTable

    千次阅读 2007-07-24 16:48:00
    datatabel 在.net 2.0中变得更加强大,写这篇文章时我觉得有个问题很难决定,我是把它放在ado.net 中还是发在asp.net中,毕竟我经常在asp.net 中使用datatable对象,但是datatable和dataset 非常的紧密,最终决定...

    datatabel .net 2.0中变得更加强大,写这篇文章时我觉得有个问题很难决定,我是把它放在ado.net 中还是发在asp.net中,毕竟我经常在asp.net 中使用datatable对象,但是datatabledataset 非常的紧密,最终决定放在ado.net中,正好手中有本讲ado.net的书,我会把读书的心得拿出来和大家分享。

    一。创建一个内存表,下面的代码会用到它
    DataTable   auto = new DataTable();

    auto.Columns.Add("ID");

    auto.Columns.Add("Name");

    for(int i=1;i<=10;i++)

    {

          auto.Rows.Add(new object[]{i,"baibaoqing"});

    }

    二。下面介绍DataTable对象经常使用的方法

           1. DataTable 的复制和克隆

            创建DataTable的完全副本(full copu 复制表的结构和数据),通过DataTableCopy方法实现

            DataTable copy_Table=auto.Copy()

            for(int i=0;i<copy_Table.Rows.Length;i++)

            {

                   Response.Write("<script>alert("+copy_Table.Rows[i][0]+");</script>");

            }

    输出的结果为从010 的数字

           有时需要复制DataTable 的表模式(表结果)而不复制数据,可以使用DataTableClone方法

            DataTable clone_Table=auto.Clone();

           在克隆了一个DataTable后,可能需要DataTable对象中的某些DataRow对象(行数据)复制到克隆的DataTabel 中,可以使用DataTable ImPortRow方法

           clone_Table.ImportRow(auto.Rows[0]);

          2.枚举DataTable

          通过Foreach循环遍历DataTable的行和列

          System.Text.StringBuilder   buffer=new System.Text.StringBuiler();

          foreach(DataColumn dc in auto.Colmns)

         {

                  buffer.Append(String.Format“{015}”dc.ColumnName);

         }

          buffer.Append("/r/t");

         foreach(DataRow dr in auto.Rows)

         {

                 foreach(DataColumn dc in auto.Colmns)

                {

                 buffer.Append(String.Format("{0,15}",dr[dc]));  
                }

                buffer.Append("/r/t");

    }

    textbox1.Text=buffer.ToString();

    . 使用DataView

           1. Sort排序

              DataView view=new DataView(auto);

              view.Sort="Make ASC,Year DESC";

              不过我很少使用DataView 的排序功能,我的作法是在SQL语句中使用Order by

            2. 使用RowFilter 精确查找

                DataView view=new DataView(auto);

                view.RowFilter="Make like 'AA%' and Year>2001";

               同样也可以在SQL语句中设置查询条件,看个人的习惯和实际的需要了。

             3 DataView 导出到一个新表

              DataTable new_Table=view.ToTable("MyTable",true,"id","name");

              MyTable 新表的名称,true 表示显示不同的值,将相同的行删除(相当于Sql distinct),

            id name 为新表的列ID.

            4. 枚举DataView

             和枚举DataTabe大同小异

               System.Text.StringBuilder   buffer=new System.Text.StringBuiler();

          foreach(DataColumn dc in auto.Colmns)

         {

                  buffer.Append(String.Format“{015}”dc.ColumnName);

         }

          buffer.Append("/r/t");

         foreach(DataRowView dv in view)

         {

                 foreach(DataColumn dc in auto.Colmns)

                {

                 buffer.Append(String.Format("{0,15}",dv[dc]));  
                }

                buffer.Append("/r/t");

    }

    textbox1.Text=buffer.ToString();

    另外在.net 2.0DataTable对象可以处理XML文件,和DataSet一样,DataTable对象也有ReadXmlWriteXml 的方法,没有具体用过,有机会使用时再做总结。 

    ------------------------------------------------------------------------------------------------------------------------------------------

    通过DataTable获得表的主键

    很多情形下我们需要知道表的主键是什么。在ADO.Net中提供了DataTable可以映射数据库的表。于是便可以利用DataTable的属性PrimaryKey,它是DataColumn[] 类型是一个数组。我们可以使用如下的代码

       DataColumn[] cols;
       cols = Table.PrimaryKey;
     //注意不是colsDataColumn数组,不是DataColumn变量。这样做主要是为了处理联合主键的问题。
       for(int i = 0; i < cols.Length; i++)
       {
              MessageBox.Show(cols[i].ColumnName);
       }


    按理这个问题就已经解决了,但是cols.Length却是0。原来在默认的情况下填充DataTable时并没有从数据库中取的主键的信息。如何获得主键呢?经过研究发现在填充Dataset的时候可以使用DataAdapterMissingSchemaAction属性帮助我们解决这个问题,于是有如下的代码:

        //使用DataAdapter填充DataTable
        dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        dataadapter.Fill(Table);

        DataColumn[] cols;
        cols = Table.PrimaryKey;
        
    //注意不是colsDataColumn数组,不是DataColumn变量。这样做主要是为了处理联合主键的问题。
        for(int i = 0; i < cols.Length; i++)
        
    {
            MessageBox.Show(cols[i].ColumnName);
        }


    这样我们便可以如愿以偿了。MissingSchemaAction属性是确定现有Dataset(或DataTable)架构与传入数据不匹配时需要执行的操作。MissingSchemaAction.AddWithKey是枚举值,它的作用是添加必需的列和主键信息以完成架构,利用它用户可以在每个 DataTable上显式设置主键约束。

    ------------------------------------------------------------------------------------------------------------------------------------------

    DataTable中数据记录的统计

         我们在使用Sql Server这些数据库时,可以轻松的通过SumAverCount等统计出相关结果,那么,在已经把数据检索出来的DataSetDataTable)中呢?特别是通过Web Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了。那么在DataSet/DataTable中是否可以进行统计呢?

        
    MSDN中,有一篇MS推荐的统计方法,就是逐行对数据进行求和统计,这个方法,其实有等于无(或许这个方法只是针对于DataGrid求取小计用吧),因为这个方法中采用的是DataGridItemDataBind事件来对数据进行累加,同我们手动写代码统计没有什么区别。

    本文介绍一个简单的方法,不需要逐条记录进行计算就可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute

    一、调用说明(仅以C#为例,下同):

    public object Compute(string strExpression,string strFilter)

    参数:

    strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式

    strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计

    二、调用举例:

         以下示例,假设一个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(Sex0为女,1为男)、生日(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。

    1。统计所有性别为女的销售员的数量:
    table.Compute("Count(*)","Sex=0");

    2。统计所有销售员中年龄大于20岁的
    table.Compute("Count(*)","Birthday<'"+today);//today
    为今天的日期字符串

    3。统计销售产品的平均价格
    table.Compute("Aver(Price)","true");

    4。统计产品代码为1的产品销售数量:
    table.Compute("Sum(Quantity)","ProID=1");

    5。统计所有产品的销售总金额:
    要统计总销售金额,由于table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如:
    table.Compute("Sum(Quantity*Price)","true");

    这里一个问题是:DataTable的统计功能没有SqlServer强,这个统计是错误的,因为Compute的统计不具备Sum(Quantity*Price)这样数据的功能。那怎么办呢?

    对于这样复杂数据的统计,我们可以在DataTable中创建一个新的字段来完成,比如Amount,同时设置该字段的ExpressionQuantity*Price,这样我们就可以使用统计功能了:
    table.Compute("Sum(Amount)","true");

    以上都是计算每一列的合计,要添加一行求合计可以使用下面的方法:

    System.Data.DataRow dataRow=dataSet.Tables[0].NewRow()
    '
    假设你的DataSetdataSet,表在索引0位置,同时假设你的所有字段都是可以求合计的。

    转地址:http://chinesewind.cnblogs.com/archive/2005/11/30/287957.html

    System.DataRow dataRow new System.DataRow();
    dataRow=DT.NewRow();

    然后就是统计了:
    int i ;
    int fldCnt ;

    fldCnt=DT.Cols.Count;

    for( i=0 ;i< fldCnt-1;i++)
       dataRow(i)=DT.Compute("Sum("+i.ToString()+")","true");

    DT.Rows.Add(dataRow);

    好了,大功告成。希望对大家有用。

    -------------------------------------------------------------------------------------------

      在下面的例子中实现了3个Join方法,其目的是把两个DataTable连接起来,相当于Sql的Inner Join方法,返回DataTable的所有列。
    如果两个DataTable中的DataColumn有重复的话,把第二个设置为ColumnName+"_Second",下面是代码,希望对大家有所帮助。
    using System;
    using System.Data;
    CHINAZ

    namespace WindowsApplication1
    {
        public class SQLOps
        {
            public SQLOps()
            {           
            }
            public static DataTable Join (DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC)
            {
                //创建一个新的DataTable
                DataTable table = new DataTable("Join");
                // Use a DataSet to leverage DataRelation
                using(DataSet ds = new DataSet())
    CHINAZ

    CHINAZ


                {
                    //把DataTable Copy到DataSet中

     

                    ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});

    CHINAZ

     

                    DataColumn[] parentcolumns = new DataColumn[FJC.Length];

    CHINAZ

     

                    for(int i = 0; i < parentcolumns.Length; i++)
                    {
                        parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
                    }
                    DataColumn[] childcolumns = new DataColumn[SJC.Length];
                    for(int i = 0; i < childcolumns.Length; i++)
                    {
                        childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName];
    CHINAZ

    CHINAZ


                    }

     

                    //创建关联
                    DataRelation r = new DataRelation(string.Empty,parentcolumns,childcolumns,false);
                    ds.Relations.Add(r);
    CHINAZ

                    //为关联表创建列
                    for(int i = 0; i < First.Columns.Count; i++)
                    {
                        table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
                    }
                    for(int i = 0; i < Second.Columns.Count; i++)
                    {
                        //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second

    CHINAZ


                        if(!table.Columns.Contains(Second.Columns[i].ColumnName))
                            table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
                        else
                            table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
                    }
                    table.BeginLoadData();
                    foreach(DataRow firstrow in ds.Tables[0].Rows)

    CHINAZ


                    {
                        //得到行的数据
                        DataRow[] childrows = firstrow.GetChildRows(r);
                        if(childrows != null && childrows.Length > 0)
                        {
                            object[] parentarray = firstrow.ItemArray;
                            foreach(DataRow secondrow in childrows)

    CHINAZ


                            {
                                object[] secondarray = secondrow.ItemArray;
                                object[] joinarray = new object[parentarray.Length+secondarray.Length];
                                Array.Copy(parentarray,0,joinarray,0,parentarray.Length);
                                Array.Copy(secondarray,0,joinarray,parentarray.Length,secondarray.Length); CHINAZ
                                table.LoadDataRow(joinarray,true);
                            }
                        }
                    }
                    table.EndLoadData();
                }
                return table;
            }
            public static DataTable Join (DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC)

    CHINAZ


            {
                return Join(First, Second, new DataColumn[]{FJC}, new DataColumn[]{SJC});
            }
            public static DataTable Join (DataTable First, DataTable Second, string FJC, string SJC)
            {
                return Join(First, Second, new DataColumn[]{First.Columns[FJC]}, new DataColumn[]{First.Columns[SJC]});
            }
        }
    }

    --------------------------------------------------------------------------------------------------------------------------------------------

    DataTable操作中的性能问题 最近的一项工作是关于性能提升方面的。要做的第一个事情是要把很多同类型的DataTable合并到一起,查了很多关于DataTable的相关函数以后,我决定用Merge函数来合并这些DataTable。
    DataTable[] srcTables = ... ;
    foreach( DataTable src in srcTables )
    {
    dest.Merge( src ) ;
    }
    但是测试的结果让我很是失望,性能不是一般的不好。经过调查发现性能的瓶颈在Merge函数这里。后来经过测试,发现如果用下面的代码:
    DataTable[] srcTables = ... ;
    foreach( DataTable src in srcTables )
    {
    foreach( DataRow row in src.Rows)
    {
    dest.ImportRow( row ) ;
    }
    }

    结果让人惊奇的是,下面的代面的速度是上面的代码速度的100倍!

    还做了一个事情,就是对DataTable进行filter的时候 ,我的一个同事和我说了以下的代码:
    DataView dv = dt.DefaultView ;
    dv.RowFilter = filter ;
    DataTable result = dv.ToTable() ;
    上面的代码是能工作的,但是它的性能一点都不好,后来我把上面的代码改成了:
    DataRow[] rows = dv.Select( filter ) ;
    foreach( DataRow row in rows )
    {
    result.ImportRow(row) ;
    }

    也有数十倍的性能提高。

    没想到有这么多的朋友看这个文章,我看了一下Table的Merge函数,下面是关键函数:
    private void MergeTable(DataTable src, DataTable dst)
    {
    int count = src.Rows.Count;
    bool flag = dst.Rows.Count == 0;
    if (0 < count)
    {
    Index ndx = null;
    DataKey srcKey = new DataKey();
    dst.SuspendIndexEvents();
    tr

    从中我们可以看到Merge做了什么,Merge Table的时候,对每一行,都要有一个对Index进行操作的过程,查看现在要进行insert的row是不是存在重复等等操作。而对我们只想进行append操作的时候,显然是多余的了。

     

    我们先看一段WEB Service的代码。

      [WebMethod]
    public DataTable GetInfo()
    ...{
    OleDbConnection nwindConn = new OleDbConnection(
    "Provider=Microsoft.Jet.OLEDB.4.0;" +
    "Data Source=D:Northwind orthwind.mdb;");
    OleDbCommand selectCMD =
    new OleDbCommand("SELECT CustomerID, CompanyName FROM Customers"
    , nwindConn);
    selectCMD.CommandTimeout = 30;
    OleDbDataAdapter custDA = new OleDbDataAdapter();
    custDA.SelectCommand = selectCMD;
    DataSet custDS = new DataSet();
    custDA.Fill(custDS, "Customers");
    return custDS.Tables[0];
    }

      在.net 1.1 中,这是典型的一个错误,在.net 1.1 、1.0中,WEB Service 的返回或者输入参数不能是 DataTable,这是一个众人皆知的知识点。原因就是 DataTable 不象DataSet那样支持序列化。在.net 1.1中,我们解决这个问题的方法就是使用DataSet。但是使用DataSet 的时候,经常会有一种杀鸡用牛刀的感觉。

      附:.net 1.1 中使用DataTable作为WEB Service 返回值会报以下异常:

      类型 System.ComponentModel.ISite 的成员 System.ComponentModel.MarshalByValueComponent.Site 是接口,因此无法将其序列化。

      在.net 2.0 中,以上同样的代码,则没有任何问题了。原因是2.0中 DataTable实现了序列化、反序列。

      在VS2005 Beta2 的文档中,我们可以看到2.0 中 DataTable实现了以下接口:

      Explicit Interface Implementations
    System.ComponentModel.IListSource.get_ContainsListCollection
    System.ComponentModel.IListSource.GetList
    System.Xml.Serialization.IXmlSerializable.GetSchema
    System.Xml.Serialization.IXmlSerializable.ReadXml
    System.Xml.Serialization.IXmlSerializable.WriteXml

      而在1.1中,DataTable 只实现了一个接口:

      Explicit Interfa

    而在1.1中,DataTable 只实现了一个接口:

      Explicit Interface Implementations
    System.ComponentModel.IListSource.ContainsListCollection

      把DataSet中的一些功能移到 DataTable中,2.0 中还有 Merge 方法,即合并数个数据集。

      DataTable的代码合并参看下面代码。

      private static void DemonstrateMergeTable()
    ...{
    DataTable table1 = new DataTable("Items");
    DataColumn column1 = new DataColumn("id", typeof(System.Int32));
    DataColumn column2 = new DataColumn("item", typeof(System.Int32));
    table1.Columns.Add(column1);
    table1.Columns.Add(column2);
    table1.PrimaryKey = new DataColumn[] ...{ column1 };
    table1.RowChanged += new System.Data.DataRowChangeEventHandler(Row_Changed);
    DataRow row;
    for (int i = 0; i <= 3; i++)
    ...{
    row = table1.NewRow();
    row["id"] = i;
    row["item"] = i;
    table1.Rows.Add(row);
    }
    // Accept changes.
    table1.AcceptChanges();
    DataTable table2 = table1.Clone();
    row = table2.NewRow();
    row["id"] = 14;
    row["item"] = 774;
    table2.Rows.Add(row);
    row = table2.NewRow();
    row["id"] = 12;
    row["item"] = 555;
    table2.Rows.Add(row);
    row = table2.NewRow();
    row["id"] = 13;
    row["item"] = 665;
    table2.Rows.Add(row);
    // Merge table2 into the table1.
    table1.Merge(table2);
    }

      综合上述,.net 2.0 中 DataTable 从后台的默默无问的小兵变成独当一面的大将了。

    展开全文
  • C#Datatable

    2020-11-16 23:58:14
    C#操作Datatable //导入命名空间 using System.Data; 创建Datatable //创建一个空表 Datatable dt=new Datatable(); //创建一个名为NewTab的空表 Datatable dt=new Datatable("NewTab"); 创建列 //创建空列 ...

    C#操作Datatable

    //导入命名空间
    	using System.Data;
    

    创建Datatable

    //创建一个空表
    	Datatable dt=new Datatable();
    //创建一个名为NewTab的空表
    	Datatable dt=new Datatable("NewTab");	
    

    创建列

    //创建空列
    	DataColumn dc=new DataColumn();
    	dt.Columns.Add(dc);
    //创建带列名和类型名的列(2种方式)
    	dt.Columns.Add("列名",System.Type.GetType("System.String"));
    	dt.Columns.Add("列名",typeof(String));
    //指定位置添加列,根据列索引 i
    	dt.Columns.Add("列名",System.Type.GetType("System.String")).SetOrdinal(i);
    dt.Columns.Add("列名",typeof(String)).SetOrdinal(i);
    

    创建行

    //1.创建空行
    	DataRow dr=dt.NewRow();
    	dt.Rows.Add(dr);
    //2.创建空行
    	dt.Rows.Add();
    //3.通过行框架创建并赋值
    	dt.Rows.Add("张三","男","未婚");
    //通过复制dt2表中的某一列来创建
    	dt.Rows.Add(dt2.Rows[i].ItemArray);
    

    取值与赋值

    //新建行的赋值
    DataRow dr = dt.NewRow();
    dr[0] = "张三";//通过索引赋值
    dr["column1"] = DateTime.Now; //通过名称赋值
    //对表已有行进行赋值
    dt.Rows[0][0] = "张三"; //通过索引赋值
    dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
    //取值
    string name=dt.Rows[0][0].ToString();
    string time=dt.Rows[0]["column1"].ToString();
    

    筛选行

    //选择所有行
    DataRow[] drs=dt.Select();
    //选择column1列值为空的行的集合
    DataRow[] drs = dt.Select("column1 is null");
    //选择column0列值为"李四"的行的集合
    DataRow[] drs = dt.Select("column0 = '李四'");
    //筛选column0列值中有"张"的行的集合(模糊查询)
    DataRow[] drs = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or
    //筛选column0列值中有"张"的行的集合并按column1降序排序
    DataRow[] drs = dt.Select("column0 like '张%'", "column1 DESC");
    

    删除行

    //使用DataTable.Rows.Remove(DataRow)方法
    	dt.Rows.Remove(dt.Rows[0]);
    //使用DataTable.Rows.RemoveAt(index)方法
    	dt.Rows.RemoveAt(0);
    //使用DataRow.Delete()方法
    	dt.Row[0].Delete();
    	dt.AcceptChanges();
     
    //-----区别和注意点-----
    //Remove()和RemoveAt()方法是直接删除
    //Delete()方法只是将该行标记为deleted,但是还存在,还可DataTable.RejectChanges()回滚,使该行取消删除。
    //用Rows.Count来获取行数时,还是删除之前的行数,需要使用DataTable.AcceptChanges()方法来提交修改。
    //如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows,而且不能用foreach进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
    for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {
      dt.Rows.RemoveAt(i);
    }
    /*Delete()删除*/
    for(int i=0;i<=dt.Rows.Count-1;i++){
    	if(i==2 || i==1){
    		dt.Rows[i].Delete();
    	}
    }
    dt.AcceptChanges();
    Console.WriteLine(dt.Rows.Count);
    

    复制表

    //复制表,同时复制了表结构和表中的数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    //复制表
    DataTable dtNew = dt.Copy(); //复制dt表数据结构
    dtNew.Clear() //清空数据
    for (int i = 0; i < dt.Rows.Count; i++)
    {
      if (条件语句)
      {
         dtNew.Rows.Add(dt.Rows[i].ItemArray); //添加数据行
      }
    }
    //克隆表,只是复制了表结构,不包括数据
    DataTable dtNew = new DataTable();
    dtNew = dt.Clone();
    //如果只需要某个表中的某一行
    DataTable dtNew = new DataTable();
    dtNew = dt.Copy();
    dtNew.Rows.Clear();//清空表数据
    dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行
    

    Datatable按照某列去重(Linq)

    /*duizhaoTable 为需要删除重复行的表   dt为重后得到的新表    设备所属单位为列名       First/Last  保留每组的第一行或者最后一行*/
    dt= duizhaoTable.AsEnumerable().GroupBy(p => p["设备所属单位"]).SelectMany(p => p.GroupBy(s => s["设备所属单位"]).Select(x => x.First())).CopyToDataTable<DataRow>();
    
    展开全文
  • DataTable简介

    2018-04-25 16:57:52
    (1)构造函数DataTable() 不带参数初始化DataTable 类的新实例。DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例。DataTable(string tableName, string tableNamespace) 用指定的表名和命名...
  • c# DataTable

    千次阅读 2019-04-09 17:03:16
    System.Data.DataTable https://blog.csdn.net/xpj8888/article/details/85763925 DataTable ,是内存中存储数据的一块单元或者地方。 怎么操作呢? C# DataTable 详解 ...DataTa...
  • 两个DataTable的合并首先需要保证两个DataTable的格式是相同的,即column数量相同,名称相同 1、新建两个DataTable Dim DataTable1 As New DataTable Dim DataTable2 As New DataTable 2、为DataTable创建...
  • datatable清空

    千次阅读 2017-12-08 11:28:02
    $('#listTab').dataTable().fnDestroy();//还原初始化了的datatable  $('#listTab').dataTable().fnClearTable();//清空一下table
  • 两个结构一样的DT合并DataTable DataTable1 = new DataTable();DataTable DataTable2 = new DataTable();DataTable newDataTable = DataTable1.Clone(); object[] obj = new object[newDataTable.Columns.Count];for...
  • C# 合并datatable

    2020-08-20 10:47:46
    合并两个列相同得datatable(为了省事就直接new 了两个datatableDataTable dataTable1 = new DataTable(); DataTable dataTable2 = new DataTable(); dataTable1.Merge(dataTable2); // 这样dataTable1里边就有...
  • 创建 datatable、给表datatable添加列名、给表DataTable加行,过滤表DataTable内容等。1.创建 datatable DataTable dt=new Datable();//可以给表创建一个名字,tb2.给表加个列名: dt.Columns.Add("id",...
  • List转换DataTable

    2020-07-24 14:51:59
    一 C# List转换DataTable 的方法: public static DataTable ToDataTable<T>(IEnumerable<T> list) { PropertyInfo[] modelItemType = typeof(T).GetProperties(); DataTable dataTable = new ...
  • DataTable分组

    千次阅读 2019-05-15 17:40:09
    DataTable dt= dbhelp.Query(sql).Tables[0]; IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(dr => dr...
  • DataTable相关:datatable计算功能

    千次阅读 2012-06-07 19:55:29
    看了下大家对datatable的计算功能,搜集了一些例子贴上。 public class DataTableCompute { public static void SomeDataTableCompute() { DataTable myTesttable = new DataTable();
  • C# DataTable 去重

    2020-08-25 09:46:59
    C# DataTable 的一些用法 去重 DataTable datatable = new DataTable(); datatable.DefaultView.ToTable(true); 未完,查看如些页面 https://www.cnblogs.com/Fooo/p/6666825.html?utm_source=itdadao&utm_...
  • 在利用C#做服务端,然后利用datatable向前端返回时,希望在某行数据内,添加一个数组。主要是dataTable 默认使用 datatable.columns.Add时, 未指定列的类型 默认为string,需要指定为DataTable类型! ...
  • var datatable = $("#table").dataTable();  if (datatable) {   datatable.fnClearTable(); //清空数据  datatable.fnDestroy(); //销毁datatable  }   updateTableRec...
  • 初识DataTable

    热门讨论 2015-03-15 20:24:10
    在重构机房时,D层负责与数据库交互。D层对数据库进行查询...DataTable对象是组成DataSet对象的主要组件,因DataSet对象可以接收由DataAdapter对象执行SQL指令后所取得的数据,这些数据是DataTable对象的格式,所以Dat
  • 一个DataTable,想把1~10,11~20,21~30 行拆成3个新的DataTable,除了循环遍历之外,有更好的方法么?
  • DataTable使用

    千次阅读 热门讨论 2014-03-21 11:01:59
    介绍DataTable两种常见操作: 1.合并两个DataTable 2.取得DataTable中不重复的列
  • ngx-datatable

    千次阅读 2018-08-14 17:10:00
    ngx-datatable是一个用于呈现大型复杂数据的Angular组件。它具有您期望从任何其他表中获得的所有功能,但是在没有外部依赖性的轻型包中。桌子设计得非常灵活轻便; 它不会对您的数据或您如何做出任何假设:对其进行...
  • DataTable dt1 = new DataTable(); DataTable dt2 = new DataTable();   如果dt1 和 dt2结构相同,又要想办法将dt1和dt2的数据合并到一个datatable中则可以使用如下方法:   1、新建一个DataTable ...
  • c# DataTable select 过滤返回新DataTable

    千次阅读 2017-06-20 15:55:24
    DataRow[] dr = dt.Select(“col='XXXX'”);//条件:就是字段名='某某' ... /// 执行DataTable中的查询返回新的DataTable  ///  /// 源数据DataTable  /// 查询条件  ///  private DataTable Ge
  • DataTable Select

    2017-11-17 11:50:01
    Select操作是大小写不敏感的(记录的字段不敏感),如果需要区分大小写,需要将DataTable的caseSensitive属性设为true。
  • DataTable合并

    2013-06-01 17:12:47
    两个结构一样的DataTable合并 view plaincopy to clipboardprint? DataTable DataTable1 = new DataTable(); DataTable DataTable2 = new DataTable(); DataTable newDataTable = DataTable1.Clone(); object[]...
  • DataTable销毁对象

    千次阅读 2019-05-22 18:11:34
    dataTable动态改变列的时候需要重新销毁对象: // 动态改变列,需要先销毁对象 "columns":columns if ( $.fn.dataTable.isDataTable('#dataTable')) { $('#dataTable').DataTable().destroy(); $('#dataTable')....
  • datatable第二次绑定先销毁原datatable

    万次阅读 2017-09-21 16:00:38
    参考资料 ... 第一次查询结果通过datatable实现分页,第二次查询时,先销毁datatable,然后重新绑定 var datatable = $("#table").dataTable();  if (datatable) {   datatable.fnCl

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,073
精华内容 15,229
热门标签
关键字:

datatable