最近,因为需要写了一个在两个DataGridView之间单元格同步选择的函数。 代码如下: public class DataGridViewEdit { #region GetDataGridViewMaxOrMinCellRowIndex 获取选中的单元格集合成员所在行的最大或最小行数 /// <summary> /// 获取选中的单元格集合成员所在行的最大或最小行数 /// </summary> /// <param name="dgvselectcellcollect">DataGridView中选中的单元格集合</param> /// <param name="max">max等于true为选择最大的行数,等于false为选择最小的行数</param> /// <returns>返回所需的行数编号</returns> public virtual int GetDataGridViewMaxOrMinCellRowIndex(DataGridViewSelectedCellCollection dgvselectcellcollect, bool max) { List<int> RowIndexs = new List<int>(); for (int i = 0; i < dgvselectcellcollect.Count; i++) { DataGridViewCell dgvCell = dgvselectcellcollect[i]; RowIndexs.Add(dgvCell.RowIndex); } int rowIndex = RowIndexs[GetMaxOrMinValue(RowIndexs, false)]; //得到最小的行数 return rowIndex; } #endregion #region SynchronizeDataViewCellChange 同步DataGridView的单元格选择 /// <summary> /// 同步DataGridView的单元格选择 /// </summary> /// <param name="dgv1"></param> /// <param name="dgv2"></param> public virtual void SynchronizeDataViewCellChange(DataGridView dgv1, DataGridView dgv2) { if (dgv1.Rows.Count == dgv2.Rows.Count) { int rowIndex = 0; int colIndex = 0; List<int> RowIndexs = new List<int>(); DataGridViewEdit dgvEd = new DataGridViewEdit(); rowIndex = dgvEd.GetDataGridViewMaxOrMinCellRowIndex(dgv1.SelectedCells, false); DataGridViewCell dgv1Cell = dgv1.SelectedCells[0]; colIndex = dgv1Cell.ColumnIndex; DataGridViewCell dgv2Cell = dgv2.Rows[rowIndex].Cells[colIndex]; dgv2.FirstDisplayedCell = dgv2Cell; // //清除dgv2的所有单元格选择 // for (int i = 0; i < dgv2.Rows.Count; i++) { DataGridViewRow dgvRow = dgv2.Rows[i]; for (int n = 0; n < dgvRow.Cells.Count; n++) { dgvRow.Cells[n].Selected = false; } } // //开始同步单元格选择 // for (int m = 0; m < dgv1.SelectedCells.Count; m++) { dgv1Cell = dgv1.SelectedCells[m]; rowIndex = dgv1Cell.RowIndex; colIndex = dgv1Cell.ColumnIndex; dgv2Cell = dgv2.Rows[rowIndex].Cells[colIndex]; dgv2Cell.Selected = true; } } } #endregion #region /// <summary> /// 获取数据集合成员最大或最小的数的索引编号 /// </summary> /// <param name="values">数据集合</param> /// <param name="max">max等于true为选择最大的数,等于false为选择最小的数</param> /// <returns>返回最大或最小的数</returns> public static int GetMaxOrMinValue(List<int> values, bool max) { int tmpVal1 = values[0]; int valIndex = 0; for (int i = 0; i < values.Count; i++) { int tmpVal2 = values[i]; if (tmpVal1 != tmpVal2) { switch (max) { case true://查找最大的数据编号 if (tmpVal1 < tmpVal2) { tmpVal1 = tmpVal2; valIndex = i; } break; case false://查找最小的数据编号 if (tmpVal1 > tmpVal2) { tmpVal1 = tmpVal2; valIndex = i; } break; } } else { //如果两个数相等 tmpVal1 = tmpVal2; valIndex = i; } } return valIndex; } #endregion }