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(); } } }