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/archive/2012/04/12/2443366.html
相关资源:C#中DataGridView常用操作实例小结