本篇把项目中用到的一些通用方法总结出来, 这些方法因为经常需要在项目中用到,所以把它们归纳在一起, 形成一个.dll 文件是一个理想的选择. 这样也便于日后缩短开发周期.
 
一. 把一个DataGridView对象转换成一个DataTable对象
 public static DataTable GetDgvToTable(DataGridView dgv)
   {
           if(dgv==null) throw new NullReferenceException();
            DataTable dt = new DataTable();
            for (int count = 0; count < dgv.Columns.Count; count++)  //遍历DataGridView每一列
            {
                DataColumn _column = new DataColumn(dgv.Columns[count].Name.ToString()); //根据DataGridView每一列创建一个列对象
                dt.Columns.Add(_column); //添加列
            }  
           for (int count = 0; count < dgv.Rows.Count; count++)    //遍历DataGridView没一行
            {
                DataRow dr = dt.NewRow();
                for (int col = 0; col < dgv.Columns.Count; col++)
                {
                    dr[col] = dgv.Rows[count].Cells[col].Value == null ? "" : dgv.Rows[count].Cells[col].Value.ToString();
                }
                dt.Rows.Add(dr); //添加行
            }
            return dt;
        }
 
2. 给DataTable添加合计行
 public static DataTable AddCountRow(DataTable dt, int[] index)
     {
            if (dt.Rows.Count > 0)
            {
                DataRow row = dt.NewRow();
                row[0] = "合计:";
                row[1] = dt.Rows.Count + "";
                for (int i = 0; i < index.Length; i++) //遍历需要合计的行
                {
                    for (int j = 0; j < dt.Columns.Count; j++) //遍历DataTable每一列
                    {
                        int columnIndex = 0;
                        if (index == j) //找到第一个要合计的列
                        {
                            columnIndex = index; //合计列索引
                            string columname = dt.Columns[columnIndex].ColumnName; //要合计列的名称
                            if (string.IsNullOrEmpty(dt.Compute("sum(" + columname + ")", "true").ToString())) //判断是否为空
                                row[columnIndex] = 0.00;
                            else
                                row[columnIndex] = decimal.Parse(dt.Compute("sum(" + columname + ")", "true").ToString());  //得到合计列的结果
                            break;
                        }
                    }
                }
                dt.Rows.Add(row);
            }
            return dt;
        }

 
3. 将DataTable数据集映射到实体对象
  public static List<TResult> TableToObject<TResult>(DataTable dt, TResult ob) //泛型方法,此处TResult为类型参数
        {
            List<PropertyInfo> prlist = new List<PropertyInfo>();//创建一个属性列表集合

Type t = typeof(TResult); //获取实体对象的元数据Type类型

PropertyInfo[] prArr = t.GetProperties(); //取得实体对象的所有属性到属性集合中

foreach (PropertyInfo pr in prArr) //循环遍历属性集合到List集合
                prlist.Add(pr);
            //通过匿名方法自定义筛选条件  => 检查datatable中是否存在存在此列, 
            Predicate<PropertyInfo> prPredicate = delegate(PropertyInfo pr) { if (dt.Columns.IndexOf(pr.Name) != -1) return true; return false; };
            //从指定的条件中
           List<PropertyInfo> templist = prlist.FindAll(prPredicate);
           //创建一个实体集合
            List<TResult> oblist = new List<TResult>();
           //遍历DataTable每一行
            foreach (DataRow row in dt.Rows)
            {
                ob = (TResult)Activator.CreateInstance(t);  //通过Type类型创建对象,并强制转换成实体类型
                Action<PropertyInfo> prAction = delegate(PropertyInfo pr) {if(row[pr.Name] != DBNull.Value) pr.SetValue(ob, row[pr.Name], null); };
                 //把选择出来的属性集合的每一个属性设置成上面创建的对象的属性
                templist.ForEach(prAction);
                oblist.Add(ob); //把属性添加到实体集合
            }
            return oblist;
        }
 
