如何实现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。
你学了半天 是不是白学了?
--------------------编程问答-------------------- 恩 一楼说的好 --------------------编程问答--------------------
++
好好看看需求吧... ...
--------------------编程问答-------------------- 我觉得楼主是这个意思,数据绑定到控件后,控件可以做一些处理,比如排序,但是这只是控件上面显示的效果,其数据源没有改变。现在楼主想把显示的这种形式固定为数据源,重新放在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