GridView绑定DataTable后,如何获取GridView绑定后显示的值,在项目需求需要的背景下,搜索了获取单元格显示文本的方法,然后写了一个静态方法,经过在项目中的使用,bug的修复,较为稳定。

  1. #region ================GridView转DataTable方法================
  2. /// <param name="gv">已绑定数据源的GridView</param>
  3. /// <param name="showHideColumn">是否显示隐藏列</param>
  4. /// <returns>DataTable</returns>
  5. public static DataTable GridViewToDataTable(GridView gv, Boolean showHideColumn)
  6. {
  7. //处理后的数据表
  8. DataTable dt = new DataTable();
  9.  
  10. //记录符合条件索引
  11. int[] columnIndexs = new int[gv.HeaderRow.Cells.Count];
  12. //记录指示器从0开始
  13. int columnIndexsCount = ;
  14.  
  15. //初始化dt列名
  16. for (int i = ; i < gv.HeaderRow.Cells.Count; i++)
  17. {
  18. //获取列名
  19. string columnName = GetCellText(gv.HeaderRow.Cells[i]);
  20. //string columnName = gv.HeaderRow.Cells[i].Text;
  21.  
  22. //列名非空//且可见
  23. if (!string.IsNullOrEmpty(columnName))
  24. {
  25. //是否显示隐藏列
  26. if (gv.HeaderRow.Cells[i].Visible || showHideColumn)
  27. {
  28. //列名不允许重复
  29. if (!dt.Columns.Contains(columnName))
  30. {
  31. //dt中新增一列
  32. DataColumn dc = dt.Columns.Add();
  33. //列名
  34. dc.ColumnName = columnName;
  35. //存储的数据类型
  36. dc.DataType = typeof(string);
  37.  
  38. //记录符合条件的列索引
  39. columnIndexs[columnIndexsCount] = i;
  40. //记录指示器+1
  41. columnIndexsCount++;
  42. }
  43. }
  44. }
  45. }
  46.  
  47. //GridView行复制到数组中便于操作
  48. GridViewRow[] allGridViewRow = new GridViewRow[gv.Rows.Count];
  49. gv.Rows.CopyTo(allGridViewRow, );
  50.  
  51. //数据添加到dt中
  52. foreach (GridViewRow row in allGridViewRow)
  53. {
  54. //创建一行
  55. DataRow dr = dt.NewRow();
  56. //符合条件的列
  57. for (int i = ; i < columnIndexsCount; i++)
  58. {
  59. //获取显示文本并保存
  60. dr[i] = GetCellText(row.Cells[columnIndexs[i]]);
  61. }
  62. //dt中增加此行
  63. dt.Rows.Add(dr);
  64. }
  65. //返回处理后的数据
  66. return dt;
  67. }
  68.  
  69. /// <param name="gv">未绑定数据源的GridView</param>
  70. /// <param name="dtSource">GridView的数据源</param>
  71. /// <param name="showHideColumn">是否显示隐藏列</param>
  72. /// <returns>DataTable</returns>
  73. public static DataTable GridViewToDataTable(GridView gv, DataTable dtSource, Boolean showHideColumn)
  74. {
  75. //绑定原始数据到GridView
  76. gv.DataSource = dtSource;
  77. gv.DataBind();
  78. //设置为不分页
  79. gv.AllowPaging = false;
  80. //GridView转DataTable并返回
  81. return GridViewToDataTable(gv, showHideColumn);
  82. }
  83. #endregion
  84.  
  85. #region ================私有工具方法================
  86. /// <param name="cell">TableCell</param>
  87. /// <returns>string</returns>
  88. private static string GetCellText(TableCell cell)
  89. {
  90. string cellText = cell.Text;
  91. //常规文本(无控件)直接返回
  92. if (!string.IsNullOrEmpty(cellText))
  93. {
  94. //返回显示文本
  95. return cellText.Replace(" ", "");
  96. }
  97. //遍历cell中的控件
  98. foreach (Control control in cell.Controls)
  99. {
  100. if (control != null && control is IButtonControl)
  101. {
  102. IButtonControl btn = control as IButtonControl;
  103. cellText += btn.Text.Replace("\r\n", "").Trim();
  104. continue;
  105. }
  106. if (control != null && control is ITextControl)
  107. {
  108. LiteralControl lc = control as LiteralControl;
  109. if (lc != null)
  110. {
  111. //跳出到下一步foreach
  112. continue;
  113. }
  114. ITextControl l = control as ITextControl;
  115.  
  116. cellText += l.Text.Replace("\r\n", "").Trim();
  117. continue;
  118. }
  119. }
  120. //返回显示文本
  121. return cellText;
  122. }
  123. #endregion
  1. #region ================另一种方法================
  2. public static DataTable GetGridDataTable(GridView grid)
  3. {
  4. DataTable dt = new DataTable();
  5. DataColumn dc;//创建列
  6. DataRow dr; //创建行
  7. //构造列
  8. for (int i = ; i < grid.Columns.Count; i++)
  9. {
  10. dc = new DataColumn();
  11. dc.ColumnName = grid.Columns[i].HeaderText;
  12. dt.Columns.Add(dc);
  13. }
  14. //构造行
  15. for (int i = ; i < grid.Rows.Count; i++)
  16. {
  17. dr = dt.NewRow();
  18. for (int j = ; j < grid.Columns.Count; j++)
  19. {
  20. dr[j] = grid.Rows[i].Cells[j].Text;
  21. }
  22. dt.Rows.Add(dr);
  23. }
  24.  
  25. return dt;
  26. }
  27. #endregion