4. 将一个DataTable导出到Excel中
// 参数依次为报表标题, 数据集
 public static void ExportExcel(string p_ReportName, DataTable dt)
        {
            string saveFileName = "";
            bool fileSaved = false;
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel文件|*.xls";
            saveDialog.FileName = "Sheet1";
            saveDialog.ShowDialog();
            saveFileName = saveDialog.FileName;
            if (saveFileName.IndexOf(":") < 0) return; //被点了取消

// 创建Excel对象                   
            Excel.Application xlApp = new Excel.ApplicationClass();
            if (xlApp == null)
            {
                MessageBox.Show("Excel无法启动");
                return;
            }
            // 创建Excel工作薄
            Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
            Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
            // 设置标题
            Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, dt.Columns.Count]);
            //Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, m_dt.Columns.Count]);
            range.MergeCells = true;
            xlApp.ActiveCell.FormulaR1C1 = p_ReportName;
            xlApp.ActiveCell.Font.Size = 20;
            xlApp.ActiveCell.Font.Bold = true;
            xlApp.ActiveCell.HorizontalAlignment = Excel.Constants.xlCenter;
            // 列索引,行索引,总列数,总行数
            int colIndex = 0;
            int RowIndex = 0;
            int colCount = dt.Columns.Count;
            int RowCount = dt.Rows.Count - 1;//this.BindingContext[this.DataSource, this.DataMember].Count;
            // 创建缓存数据
            object[,] objData = new object[RowCount + 1, colCount];
            // 获取列标题
            foreach (DataColumn cs in dt.Columns)
            {
                objData[RowIndex, colIndex++] = cs.ColumnName;
            }
            // 获取数据
            for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
            {
                for (colIndex = 0; colIndex < colCount; colIndex++)
                {
                    objData[RowIndex, colIndex] = dt.Rows[RowIndex][colIndex];//this[RowIndex - 1, colIndex];
                }
                Application.DoEvents();
            }
            // 写入Excel
            range = xlSheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[RowCount, colCount]);
            range.Value2 = objData;
            // 保存
            try
            {
                xlBook.Saved = true;
                xlBook.SaveCopyAs(saveFileName);
                MessageBox.Show("导出成功!");
            }
            catch
            {
                MessageBox.Show("保存出错,请检查!");
                return;
            }
            finally
            {
                xlApp.Quit();
                GC.Collect();
            }
            return;
        }
5. 通过字典缓存一些不变的本地数据集
//声明一个字典集合
  private static Dictionary<string, object> dicObject = new Dictionary<string, object>();
//下面缓存某个数据集
  public static DataTable GetCustomers(string custup)
        {
            DataTable dt;
            string key = "AllCustomers" + custup;
            if (dicObject.ContainsKey(key))
            {
                dt = (DataTable)dicObject[key];
            }
            else
            {
                dt = BasicInfo.GetCustomers(custup).Tables[0];
                dicObject.Add(key, dt);
            }
            return dt;
        }

