将GridView的数据源转换为DataTalbe

 应用场景描述:
        主要应用于将GridView的数据导出到Excel。
问题描述:
        直接获取GridView数据源时,如果分页功能(AllowPaging)为true时,则只能获取到第一个页面中的数据。
解决办法: 
       先将分页功能alAllowPaging设为false,
       然后,获取GridView数据源的数据到DataTable。DataTable最好缓存到VeiwState中,否则页面刷新后,DataTable中的数据就会清空。
       其次,将分页功能alAllowPaging设为true,
       最后,再绑定一次GridView数据源。
       这样,就可以获取到所有数据了! 

附:笔者是将转换方法单独封装到了一个公共类里了。

    public class DataTableHelper

    {

        public static string GetCellText(TableCell cell)

        {

            string text = cell.Text;

            if (!string.IsNullOrEmpty(text))

            {

                return text;

            }

            foreach (Control control in cell.Controls)

            {

                if (control != null && control is IButtonControl)

                {

                    IButtonControl btn = control as IButtonControl;

                    text = btn.Text.Replace("\r\n", "").Trim();

                    break;

                }

                if (control != null && control is ITextControl)

                {

                    LiteralControl lc = control as LiteralControl;

                    if (lc != null)

                    {

                        continue;

                    }

                    ITextControl l = control as ITextControl;

 

                    text = l.Text.Replace("\r\n", "").Trim();

                    break;

                }

            }

            return text;

        }

        <summary>

        /// 从GridView的数据生成DataTable

        /// </summary>

        /// <param name="gv">GridView对象</param>

        public static DataTable GridView2DataTable(GridView gv)

        {

            DataTable table = new DataTable();

            int rowIndex = 0;

            List<string> cols = new List<string>();

            if (!gv.ShowHeader && gv.Columns.Count == 0)

            {

                return table;

            }

            GridViewRow headerRow = gv.HeaderRow;

            int columnCount = headerRow.Cells.Count;

            for (int i = 0; i < columnCount; i++)

            {

                string text = GetCellText(headerRow.Cells[i]);

                cols.Add(text);

            }

            foreach (GridViewRow r in gv.Rows)

            {

                if (r.RowType == DataControlRowType.DataRow)

                {

                    DataRow row = table.NewRow();

                    int j = 0;

                    for (int i = 0; i < columnCount; i++)

                    {

                        string text = GetCellText(r.Cells[i]);

                        if (!String.IsNullOrEmpty(text))

                        {

                            if (rowIndex == 0)

                            {

                                string columnName = cols[i];

                                if (String.IsNullOrEmpty(columnName))

                                {

                                    continue;

                                }

                                if (table.Columns.Contains(columnName))

                                {

                                    continue;

                                }

                                DataColumn dc = table.Columns.Add();

                                dc.ColumnName = columnName;

                                dc.DataType = typeof(string);

                            }

                            row[j] = text;

                            j++;

                        }

                    }

                    rowIndex++;

                    table.Rows.Add(row);

                }

            }

            return table;

        }

 }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值