当前位置:编程学习 > C#/ASP.NET >>

如何实现gridview数据复制到新的datatable?(在线等)

各位大虾,小弟初学.NET 2.0 C#,发现gridview这个控件挺好用,但这两天给datatable给难住了:
我想实现把gridview的显示数据进行分组计算(注意我的分组指的是同一字段不同类型值的分组),那么我参照网上的一个貌似唯一简单的实例进行设计,但是不懂如何创建datatable,又搜了一个帖,还不行,现贴出来,请大家斧正:
两个帖之间我用
DataTable dt = new DataTable();
dt= DataTable GridView1DataTable(GridView1); // GridView1是对象名;
等相似语句进行衔接,都不行,请大家指正或者给个更好的建议。

1、设计datatable的帖(目的为gridview服务):
 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Web.UI.WebControls;
 using System.Data;
 using System.Web.UI;
  namespace test
  {
     public class GridViewHelper
      {
         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 GridViewToDataTable(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、统计分组的帖:
decimal sum = 0;//求小计的和
            decimal sum2 = 0;//求总和
            for (int i = 0; i < dt.Rows.Count-1; i++)//循环判断是否为一个分类,是则插入小计行
            {
                if ((dt.Rows[i][1].ToString() != dt.Rows[i+1][1].ToString()) ||(dt.Rows.Count-

2==i))

                {
                  if (dt.Rows.Count - 2 == i) 
                  { sum += Convert.ToDecimal(dt.Rows[i][4]); i++; }//为最后一个分类的小计行判断
                  ShowMsg.Text = dt.Rows[i][1].ToString() + " pp " + i + " pp " + dt.Rows.Count;
                  ShowMsg.Style["color"] = "red";
                  sum += Convert.ToDecimal(dt.Rows[i][4]);
                    DataRow dr = dt.NewRow();

                    dr["部门"] = dt.Rows[i][1].ToString();

                    dr["卡号"] = "小计";

                    dr["发放金额"] = sum;

                    sum2 += sum;

                    dt.Rows.InsertAt(dr, i+1);

                    i++;

                    sum = 0;
                }
                else {
                    sum += Convert.ToDecimal(dt.Rows[i][4]);
                }

            }
//为总计插入。
            DataRow dr2 = dt.NewRow();

            dr2["部门"] = "所有部门";

            dr2["卡号"] = "总计";

            dr2["发放金额"] = sum2;

            dt.Rows.Add(dr2); --------------------编程问答-------------------- @haiinnet
你的思路错了,我没有看你的代码。
如何实现gridview数据复制到新的datatable?
上面这是你的问题,
首先GridView是控件,而DataTable是一个映射到内存的临时存储表
再次,GridView没有数据,他需要绑定数据,即DataSouce = dt这样的绑定方式。
你把Gridview的数据复制到新的DataTable中
你的意思应该是,绑定到Gridview的DataTable1,复制到新的DataTable2中。
意义不大
所以你再看下你的需求和代码。 --------------------编程问答-------------------- 如果你有了datatable又何必复制呢!~。。 --------------------编程问答-------------------- 发现gridview这个控件挺好用

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

可是现实中没有哪个公司用这个控件唉。。。还有那个datatable。

你学了半天 是不是白学了?

--------------------编程问答-------------------- 恩  一楼说的好 --------------------编程问答--------------------
引用 1 楼 ruanwei1987 的回复:
@haiinnet
你的思路错了,我没有看你的代码。
如何实现gridview数据复制到新的datatable?
上面这是你的问题,
首先GridView是控件,而DataTable是一个映射到内存的临时存储表
再次,GridView没有数据,他需要绑定数据,即DataSouce = dt这样的绑定方式。
你把Gridview的数据复制到新的DataTable中
你的意思应该是,绑定……


++
好好看看需求吧... ...

--------------------编程问答-------------------- 我觉得楼主是这个意思,数据绑定到控件后,控件可以做一些处理,比如排序,但是这只是控件上面显示的效果,其数据源没有改变。现在楼主想把显示的这种形式固定为数据源,重新放在datatable中,是不是? --------------------编程问答-------------------- 刚刚断网了,没及时和大家交流啊,后悔。。。
首先,我是想用gridview做下小型的内部系统,不需要去公司,呵呵
其次,我的思路可能会搞错,但楼上没有给我一个合理的架构,恳请提供代码?
我的要求是想把gridview里同一字段(比如叫课程类别)里面出现过的一个值(比如是“编程课”)进行统计用户填写的数目,系统是用来统计课时的,我想通过用gridview实现,或者说用sql语句实现,那样是不是比较麻烦,因为我用的是access数据库?那位大虾给个最理想方案哦。。。 --------------------编程问答-------------------- 不需要。sql 中group分组统计count
也可repeater嵌套统计数据 --------------------编程问答-------------------- repeater

顶 --------------------编程问答-------------------- asp.net只有到3.5才出了一个适合分组的grid控件。

http://www.google.com.hk/search?hl=zh-CN&safe=strict&q=listview+%E5%88%86%E7%BB%84&aq=f&aqi=&aql=&oq= --------------------编程问答-------------------- 嗯,上面链接太宽泛了:http://www.google.com.hk/search?hl=zh-CN&safe=strict&q=asp.net+listview+%E5%88%86%E7%BB%84&aq=f&aqi=&aql=&oq=

asp.net的listview可以自定义分组模板。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,