DataGridView自动添加合计行

本文介绍了一个用于在DataGridView中自动添加合计行的C#类。该类可以为DataGridView控件设置数据源,并在数据更改时自动更新合计行。此外,还实现了排序功能,确保合计行始终显示在表格底部。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://tech.it168.com/msoft/2008-06-12/200806120637662.shtml

using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Windows.Forms; 5using System.Data; 6using System.Drawing; 7using System.ComponentModel; 8 9namespace OtherTools 10{ 11    class DataGridViewAddSumRow 12    { 13        private DataGridView dgv = null; 14        private DataTable dt = null; 15        public DataGridViewAddSumRow() 16        { 17        } 18        /**//// <summary> 19        /// 设置表格的数据源 20        /// </summary> 21        public DataTable dataTableName 22        { 23            set 24            { 25                this.dt = value; 26            } 27        } 28        /**//// <summary> 29        ///传递表格的名称 30        /// </summary> 31        public DataGridView DgvName 32        { 33            set 34            { 35                dgv = value; 36            } 37        } 38        /**//// <summary> 39        /// 开始添加合计行 40        /// </summary> 41        public void begin() 42        { 43            initDgv(); 44        } 45        private void initDgv() 46        { 47            if (dgv != null) 48            { 49 50                this.dgv.DataSourceChanged += new EventHandler(dataGridView_DataSourceChanged); 51                this.dgv.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick); 52                this.dgv.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged); 53                this.dgv.AllowUserToAddRows = false; 54                dgv.DataSource = dt; 55            } 56        } 57        /**//// <summary> 58        /// 计算合计算 59        /// </summary> 60        /// <param name="dgv">要计算的DataGridView</param>

private void SumDataGridView(DataGridView dgv) 62        { 63            if (dgv.DataSource == null) return; 64            //DataTable dt = (DataTable)dgv.DataSource; 65            if (dt.Rows.Count < 1) return; 66            decimal[] tal = new decimal[dt.Columns.Count]; 67 68            DataRow ndr = dt.NewRow(); 69 70            string talc = ""; 71 72            int number = 1; 73            foreach (DataRow dr in dt.Rows) 74            { 75                dr["@xu.Hao"] = number++; 76                int n = 0; 77                foreach (DataColumn dc in dt.Columns) 78                { 79 80 81                    if (talc == "" && dc.DataType.Name.ToUpper().IndexOf("STRING") >= 0) 82                    { talc = dc.ColumnName; } 83 84 85                    if (dc.DataType.IsValueType) 86                    { 87                        string hej = dr[dc.ColumnName].ToString(); 88                        try 89                        { 90                            if (hej != string.Empty) tal[n] += decimal.Parse(hej); 91                        } 92                        catch (Exception) { } 93                        //if (hej != string.Empty) tal[n] += decimal.Parse(hej); 94                    } 95 96 97                    n++; 98                } 99            } 100 101            ndr.BeginEdit(); 102            for (int i = 0; i < dt.Columns.Count; i++) 103            { 104                if (tal[i] != 0) 105                    ndr[i] = tal[i]; 106            } 107            ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString(); 108            if (talc != "") ndr[talc] = "合计"; 109            ndr.EndEdit(); 110            dt.Rows.Add(ndr); 111 112            dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 222, 210); 113            dgv.Rows[dgv.Rows.Count - 1].ReadOnly = true; 114 115            if (dgv.Tag == null) 116            { 117                foreach (DataGridViewColumn dgvc in dgv.Columns) 118                { 119                    dgvc.SortMode = DataGridViewColumnSortMode.Programmatic; 120                } 121            } 122            dgv.Tag = ndr; 123        } 124        private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 125        { 126            DataGridView sortDgv = (DataGridView)sender; 127            int fx = 0; 128            if (sortDgv.AccessibleDescription == null) 129            { 130                fx = 1; 131            } 132            else 133            { 134                fx = int.Parse(sortDgv.AccessibleDescription); 135                fx = (fx == 0 ? 1 : 0); 136            } 137            sortDgv.AccessibleDescription = fx.ToString(); 138            if (sortDgv.Columns[e.ColumnIndex].Name == "@xu.Hao") return; 139            DataGridViewColumn nCol = sortDgv.Columns[e.ColumnIndex]; 140 141            if (nCol.DataPropertyName == string.Empty) return; 142 143            if (nCol != null) 144            { 145                sortDgv.Sort(nCol, fx == 0 ? ListSortDirection.Ascending : ListSortDirection.Descending); 146 147            } 148            //-- 149            DataRow dr = (DataRow)sortDgv.Tag; 150            DataTable dt = (DataTable)sortDgv.DataSource; 151            DataRow ndr = dt.NewRow(); 152            ndr.BeginEdit(); 153            for (int i = 0; i < dt.Columns.Count; i++) 154            { 155                ndr[i] = dr[i]; 156            } 157            dt.Rows.Remove(dr); 158 159 160            //if (e.ColumnIndex != 0) 161            { 162                int n = 1; 163                for (int i = 0; i < sortDgv.Rows.Count; i++) 164                { 165                    DataGridViewRow dgRow = sortDgv.Rows[i]; 166                    DataRowView drv = (DataRowView)dgRow.DataBoundItem; 167                    DataRow tdr = drv.Row; 168                    tdr.BeginEdit(); 169                    tdr["@xu.Hao"] = n; 170                    n++; 171                    tdr.EndEdit(); 172 173                } 174                sortDgv.Refresh(); 175                sortDgv.RefreshEdit(); 176 177            } 178            ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString(); 179            ndr.EndEdit(); 180            dt.Rows.Add(ndr); 181            sortDgv.Tag = ndr; 182 183            //-- 184            sortDgv.Sort(sortDgv.Columns["@xu.Hao"], ListSortDirection.Ascending); 185            sortDgv.Columns["@xu.Hao"].HeaderCell.SortGlyphDirection = SortOrder.None; 186            nCol.HeaderCell.SortGlyphDirection = fx == 0 ? SortOrder.Ascending : SortOrder.Descending; 187            sortDgv.Rows[sortDgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210); 188 189        }

190        private void dataGridView_DataSourceChanged(object sender, EventArgs e) 191        { 192            DataGridView dgv = (DataGridView)sender; 193            //DataTable dt = (DataTable)dgv.DataSource; 194            if (dt == null) return; 195            decimal[] tal = new decimal[dt.Columns.Count]; 196            if (dt.Columns.IndexOf("@xu.Hao") < 0) 197            { 198                DataColumn dc = new DataColumn("@xu.Hao", System.Type.GetType("System.Int32")); 199                dt.Columns.Add(dc); 200                dgv.Columns["@xu.Hao"].DisplayIndex = 0; 201                dgv.Columns["@xu.Hao"].HeaderText = "序号"; 202 203                dgv.Columns["@xu.Hao"].SortMode = DataGridViewColumnSortMode.Programmatic; 204                dgv.AutoResizeColumn(dgv.Columns["@xu.Hao"].Index); 205 206                dgv.Columns["@xu.Hao"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 207                dgv.Columns["@xu.Hao"].Visible = true; 208            } 209            SumDataGridView(dgv); 210        } 211        private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 212        { 213 214            DataGridView dgv = (DataGridView)sender; 215            if (dgv.Tag == null || e.RowIndex < 0 || e.RowIndex == dgv.Rows.Count - 1) return; 216 217            string col = dgv.Columns[e.ColumnIndex].DataPropertyName; 218            if (col == string.Empty) return; 219            if (((DataRowView)dgv.Rows[e.RowIndex].DataBoundItem).Row.Table.Columns[col].DataType.IsValueType) 220            { 221                decimal tal = 0; 222                foreach (DataGridViewRow dgvr in dgv.Rows) 223                { 224                    if (dgvr.Index != dgv.Rows.Count - 1) 225                    { 226                        string hej = dgvr.Cells[e.ColumnIndex].Value.ToString(); 227                        if (hej != string.Empty) tal += decimal.Parse(hej); 228                    } 229                } 230                if (tal == 0) 231                    dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = DBNull.Value; 232                else 233                    dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = tal; 234            } 235        } 236 237    } 238}

*调整导出及打印的格式与显示一致;合计,详细参见第10条修正功能,全部源码及示例。 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并与列,合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、标号的设置 bool ShowRowNumber; * 10、增加最后一的汇总,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进平均值,total列显示合计,则对ComputeColumns增加三内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值