DataGridView 常用操作

public static class DataGridView
        {
            /// <summary>
            /// 用于给DataGridView中的行添加一个首列被冻结的为排序的列,排序列自动生成。
            /// 如果存在其他列可以排序,还需要在Sorted事件中调用,重新绘制序号
            /// </summary>
            /// <param name="dgv">要添加排序列的GataGridView对象</param>
            public static void SetRowIndex(WinControl.DataGridView dgv, DataTable dTable)
            {
                dgv.AutoGenerateColumns = false;
                dgv.DataSource = dTable;
                if (dgv != null)
                {
                    dgv.AllowUserToAddRows = false;
                    DataTable dt = (DataTable)dgv.DataSource;
                    if (dt != null && !dt.Columns.Contains("RowIndex"))
                    {
                        dt.Columns.Add("RowIndex", typeof(string));
                    }
                    DataGridViewColumn dgvColumn = null;
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].DataPropertyName == "RowIndex")
                        {
                            if (dgv.Columns[i].Name != "RowIndex")
                            {
                                dgv.Columns[i].Name = "RowIndex";
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    if (!dgv.Columns.Contains("RowIndex"))
                    {
                        dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell());
                        dgv.Columns.Add(dgvColumn);
                    }
                    else
                    {
                        dgvColumn = dgv.Columns["RowIndex"];
                    }
                    //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读;
                    dgvColumn.DisplayIndex = 0;
                    //冻结,列相对静止
                    dgvColumn.Frozen = true;
                    //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同
                    dgvColumn.Name = "RowIndex";
                    dgvColumn.HeaderText = "序号";
                    //绑定到数据源:不绑定可不行
                    if (!dgvColumn.IsDataBound)
                    {
                        dgvColumn.DataPropertyName = "RowIndex";
                    }
                    //样式
                    dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                    dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                    dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable;
                    dgvColumn.ReadOnly = true;
                    dgvColumn.Visible = true;
                    //后加
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName)
                        {
                            dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName;
                        }
                    }
                    //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。
                    //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable)
                        {
                            dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }
                    }
                    if (dt != null)
                    {
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            if (dt.Rows[i]["RowIndex"] != DBNull.Value && dt.Rows[i]["RowIndex"].ToString() == "合计")
                            {
                                dt.Rows.RemoveAt(i);
                                dt.AcceptChanges();
                                //break;
                            }
                        }
                    }
                    //dgv.DataSource = dt;
                    //dt.AcceptChanges();

                    if (dgv.Rows.Count > 0)
                    {
                        for (int i = 0; i < dgv.Rows.Count; i++)
                        {
                            //获取行的索引号赋值给序号
                            //行索引号是由行的位置确定的
                            dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1;
                        }
                    }
                    else if (dt != null && dt.Rows.Count > 0)
                    {
                        object[] obj = null;
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            obj = dt.Rows[i].ItemArray;
                            obj.SetValue((i + 1).ToString(), dt.Columns.IndexOf("RowIndex"));
                            dt.Rows[i].ItemArray = obj;
                        }
                    }
                    if (dt != null)
                    {
                        dt.AcceptChanges();
                        dgv.DataSource = dt;
                    }
                }
            }
            /// <summary>
            /// 用于给DataGridView中的行添加一个首列被冻结的为排序的列,排序列自动生成。
            /// 如果存在其他列可以排序,还需要在Sorted事件中调用,重新绘制序号
            /// </summary>
            /// <param name="dgv">要添加排序列的GataGridView对象</param>
            public static void SetRowIndex2(WinControl.DataGridView dgv, DataTable dTable)
            {
                dgv.AutoGenerateColumns = false;
                dgv.DataSource = dTable;
                if (dgv != null)
                {
                    dgv.AllowUserToAddRows = false;
                    DataTable dt = (DataTable)dgv.DataSource;
                    if (dt != null && !dt.Columns.Contains("RowIndex"))
                    {
                        dt.Columns.Add("RowIndex", typeof(string));
                    }
                    DataGridViewColumn dgvColumn = null;
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].DataPropertyName == "RowIndex")
                        {
                            if (dgv.Columns[i].Name != "RowIndex")
                            {
                                dgv.Columns[i].Name = "RowIndex";
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    if (!dgv.Columns.Contains("RowIndex"))
                    {
                        dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell());
                        dgv.Columns.Add(dgvColumn);
                    }
                    else
                    {
                        dgvColumn = dgv.Columns["RowIndex"];
                    }
                    //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读;
                    dgvColumn.DisplayIndex = 0;
                    //冻结,列相对静止
                    dgvColumn.Frozen = true;
                    //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同
                    dgvColumn.Name = "RowIndex";
                    dgvColumn.HeaderText = "序号";
                    //绑定到数据源:不绑定可不行
                    if (!dgvColumn.IsDataBound)
                    {
                        dgvColumn.DataPropertyName = "RowIndex";
                    }
                    //样式
                    dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                    dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                    dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable;
                    dgvColumn.ReadOnly = true;
                    dgvColumn.Visible = true;
                    //后加
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName)
                        {
                            dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName;
                        }
                    }
                    //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。
                    //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。
                    //for (int i = 0; i < dgv.Columns.Count; i++)
                    //{
                    //    if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable)
                    //    {
                    //        dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                    //    }
                    //}
                    if (dt != null)
                    {
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            if (dt.Rows[i]["RowIndex"] != DBNull.Value && dt.Rows[i]["RowIndex"].ToString() == "合计")
                            {
                                dt.Rows.RemoveAt(i);
                                dt.AcceptChanges();
                                //break;
                            }
                        }
                    }
                    //dgv.DataSource = dt;
                    //dt.AcceptChanges();

                    if (dgv.Rows.Count > 0)
                    {
                        for (int i = 0; i < dgv.Rows.Count; i++)
                        {
                            //获取行的索引号赋值给序号
                            //行索引号是由行的位置确定的
                            dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1;
                        }
                    }
                    else if (dt != null && dt.Rows.Count > 0)
                    {
                        object[] obj = null;
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            obj = dt.Rows[i].ItemArray;
                            obj.SetValue((i + 1).ToString(), dt.Columns.IndexOf("RowIndex"));
                            dt.Rows[i].ItemArray = obj;
                        }
                    }
                    if (dt != null)
                    {
                        dt.AcceptChanges();
                        dgv.DataSource = dt;
                    }
                }
            }
            /// <summary>
            /// 去除订单中多条货物时的重复信息
            /// 使用顺序
            /// SetRowIndex();
            /// BindGridView();
            /// SetLastRow();
            /// </summary>
            /// <param name="dtable"></param>
            /// <param name="accordingName">清除重复记录的依据列,查询结果必须以其排序</param>
            /// <param name="dgvColunsNames">要去掉的重复行的列名称,必须包含名为"RowIndex"的项,该项是索引项,用于重设索引。</param>
            public static void BindGridView(WinControl.DataGridView dgv, string accordingName, params string[] dgvColunsNames)
            {
                //DataTable _dt = dtable.Clone();
                //DataTable _dt = dtable.Copy();
                if (dgv == null || dgv.Rows.Count == 0)
                {
                    return;
                }
                DataTable _dt = ((DataTable)dgv.DataSource).Copy();

                dgv.DataSource = _dt;
                //if (_dt != null)
                //{
                //    for (int i = 0; i < _dt.Rows.Count; i++)
                //    {
                //        if (_dt.Rows[i]["RowIndex"] != DBNull.Value && _dt.Rows[i]["RowIndex"].ToString() == "合计")
                //        {
                //            _dt.Rows.RemoveAt(i);
                //            //dt.Rows.
                //            _dt.AcceptChanges();
                //            break;
                //        }
                //    }
                //}
                if (dgv.Rows.Count > 0)
                {
                    //去除订单中多条货物时的重复信息

                    string[] ColName = dgvColunsNames;
                    string[] KeyColName ={ accordingName };
                    long RowNum = 1;

                    //装入第一行
                    DataGridViewRow tmpRow = dgv.Rows[0];
                    Boolean SameFlag = true;

                    //逐行检查
                    for (int i = 1; i < dgv.Rows.Count; i++)
                    {
                        //KEY列一致的,则去掉重复信息,默认为一致
                        SameFlag = true;
                        for (int j = 0; j < KeyColName.Length; j++)
                        {
                            if (dgv.Rows[i].Cells[KeyColName[j]].Value.ToString() != tmpRow.Cells[KeyColName[j]].Value.ToString())
                            {
                                SameFlag = false;
                                break;
                            }
                        }

                        if (SameFlag)
                        {
                            //如果一致,去掉重复信息
                            for (int j = 0; j < ColName.Length; j++)
                            {
                                if (ColName[j] != "")
                                {
                                    dgv.Rows[i].Cells[ColName[j]].Value = DBNull.Value;
                                }
                            }
                        }
                        else
                        {
                            //如果不一致重新保存比较行
                            RowNum = RowNum + 1;
                            tmpRow = dgv.Rows[i];
                            tmpRow.Cells["RowIndex"].Value = RowNum;
                        }
                    }
                }
            }
            /// <summary>
            /// 生成DataGridView汇总行,不适用于允许列排序
            /// 必须搭配SetRowIndex()方法使用
            /// </summary>
            /// <param name="dgv"></param>
            /// <param name="dgvColunsNames"></param>
            public static void SetLastRow(WinControl.DataGridView dgv, params string[] dgvColunsNames)
            {
                //不允许添加新行
                if (dgv.AllowUserToAddRows == true)
                {
                    dgv.AllowUserToAddRows = false;
                }
                if (dgv != null && dgv.Rows.Count > 0)
                {
                    //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。
                    //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable)
                        {
                            dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }
                    }
                    DataTable dt = (DataTable)dgv.DataSource;
                    //dgv.DataSource = dt;
                    DataRow dr = dt.NewRow();
                    try
                    {
                        foreach (string var in dgvColunsNames)
                        {
                            double obj = 0.0D;
                            for (int i = 0; i < dgv.Rows.Count; i++)
                            {
                                obj += double.Parse(dgv.Rows[i].Cells[var].Value == DBNull.Value ? "0" : (dgv.Rows[i].Cells[var].Value.ToString().Trim() == "" ? "0" : dgv.Rows[i].Cells[var].Value.ToString().Trim()));
                            }
                            //if (var.Substring(var.Length - 1, 1) == "1")
                            //{
                            //    dr[var.Substring(0, var.Length - 1)] = obj.ToString();
                            //}
                            //else
                            //{
                            dr[var] = obj.ToString();
                            //}

                        }
                    }
                    catch (Exception ex)
                    {
                        sMessageBox.Show(ex.Message);
                    }
                    dr["RowIndex"] = "合计";
                    dt.Rows.Add(dr);
                    //dgv.Rows.in
                    dt.AcceptChanges();
                }
            }
            /// <summary>
            /// 设置DataGridView的绑定数据字段名(DataPropertyName)赋值给列名(Name)
            /// </summary>
            /// <param name="dgv"></param>
            public static void SetColumnsNameEqulsDataPropertyName(params WinControl.DataGridView[] dgv)
            {
                foreach (WinControl.DataGridView d in dgv)
                {
                    //d.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                    d.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.NotSet;
                    for (int i = 0; i < d.Columns.Count; i++)
                    {
                        if (d.Columns[i].Name != d.Columns[i].DataPropertyName)
                        {
                            d.Columns[i].Name = d.Columns[i].DataPropertyName;
                            d.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                            if (d.Columns[i].HeaderText.ToString() == "序号")
                            {
                                d.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                            }
                        }
                        //d.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                    }
                }
            }
            public static void SetRowIndexAndLastRow(System.Windows.Forms.DataGridView dgv, ref DataTable dTable, params string[] dgvColumnsNames)
            {
                dgv.AutoGenerateColumns = false;
                //dgv.DataSource = dTable;
                if (dgv != null)
                {
                    dgv.AllowUserToAddRows = false;
                    //DataTable dt = (DataTable)dgv.DataSource;
                    if (dTable != null && !dTable.Columns.Contains("RowIndex"))
                    {
                        dTable.Columns.Add("RowIndex", typeof(string));
                    }
                    dgv.DataSource = dTable;
                    DataGridViewColumn dgvColumn = null;
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].DataPropertyName == "RowIndex")
                        {
                            if (dgv.Columns[i].Name != "RowIndex")
                            {
                                dgv.Columns[i].Name = "RowIndex";
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    if (!dgv.Columns.Contains("RowIndex"))
                    {
                        dgvColumn = new DataGridViewColumn(new DataGridViewTextBoxCell());
                        dgv.Columns.Add(dgvColumn);
                    }
                    else
                    {
                        dgvColumn = dgv.Columns["RowIndex"];
                    }
                    //外观上显示的顺序为第一列//dgvColumn.Index 为真实序列号,只读;
                    dgvColumn.DisplayIndex = 0;
                    //冻结,列相对静止
                    dgvColumn.Frozen = true;
                    //dgvColumn.HeaderCell.Value = "序号";//效果似乎同Name属性相同
                    dgvColumn.Name = "RowIndex";
                    dgvColumn.HeaderText = "序号";
                    //绑定到数据源:不绑定可不行
                    if (!dgvColumn.IsDataBound)
                    {
                        dgvColumn.DataPropertyName = "RowIndex";
                    }
                    //样式
                    dgvColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                    dgvColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                    dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable;
                    dgvColumn.ReadOnly = true;
                    dgvColumn.Visible = true;
                    //后加
                    for (int i = 0; i < dgv.Columns.Count; i++)
                    {
                        if (dgv.Columns[i].Name != dgv.Columns[i].DataPropertyName)
                        {
                            dgv.Columns[i].Name = dgv.Columns[i].DataPropertyName;
                        }
                        //不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。
                        //允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。
                        if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable)
                        {
                            dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }
                    }



                    if (dTable != null)
                    {
                        for (int i = 0; i < dTable.Rows.Count; i++)
                        {
                            if (dTable.Rows[i]["RowIndex"] != DBNull.Value && dTable.Rows[i]["RowIndex"].ToString() == "合计")
                            {
                                dTable.Rows.RemoveAt(i);
                                dTable.AcceptChanges();
                                //break;
                            }
                        }
                    }
                    //    //dgv.DataSource = dt;
                    //    //dt.AcceptChanges();

                    if (dgv.Rows.Count > 0)
                    {
                        for (int i = 0; i < dgv.Rows.Count; i++)
                        {
                            //获取行的索引号赋值给序号
                            //行索引号是由行的位置确定的
                            dgv.Rows[i].Cells["RowIndex"].Value = dgv.Rows[i].Index + 1;
                        }
                    }
                    else if (dTable != null && dTable.Rows.Count > 0)
                    {
                        object[] obj = null;
                        for (int i = 0; i < dTable.Rows.Count; i++)
                        {
                            obj = dTable.Rows[i].ItemArray;
                            obj.SetValue((i + 1).ToString(), dTable.Columns.IndexOf("RowIndex"));
                            dTable.Rows[i].ItemArray = obj;
                        }
                    }
                    if (dTable != null)
                    {
                        dTable.AcceptChanges();
                        //dgv.DataSource = dt;
                    }
                }
                ////不允许添加新行
                //if (dgv.AllowUserToAddRows == true)
                //{
                //    dgv.AllowUserToAddRows = false;
                //}
                if (dgv != null && dgv.Rows.Count > 0)
                {
                    ////不允许列排序,允许排序且没有汇总时,需要在排序事件中再调用一次该方法。
                    ////允许排序且允许汇总时,汇总行将不一定在最后一行。这是一个有待遇解决的问题。
                    //for (int i = 0; i < dgv.Columns.Count; i++)
                    //{
                    //    if (dgv.Columns[i].SortMode != DataGridViewColumnSortMode.NotSortable)
                    //    {
                    //        dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                    //    }
                    //}
                    //DataTable dt = (DataTable)dgv.DataSource;
                    //dgv.DataSource = dt;
                    if (dgvColumnsNames.Length > 0)
                    {


                        DataRow dr = dTable.NewRow();
                        try
                        {
                            foreach (string var in dgvColumnsNames)
                            {
                                double obj = 0.0D;
                                for (int i = 0; i < dgv.Rows.Count; i++)
                                {
                                    obj += double.Parse(dgv.Rows[i].Cells[var].Value == DBNull.Value ? "0" : dgv.Rows[i].Cells[var].Value.ToString().Trim());
                                }
                                if (var.Substring(var.Length - 1, 1) == "1")
                                {
                                    dr[var.Substring(0, var.Length - 1)] = obj.ToString();
                                }
                                else
                                {
                                    dr[var] = obj.ToString();
                                }

                            }
                        }
                        catch (Exception ex)
                        {
                            sMessageBox.Show(ex.Message);
                        }
                        dr["RowIndex"] = "合计";
                        dTable.Rows.Add(dr);
                    }
                    //dgv.Rows.in
                    dTable.AcceptChanges();
                }
            }
        }
原文地址:https://www.cnblogs.com/goto/p/2443366.html