Asp.net GridView转换成DataTable的更多相关文章

  1. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

    步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...

  2. C#_List转换成DataTable

    /// <summary> /// 讲list集合转换成datatable /// </summary> /// <param name="list" ...

  3. 将List转换成DataTable

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  4. list转换成DataTable

    list转换成DataTable类如下: public static DataTable ToDataTable<T>(this IList<T> datas) { DataT ...

  5. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

  6. Asp.net SqlDataReader转成Datatable

    Asp.net SqlDataReader转成Datatable 所属栏目:Asp.net 编程 | 发布日期:2013年04月05日 | 点击:517 次 内容摘要:Asp.net 数据存储,呈现方 ...

  7. C# DataTable转换成实体列表 与 实体列表转换成DataTable

    /// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T"&g ...

  8. 获取报告 Stream转string,利用字符串分割转换成DataTable

    protected void Button1_Click(object sender, EventArgs e) { MemoryStream stream = new MemoryStream(); ...

  9. C#:CsvReader读取.CSV文件并转换成DataTable

    原文引用:https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader using LumenWorks.Framework.IO.Csv; ...

随机推荐

  1. 解决IE6兼容性问题的十一大技巧

    10要点解决IE6兼容性问题 1.使用声明 你必须经常在html网页头部放置一个声明,推荐使用严格的标准.例如 <!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01// ...

  2. Jaspersoft Studio 导出PDF格式中文不显示

    1:设置字体 2:应用上面设置的字体

  3. Codeforces Round #310 (Div. 1) B. Case of Fugitive(set二分)

    B. Case of Fugitive time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  4. 很赞的idea教程

    感谢: http://pan.baidu.com/s/1dDEaVxn

  5. ES6学习笔记二:各种扩展

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7242967.html 一:字符串扩展 1:字符串遍历器 for (let char of str) { // ...

  6. JavaWeb应用出现HTTP 500-Unable to compile class for JSP 错误 的解决

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6383192.html 在上一篇博文中,我们把自己本机的web项目部署到了云主机的tomcat上.之后通过浏览器 ...

  7. libvlc_new 调用产生段错误

    在调试程序的时候,碰到一个奇怪的段错误问题.只要链接的时候使用-Wl,-rpath=./vlc/lib就会产生段错误,如果链接的时候使用的是-Wl,-rpath=../../tool/vlc/lib则 ...

  8. 获取spring的ApplicationContext几种方式【转】

    转自:http://blog.sina.com.cn/s/blog_9c7ba64d0101evar.html Java类获取spring 容器的bean 常用的5种获取spring 中bean的方式 ...

  9. oracle11g-R2静默安装报错[INS-32013]解决方案

    问题描述: oracle静默安装很强大...,参数搞不对.安装就扯dan了....这个报错搞了一个下午.终于搞定了如释负重.... 如果当初选择仅仅安装oracle软件就没多事情.想一步完成(数据库软 ...

  10. 使用PHP做移动端 api接口开发方法(适用于TP框架)

    1. [代码]使用TP框架时 放在common文件夹下文件名就叫function.php ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...