关于DataGrid中合并行及其preRender事件
解决方法:
即进行合并行操作,此时可用到DataGrid的preRender事件:
private void DataGrid2_PreRender(object sender, System.EventArgs e)
{
JoinCells.Jion(this.DataGrid2,2);
}
JoinCells类:
public class JoinCells
{
public JoinCells()
{ }
/// <summary>
/// 合并DataGrid中相同内容的行
/// </summary>
/// <param name="objDG">所要操作的DataGrid</param>
/// <param name="index">指出对第0列到第index列,每列中相同内容的行进行合并</param>
public static void Jion(DataGrid objDG,int index)
{
for(int i=0;i<=index;i++)
{
TableCell tcNow=objDG.Items[0].Cells[i];
for(int j=1;j<objDG.Items.Count;j++)
{
TableCell tcNext=objDG.Items[j].Cells[i];
if(tcNext.Text.Trim()==tcNow.Text.Trim()&&CheckPre(objDG,j,i))
{
tcNext.Visible =false;
if(tcNow.RowSpan ==0)
{
tcNow.RowSpan =1;
}
tcNow.RowSpan +=1;
tcNow.VerticalAlign =VerticalAlign.Middle;
}
else
{
tcNow=tcNext;
}
}
}
}
//做简单的向前检查,看所要合并的两行是否属同一系列,
//(避免将上海的数码相机与北京的数码相机合并)
private static bool CheckPre(DataGrid objDG,int rowIndex,int colIndex)
{
if(colIndex==0)
{
return true;
}
Else if(objDG.Items[rowIndex-1].Cells[colIndex-1].Text.Trim()==objDG.Items[rowIndex].Cells[colIndex-1].Text.Trim())
{
return true;
}
else
{
return false;
}
}
关于DataGrid中实现跨行表头
解决方法:
首先,为DataTable添加一个空行:
objDS=new DataSet();
objDS=DataAccess.ExecProc(procName);
//添加空DataRow,并排序
DataTable dt=objDS.Tables[0];
DataRow dr=dt.NewRow();
dt.Rows.Add(dr);
DataView myDataView = dt.DefaultView;
myDataView.Sort = "AreaName ASC";
this.dgDeposit.DataSource =dt;
this.dgDeposit.DataBind();
接着,对表头进行处理:
Private void dgDeposit_ItemDataBound(object sender,DataGridItemEventArgs e)
{
flag++;
if(flag==1)//处理原表头
{
for(int i=0;i<=4;i++)
{
e.Item.Cells[i].RowSpan =2;
}
e.Item.Cells[5].ColumnSpan =2;
e.Item.Cells[5].Text =title;
e.Item.Cells[5].HorizontalAlign =HorizontalAlign.Center;
//由于某些单元格占用了多列多行,会将原有的单元格向右挤,须删去
for(int i=0;i<1;i++)
{
e.Item.Cells.RemoveAt(6);
}
}
else if(flag==2)//处理新插入的空行,以作多行表头
{
for(int i=0;i<2;i++)
{
e.Item.Cells[i].Text =sArray[i];
e.Item.Cells[i].Width =Unit.Pixel(50);
e.Item.Cells[i].BackColor =Color.RoyalBlue;
}
//由于某些单元格占用了多列多行,会将原有的单元格向右挤,须删去
for(int i=0;i<5;i++)
{
e.Item.Cells.RemoveAt(2);
}
}
}