项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】的更多相关文章

  1. 为什么在项目中data需要使用return返回数据呢?

    问:为什么在项目中data需要使用return返回数据呢? 答:不使用return包裹的数据会在项目的全局可见,会造成变量污染:使用return包裹后数据中变量只在当前组件中生效,不会影响其他组件.

  2. 导出Excel文件(项目中会遇到很多将一些数据导出Excel或者et)

    最近在项目中,遇到一些需求,就是将数据导出来,以Excel文件为主:就自己简单的做一些demo:供初学者来学习: // 定义一个保存文件的路径位置 SaveFileDialog dlgPath = n ...

  3. 一个Web项目中实现多个数据库存储数据并相互切换用过吗?

    最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...

  4. 项目中整合第三方插件与SpringMVC数据格式化关于ip地址

    一.Bootstrap 响应式按钮 <div calss="col-sm-2"> <button class="btn btn-default btn- ...

  5. 项目中简单使用ztree,简单数据。

    由于公司架构较旧,使用的jdk版本为1.4,页面上也没有el表达式. 加入 js 文件 <% String context = request.getContextPath(); %> & ...

  6. vue项目中使用mockjs+axios模拟后台数据返回

    自己写练手项目的时候常常会遇到一个问题,没有后台接口,获取数据总是很麻烦,于是在网上找了下,发现一个挺好用的模拟后台接口数据的工具:mockjs.现在把自己在项目中使用的方法贴出来   先看下项目的目 ...

  7. 关于Servo项目中Rust代码行数的数据来源

    我两个月之前的一篇博客<为什么我说Rust是靠谱的编程语言>(下面简称原文),在当中"6. 两个半大型成功案例"一节.我以前写道: Servo: 下一代浏览器渲染引擎( ...

  8. MongoDB项目中常用方法

    使用MongoDB连接池MongoOptions来进行连接 以及相关方法的调用 //获得驱动地址(这里的驱动 写入了配置文件中) String serverAddressStr = Configure ...

  9. vue项目中使用mockjs模拟接口返回数据

    Mock.js 是一个模拟数据生成器,利用它,可以拦截ajax请求,直接模拟返回数据,这样前后端只要约定好数据格式,前端就不需要依赖后端的接口,可以直接使用模拟的数据了. 网上介绍mock的教程也较多 ...

随机推荐

  1. OpenWrt for vmware 从openwrt.org下载10.03.1 或是自己下载最新的源码进行编译生成x86 vmdk格式

    1,直接从OpenWrt.org官网下载 http://downloads.openwrt.org/backfire/10.03.1/x86_generic/ 更新OpenWrt在线软件源 opkg ...

  2. 通过项目逐步深入了解Mybatis<四>

    延迟加载 什么是延迟加载? resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. ...

  3. Mock.js:前后端分离开发工具

    概述 Mock.js实现的功能 基于 数据模板 生成数据 基于 HTML模板 生成数据 拦截并模拟 Ajax请求 用法 浏览器: <!-- (必选)加载 Mock --> <scri ...

  4. python中的tab补全功能添加

    用Python时没有tab补全还是挺痛苦的,记录一下添加该功能的方法利人利己 1. 先准备一个tab.py的脚本 shell> cat tab.py #!/usr/bin/python # py ...

  5. rhel5.8安装mysql测试

    MySQL-rhel5.8 安装:在Linux下安装MySQL有三种方式:第一种以rpm的二进制文件分个安装,第二种是自己编译源码后安装,最后一种是以二进制tar.gz文件来安装(这种安装方式下载安装 ...

  6. apache 开启压缩功能

    apache如何开启压缩功能. 1,首先先确认是安装deflatte模块.如果未安装,可以重新编译apache添加参数--enable-deflate=shared ,或者扩展安装deflate模块, ...

  7. eclipse安装svn插件,在输入url后,一直卡在in progress界面不懂。

    今天遇到上面的情况.网上找了半天都没有找到解决的办法.后来,仔细比对了一下我的eclipse版本和svn版本.发现svn版本真的太老了.用上新的svn后,立马就可以用了 svn - http://su ...

  8. React-Native个人信息界面

    最近在做一个小练习项目,用户登陆后需要跳转到用户登录信息界面,加班半个小时终于将界面的布局搞定.接触Rect-Native也有一段时间了,以前没有做过ios,只做过android,就布局和开发效率上来 ...

  9. css3:border-radius圆角边框详解 (变圆 图片)

    转:http://www.kuqin.com/shuoit/20141014/342620.html border-radius:50% 今天来聊聊这个border-radius属性,radius的英 ...

  10. wamp出现问题#1045 - Access denied for user 'root'@'localhost' (using password: NO)的解决方法

    打开wamp->apps->phpmyadmin目录下面的config.inc.php文件 cfg['Servers'][$i]['verbose'] = 'localhost';$cfg ...