1using 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>

 61        private void SumDataGridView(DataGridView dgv)
 62        {
 63            if (dgv.DataSource == nullreturn;
 64            //DataTable dt = (DataTable)dgv.DataSource;
 65            if (dt.Rows.Count < 1return;
 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(255222210);
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(255255210);
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 == nullreturn;
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 - 1return;
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}

239
posted on 2008-06-11 18:36  春天花开会  阅读(7044)  评论(2编辑  收藏  举报