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

  #region ================GridView转DataTable方法================
/// <param name="gv">已绑定数据源的GridView</param>
/// <param name="showHideColumn">是否显示隐藏列</param>
/// <returns>DataTable</returns>
public static DataTable GridViewToDataTable(GridView gv, Boolean showHideColumn)
{
//处理后的数据表
DataTable dt = new DataTable(); //记录符合条件索引
int[] columnIndexs = new int[gv.HeaderRow.Cells.Count];
//记录指示器从0开始
int columnIndexsCount = ; //初始化dt列名
for (int i = ; i < gv.HeaderRow.Cells.Count; i++)
{
//获取列名
string columnName = GetCellText(gv.HeaderRow.Cells[i]);
//string columnName = gv.HeaderRow.Cells[i].Text; //列名非空//且可见
if (!string.IsNullOrEmpty(columnName))
{
//是否显示隐藏列
if (gv.HeaderRow.Cells[i].Visible || showHideColumn)
{
//列名不允许重复
if (!dt.Columns.Contains(columnName))
{
//dt中新增一列
DataColumn dc = dt.Columns.Add();
//列名
dc.ColumnName = columnName;
//存储的数据类型
dc.DataType = typeof(string); //记录符合条件的列索引
columnIndexs[columnIndexsCount] = i;
//记录指示器+1
columnIndexsCount++;
}
}
}
} //GridView行复制到数组中便于操作
GridViewRow[] allGridViewRow = new GridViewRow[gv.Rows.Count];
gv.Rows.CopyTo(allGridViewRow, ); //数据添加到dt中
foreach (GridViewRow row in allGridViewRow)
{
//创建一行
DataRow dr = dt.NewRow();
//符合条件的列
for (int i = ; i < columnIndexsCount; i++)
{
//获取显示文本并保存
dr[i] = GetCellText(row.Cells[columnIndexs[i]]);
}
//dt中增加此行
dt.Rows.Add(dr);
}
//返回处理后的数据
return dt;
} /// <param name="gv">未绑定数据源的GridView</param>
/// <param name="dtSource">GridView的数据源</param>
/// <param name="showHideColumn">是否显示隐藏列</param>
/// <returns>DataTable</returns>
public static DataTable GridViewToDataTable(GridView gv, DataTable dtSource, Boolean showHideColumn)
{
//绑定原始数据到GridView
gv.DataSource = dtSource;
gv.DataBind();
//设置为不分页
gv.AllowPaging = false;
//GridView转DataTable并返回
return GridViewToDataTable(gv, showHideColumn);
}
#endregion #region ================私有工具方法================
/// <param name="cell">TableCell</param>
/// <returns>string</returns>
private static string GetCellText(TableCell cell)
{
string cellText = cell.Text;
//常规文本(无控件)直接返回
if (!string.IsNullOrEmpty(cellText))
{
//返回显示文本
return cellText.Replace(" ", "");
}
//遍历cell中的控件
foreach (Control control in cell.Controls)
{
if (control != null && control is IButtonControl)
{
IButtonControl btn = control as IButtonControl;
cellText += btn.Text.Replace("\r\n", "").Trim();
continue;
}
if (control != null && control is ITextControl)
{
LiteralControl lc = control as LiteralControl;
if (lc != null)
{
//跳出到下一步foreach
continue;
}
ITextControl l = control as ITextControl; cellText += l.Text.Replace("\r\n", "").Trim();
continue;
}
}
//返回显示文本
return cellText;
}
#endregion
   #region ================另一种方法================
public static DataTable GetGridDataTable(GridView grid)
{
DataTable dt = new DataTable();
DataColumn dc;//创建列
DataRow dr; //创建行
//构造列
for (int i = ; i < grid.Columns.Count; i++)
{
dc = new DataColumn();
dc.ColumnName = grid.Columns[i].HeaderText;
dt.Columns.Add(dc);
}
//构造行
for (int i = ; i < grid.Rows.Count; i++)
{
dr = dt.NewRow();
for (int j = ; j < grid.Columns.Count; j++)
{
dr[j] = grid.Rows[i].Cells[j].Text;
}
dt.Rows.Add(dr);
} return dt;
}
#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. Swift语言精要 - Dictionary(字典)

    字典以键值对的形式存储数据. 键不能重复,但是值可以重复. 基本语法用例: var states : Dictionary<String, String> = ["CA" ...

  2. var, object, dynamic的区别以及使用

    var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...

  3. MVC 之 缓存机制(二)

    八.应用程序缓存 应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中. 使用应用程序缓存与使用应用程序状态类似. 但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的, 即数据 ...

  4. 教你轻松计算AOE网关键路径

    认识AOE网 有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV网络:AOV网络可以反应任务完成的先后顺序(拓扑排序). 在AOV网的边上加上权值表示完成该活动所需的 ...

  5. 微信小程序 - 自适应swiper高度(非组件)

    微信小程序swiper默认高度375rpx,一旦超过这高度,就滑动不到内容了,我们利用css3可以很简单做到这件事情 原理: 利用css3 横轴滚动属性overflow:scroll,设置死swipe ...

  6. 微信小程序 - 接口更新记录以及解决方案(2018/12/26)

    2018/8/17 - 背景音频需要在app.json添加requireBackGroundModes 2018/9/12 - 微信更改获取用户信息接口/获取位置等接口 - button 2018/1 ...

  7. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

  8. Percona-XtraBackup系列一:安装 perl(Time::HiRes) is needed by percona-xtrabackup-2.2.10-1.el6.x86_64

    1:在percona官网下载最新的Xtrabackup http://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.10/bi ...

  9. 使用 loop device 制作安装镜像

    看了下,手上的镜像中,文件系统才 100 多兆,但是整个镜像居然要 4G, 这意味着,我每次安装这个镜像到 SD 卡都要花很多没必要的时间. 所以,我提取了一些关键内容,然后,准备重新打包镜像. 1. ...

  10. js全局属性 全局变量

    1.全局属性 Infinity NaN undefined 2.全局函数 encodeURI encodeURIComponent decodeURIComponent escape unescape ...