如何在WinFORM 的DataGrid控件底部加上一个合计行? http://www.csdn.net/Develop/article/20/20221.shtm 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在把DataSet指定为DataGrid的DataSource之前,建立一个新的数据行(DataRow),计算每列的合计值填到新行的相应列中。然后DataSet.DataTables[0].Rows.Add(新行),最后绑定到DataGrid的DataSource. you need to insert DataRow into your DataSet and fill in data like int totals = (int) ds.Tables[0].Compute("SUM(Price)", "Product='Shoes'"); 不会被上下滚动的?是說始終顯示出來,可以被用戶看到,而不需要拉滾動條嗎?呵呵,有什么意義呢?合計肯定是對當前所有datagrid里面行的統計了。 http://dazhou.xicp.net/datagrid.jpg看看我要的效果图吧 使用 Sql 语句实现应该 是 可以的 吧也就是 结果集 中 包含 此和 用两个控件来合并就可以实现了!上面一个表格用于数据更新及修改用!要设成左|上|右三边有框的表格!下面一个表格用于合计用!设成左|下|右三边有框的表格!把它的滚动条盖住上面一个表格的滚动条,作为列的滚动条!最后在滚动条\更改列宽的几个相关事件中,用循怀或TIME控件来让上下两个表格的每个列都一样宽!这样就可以了!这种方法应该是比较笨的一种方法,不过我几个程序里都是用这种方法来实现的!*^_^* qifanghcy(QiFang) :能不能给我一些代码啊? DevExpress的XtraGrid控件可以实现 方枪枪的答案:----------------------------------------http://expert.csdn.net/Expert/topic/1694/1694828.xml?temp=.6631281-----------------------------------自己做一个user control,里面放上datagrid,两个scrollbar,一个label(存放合计),然后自己处理的。呵呵,但是后来我没有采用这种方式,因为对于我的程序,改动量有些太大了!这个问题就一直搁置了。 说实话,这不是什么答案。我这种方式和qifanghcy(QiFang)楼上说的一样。使用userobject比较别扭,我也没找到什么好的办法!帮楼主up一下!!! DataGrid控件有很多不方便的地方,如果想方便一点的话,只有自己写一个控件了 这是一点思路:public DataGridEx(){ this.Paint += new PaintEventHandler(PaintMe); this.Scroll += new EventHandler(ScrollMe); this.DataSourceChanged += new EventHandler(DataSourceChangedMe); this.VertScrollBar.Visible = false; this.VertScrollBar.VisibleChanged += new EventHandler(VScrollBarVisibleChangedMe); this.HorizScrollBar.Visible = false; this.HorizScrollBar.VisibleChanged += new EventHandler(HScrollBarVisibleChangedMe);}public void ScrollToRow(int row){ this.GridVScrolled(this,new ScrollEventArgs(ScrollEventType.SmallIncrement, row)); }public void ScrollToColumn(int col){ int oldcol = this.FirstVisibleColumn; if(col > oldcol) { this.GridHScrolled(this,new ScrollEventArgs(ScrollEventType.SmallIncrement, col)); } else { this.GridHScrolled(this,new ScrollEventArgs(ScrollEventType.SmallDecrement, col)); }}希望对你有点用处。因为后来我在没弄,所以就放下了。 我发现DG中的控件是由一个水平滚动条,垂直滚动条以及若干DataGridColumnStyle组成的DG的VisibleRowCount和VisibleColumnCount用于表示当前可见的行列数,这两个数不知道是如何取得的??因为滚动条是不一定出现的啊!还有我重写DG控件后,自己把水平滚动条往上移,以为底部就会空出一截,结果并不是这样,而是滚动条好象浮在了DG上面一样!不知道谁有办法让DG底部空出一块面积,以便自己在上面画上一些东东! 把你绑定到datagrid.datasource的那个tatatable中加入一个datarow,把计算好的值放到row中,然后在重新绑定一次。 用DataView,设定一个排序字段,如 RecNo,Typeof(Int32), 将合计栏设置一个很大的值,你也可以用编程控制该栏是否显示,以及加入新行时如何填充值 protected System.Web.UI.WebControls.DataGrid DataGrid1; /// <summary> /// 数据来源 /// </summary> DataSet CreateDataSource() { DataTable dt = new DataTable(); DataRow dr; dt.Columns.Add(new DataColumn("名称", typeof(string))); dt.Columns.Add(new DataColumn("Value1", typeof(Int32))); dt.Columns.Add(new DataColumn("Value2", typeof(Int32))); dt.Columns.Add(new DataColumn("Value3", typeof(Int32))); dt.Columns.Add(new DataColumn("Value4", typeof(Int32))); for (int i = 0; i < 10; i++) { dr = dt.NewRow(); dr[0] = i.ToString()+"名称"; dr[1] = i; dr[2] = i+1; dr[3] = i+2; dr[4] = i+3; dt.Rows.Add(dr); } DataSet MyData=new DataSet(); MyData.Tables.Add(dt); return MyData; } private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 DataSet MyData=CreateDataSource();// DataGrid1.DataSource= MyData;// DataGrid1.DataBind(); DataTable MyTable=new DataTable(); DataColumn myColum; foreach( DataColumn NowDataColumn in MyData.Tables[0].Columns) { myColum=new DataColumn(); myColum.DataType=NowDataColumn.DataType; myColum.ColumnName=NowDataColumn.ColumnName; MyTable.Columns.Add(myColum); } myColum=new DataColumn(); myColum.DataType=System.Type.GetType("System.Int32"); myColum.ColumnName="每行合计"; MyTable.Columns.Add(myColum); DataRow AcountRow; int DataColumns=MyData.Tables[0].Columns.Count; foreach( DataRow NowRow in MyData.Tables[0].Rows) { AcountRow=MyTable.NewRow(); AcountRow.ItemArray=NowRow.ItemArray; //每行合计 GetRowAccount(AcountRow,1,5,DataColumns); MyTable.Rows.Add(AcountRow); } //生成的合计 AcountRow=MyTable.NewRow(); AcountRow[0]="竖列合计"; for(int count=1;count<MyTable.Columns.Count;count++) foreach (DataRow NowRow in MyTable.Rows) { if(!AcountRow.IsNull(count)) { if (!AcountRow.IsNull(count) ) AcountRow[count]=Convert.ToInt32(AcountRow[count])+Convert.ToInt32(NowRow[count]); } else AcountRow[count]=NowRow[count];; } MyTable.Rows.Add(AcountRow); DataGrid1.DataSource=MyTable; DataGrid1.DataBind(); } /// <summary> /// 每行合计 /// </summary> private void GetRowAccount(DataRow AcountRow,int begincol,intendcol,int accountcol) { for(int i=begincol;i<endcol;i++) { if(!AcountRow.IsNull(accountcol)) { if ( !AcountRow.IsNull(i) ) AcountRow[accountcol]=Convert.ToInt32(AcountRow[accountcol])+Convert.ToInt32(AcountRow[i]); } else AcountRow[accountcol]=AcountRow[i]; } }缺点: 把所有的数据都访问过 肯定效率不是很好还有其他的办法 如果有更好的方法 请告诉我 。 上面是向datagrid中加横向 纵向的合计 你看看 谢谢朋友们的关心! TO:qianli918(千里马)你的方法,不能满足我的要求啊!TO: liduke(天下有雪) 怎么做呢? dataGRID不是有页脚吗?可以利用它作合计行,不过填充的数据需要你写代码计算这个方法我在web窗体中试过,不知道windows窗体中可不可行,你试试吧 你说的是WEB的,WIN中的DataGrid相差很大的 组合Datagrid和其它控件,生成新的控件,底下有一块地方显示合计,感觉上不大好对齐,可能要动态调整下面的位置 最简单的方法是使用重叠方法,用Label放在DataGrid上面;好的方法你可以使用第三方控件,到http://www.componentone.com看看 windyyang(风萧萧):拦住了最后一行的时候怎么办??有个滚动问题!我在底下加了一块,并加大了垂直滚动条的最大滚动值,但有时却不能滚动动底??也就是说最后一条记录躲在我加上的控件底下,出不来了,有什么办法解决? Repeater控件怎么一行一行进行操作。 wpf中C#,为什么对一个文本,只读打开,再写打开,程序会崩溃? Socket中的TCP传输可靠程度如何?传输数据丢失的情况一般如何处理? 关于GridView的问题 请求帮忙 征集在C#难解问题(给分100)了 datagrid 中有一列是bool,怎么让check只能被选中一个(多行中) 现在做什么样的软件市场前景好! 在C#中有没有类似VBScript中的Weekday函数? 请各位高手给一些打印控件的设计方法或是思想 C#创建数据库表的问题 异步模式socket编程? @是什么意思?
是說始終顯示出來,可以被用戶看到,而不需要拉滾動條嗎?
呵呵,有什么意義呢?合計肯定是對當前所有datagrid里面行的統計了。
看看我要的效果图吧
这种方法应该是比较笨的一种方法,不过我几个程序里都是用这种方法来实现的!*^_^*
----------------------------------------
http://expert.csdn.net/Expert/topic/1694/1694828.xml?temp=.6631281
-----------------------------------
自己做一个user control,里面放上datagrid,两个scrollbar,一个label(存放合计),然后自己处理的。
呵呵,但是后来我没有采用这种方式,因为对于我的程序,改动量有些太大了!这个问题就一直搁置了。
public DataGridEx()
{
this.Paint += new PaintEventHandler(PaintMe);
this.Scroll += new EventHandler(ScrollMe);
this.DataSourceChanged += new EventHandler(DataSourceChangedMe); this.VertScrollBar.Visible = false;
this.VertScrollBar.VisibleChanged += new EventHandler(VScrollBarVisibleChangedMe); this.HorizScrollBar.Visible = false;
this.HorizScrollBar.VisibleChanged += new EventHandler(HScrollBarVisibleChangedMe);
}public void ScrollToRow(int row)
{
this.GridVScrolled(this,new ScrollEventArgs(ScrollEventType.SmallIncrement, row));
}public void ScrollToColumn(int col)
{
int oldcol = this.FirstVisibleColumn;
if(col > oldcol)
{
this.GridHScrolled(this,new ScrollEventArgs(ScrollEventType.SmallIncrement, col));
}
else
{
this.GridHScrolled(this,new ScrollEventArgs(ScrollEventType.SmallDecrement, col));
}
}希望对你有点用处。因为后来我在没弄,所以就放下了。
DG的VisibleRowCount和VisibleColumnCount用于表示当前可见的行列数,这两个数不知道是如何取得的??因为滚动条是不一定出现的啊!还有我重写DG控件后,自己把水平滚动条往上移,以为底部就会空出一截,结果并不是这样,而是滚动条好象浮在了DG上面一样!不知道谁有办法让DG底部空出一块面积,以便自己在上面画上一些东东!
protected System.Web.UI.WebControls.DataGrid DataGrid1; /// <summary> /// 数据来源 /// </summary> DataSet CreateDataSource() { DataTable dt = new DataTable(); DataRow dr; dt.Columns.Add(new DataColumn("名称", typeof(string))); dt.Columns.Add(new DataColumn("Value1", typeof(Int32))); dt.Columns.Add(new DataColumn("Value2", typeof(Int32))); dt.Columns.Add(new DataColumn("Value3", typeof(Int32))); dt.Columns.Add(new DataColumn("Value4", typeof(Int32))); for (int i = 0; i < 10; i++) { dr = dt.NewRow(); dr[0] = i.ToString()+"名称"; dr[1] = i; dr[2] = i+1; dr[3] = i+2; dr[4] = i+3; dt.Rows.Add(dr); } DataSet MyData=new DataSet(); MyData.Tables.Add(dt); return MyData; } private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 DataSet MyData=CreateDataSource();// DataGrid1.DataSource= MyData;// DataGrid1.DataBind(); DataTable MyTable=new DataTable(); DataColumn myColum; foreach( DataColumn NowDataColumn in MyData.Tables[0].Columns) { myColum=new DataColumn(); myColum.DataType=NowDataColumn.DataType; myColum.ColumnName=NowDataColumn.ColumnName; MyTable.Columns.Add(myColum); } myColum=new DataColumn(); myColum.DataType=System.Type.GetType("System.Int32"); myColum.ColumnName="每行合计"; MyTable.Columns.Add(myColum); DataRow AcountRow; int DataColumns=MyData.Tables[0].Columns.Count; foreach( DataRow NowRow in MyData.Tables[0].Rows) { AcountRow=MyTable.NewRow(); AcountRow.ItemArray=NowRow.ItemArray; //每行合计 GetRowAccount(AcountRow,1,5,DataColumns); MyTable.Rows.Add(AcountRow); } //生成的合计 AcountRow=MyTable.NewRow(); AcountRow[0]="竖列合计"; for(int count=1;count<MyTable.Columns.Count;count++) foreach (DataRow NowRow in MyTable.Rows) { if(!AcountRow.IsNull(count)) { if (!AcountRow.IsNull(count) ) AcountRow[count]=
Convert.ToInt32(AcountRow[count])+Convert.ToInt32(NowRow[count]); } else AcountRow[count]=NowRow[count];; } MyTable.Rows.Add(AcountRow); DataGrid1.DataSource=MyTable; DataGrid1.DataBind(); } /// <summary> /// 每行合计 /// </summary> private void GetRowAccount(DataRow AcountRow,int begincol,int
endcol,int accountcol) { for(int i=begincol;i<endcol;i++) { if(!AcountRow.IsNull(accountcol)) { if ( !AcountRow.IsNull(i) ) AcountRow[accountcol]=
Convert.ToInt32(AcountRow[accountcol])+Convert.ToInt32(AcountRow[i]);
} else AcountRow[accountcol]=AcountRow[i]; }
}缺点: 把所有的数据都访问过 肯定效率不是很好还有其他的办法 如果有更好的方法 请告诉我 。
你看看
你的方法,不能满足我的要求啊!TO: liduke(天下有雪)
怎么做呢?
这个方法我在web窗体中试过,不知道windows窗体中可不可行,你试试吧
也就是说最后一条记录躲在我加上的控件底下,出不来了,有什么办法解决?