●给DataGridView添加底部合计行的一种方法

    技术2022-05-11  83

    DataGridView是使用很多的控件,可是却没有底部合计行的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:

    把下面  

     #region 添加DataGridView底行合计数 的四个方法   和  #endregion  添加DataGridView底行合计数 的四个方法之间的 代码拷贝到你的程序中

    然后再 给要计算合计的 DataGridView 对象(此处假定为dataGridView1) 绑定 下面的方法及 数据表  则可:

    这里假设通过点击 按钮 之后 绑定

    private void button1_Click(object sender, EventArgs e)  {

         dataGridView1.DataSourceChanged += new EventHandler(dataGridView_DataSourceChanged);   dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick);   dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);   dataGridView1.AllowUserToAddRows = false;   dataGridView1.DataSource = 这里是要绑定的数据表;

      }

     

    #region 添加DataGridView底行合计数 的四个方法  /// <summary>  /// 计算合计算  /// </summary>  /// <param name="dgv">要计算的DataGridView</param>  private void SumDataGridView(DataGridView dgv)  {

       #region 计算合计数   //DataGridView dgv = (DataGridView)sender;   if (dgv.DataSource == null) return;   DataTable dt = (DataTable)dgv.DataSource;   if (dt.Rows.Count < 1) return;   decimal[] tal = new decimal[dt.Columns.Count];

       DataRow ndr = dt.NewRow();

       string talc = "";

       int number = 1;   foreach (DataRow dr in dt.Rows)   {    dr["@xu.Hao"] = number++;    int n = 0;    foreach (DataColumn dc in dt.Columns)    {

         if (talc == "" && dc.DataType.Name.ToUpper().IndexOf("STRING") >= 0) talc = dc.ColumnName;

         if (dc.DataType.IsValueType)     {      string hej = dr[dc.ColumnName].ToString();      try      {       if (hej != string.Empty) tal[n] += decimal.Parse(hej);      }      catch (Exception) { }      //if (hej != string.Empty) tal[n] += decimal.Parse(hej);     }

         n++;    }   }

       ndr.BeginEdit();   for (int i = 0; i < dt.Columns.Count; i++)   {    if (tal[i] != 0)     ndr[i] = tal[i];   }   ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString();   if (talc != "") ndr[talc] = "[合计]";   ndr.EndEdit();   dt.Rows.Add(ndr);

       dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210);

       if (dgv.Tag == null)   {    foreach (DataGridViewColumn dgvc in dgv.Columns)    {     dgvc.SortMode = DataGridViewColumnSortMode.Programmatic;    }   }

       dgv.Tag = ndr;

       #endregion

      }  private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)  {//   //直接拷贝代码

       DataGridView sortDgv = (DataGridView)sender;   int fx = 0;   if (sortDgv.AccessibleDescription == null)   {    fx = 1;   }   else   {    fx = int.Parse(sortDgv.AccessibleDescription);    fx = (fx == 0 ? 1 : 0);   }   sortDgv.AccessibleDescription = fx.ToString();   if (sortDgv.Columns[e.ColumnIndex].Name == "@xu.Hao") return;   DataGridViewColumn nCol = sortDgv.Columns[e.ColumnIndex];

       if (nCol.DataPropertyName == string.Empty) return;

       if (nCol != null)   {    sortDgv.Sort(nCol, fx == 0 ? ListSortDirection.Ascending : ListSortDirection.Descending);

       }   //--   DataRow dr = (DataRow)sortDgv.Tag;   DataTable dt = (DataTable)sortDgv.DataSource;   DataRow ndr = dt.NewRow();   ndr.BeginEdit();   for (int i = 0; i < dt.Columns.Count; i++)   {    ndr[i] = dr[i];   }   dt.Rows.Remove(dr);

       //if (e.ColumnIndex != 0)   {    int n = 1;    for (int i = 0; i < sortDgv.Rows.Count; i++)    {     DataGridViewRow dgRow = sortDgv.Rows[i];     DataRowView drv = (DataRowView)dgRow.DataBoundItem;     DataRow tdr = drv.Row;     tdr.BeginEdit();     tdr["@xu.Hao"] = n;     n++;     tdr.EndEdit();

        }    sortDgv.Refresh();    sortDgv.RefreshEdit();

       }   ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString();   ndr.EndEdit();   dt.Rows.Add(ndr);   sortDgv.Tag = ndr;

       //--   sortDgv.Sort(sortDgv.Columns["@xu.Hao"], ListSortDirection.Ascending);   sortDgv.Columns["@xu.Hao"].HeaderCell.SortGlyphDirection = SortOrder.None;   nCol.HeaderCell.SortGlyphDirection = fx == 0 ? SortOrder.Ascending : SortOrder.Descending;   sortDgv.Rows[sortDgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210);

      }  private void dataGridView_DataSourceChanged(object sender, EventArgs e)  {   DataGridView dgv = (DataGridView)sender;   DataTable dt = (DataTable)dgv.DataSource;   if (dt == null) return;   decimal[] tal = new decimal[dt.Columns.Count];   if (dt.Columns.IndexOf("@xu.Hao") < 0)   {    DataColumn dc = new DataColumn("@xu.Hao", System.Type.GetType("System.Int32"));    dt.Columns.Add(dc);    dgv.Columns["@xu.Hao"].DisplayIndex = 0;    dgv.Columns["@xu.Hao"].HeaderText = "#";

        dgv.Columns["@xu.Hao"].SortMode = DataGridViewColumnSortMode.Programmatic;    dgv.AutoResizeColumn(dgv.Columns["@xu.Hao"].Index); 

        dgv.Columns["@xu.Hao"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;   }   SumDataGridView(dgv);  }  private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)  {//   DataGridView dgv = (DataGridView)sender;   if (dgv.Tag == null || e.RowIndex < 0 || e.RowIndex == dgv.Rows.Count - 1) return;

       string col = dgv.Columns[e.ColumnIndex].DataPropertyName;   if (col == string.Empty) return;   if (((DataRowView)dgv.Rows[e.RowIndex].DataBoundItem).Row.Table.Columns[col].DataType.IsValueType)   {    decimal tal = 0;    foreach (DataGridViewRow dgvr in dgv.Rows)    {     if (dgvr.Index != dgv.Rows.Count - 1)     {      string hej = dgvr.Cells[e.ColumnIndex].Value.ToString();      if (hej != string.Empty) tal += decimal.Parse(hej);     }    }    if (tal == 0)     dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = DBNull.Value;    else     dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = tal;   }  }  #endregion  添加DataGridView底行合计数 的四个方法

     

    最新回复(0)