DevExpres ASPxGridView自定义多表头及合并单元格Word文档格式.docx
《DevExpres ASPxGridView自定义多表头及合并单元格Word文档格式.docx》由会员分享,可在线阅读,更多相关《DevExpres ASPxGridView自定义多表头及合并单元格Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
}}
Dictionary<
GridViewCommandColumn,TableCell>
commandCells=newDictionary<
();
GridViewDataColumn,TableCell>
mergedCells=newDictionary<
TableCell,int>
cellRowSpans=newDictionary<
#region外部调用入口(初始化)
publicASPxGridViewHelper(ASPxGridViewgrid)
this.grid=grid;
}
///<
summary>
///初始化
/summary>
paramname="
grid"
>
要操作的ASPxGridView<
/param>
fieldName"
根据哪个字段分组合并,例如单据编号<
columnNumber"
使后N列不进行合并,例如N=4,即后4列数据不参与合并<
header"
///ASPxGridView多表头实现
///表头格式定义方法:
相邻父列#分隔上下级空格分隔相邻子级用逗号分隔
isOpenMutiHeader"
是否启用多表头,默认关闭<
isOpenMergeCell"
是否启用合并单元格,默认关闭<
publicASPxGridViewHelper(ASPxGridViewgrid,stringfieldName,int[]notMergeNumbers,stringheader,boolisOpenMutiHeader,boolisOpenMergeCell)
this.fieldName=fieldName;
this.header=header;
this.isOpenMergeCell=isOpenMergeCell;
this.isOpenMutiHeader=isOpenMutiHeader;
this.notMergeNumbers=notMergeNumbers;
Grid.HtmlRowCreated+=newASPxGridViewTableRowEventHandler(grid_HtmlRowCreated);
Grid.HtmlDataCellPrepared+=newASPxGridViewTableDataCellEventHandler(grid_HtmlDataCellPrepared);
Grid.HtmlCommandCellPrepared+=newASPxGridViewTableCommandCellEventHandler(grid_HtmlCommandCellPrepared);
#region初始化准备
voidgrid_HtmlDataCellPrepared(objectsender,ASPxGridViewTableDataCellEventArgse)
if(cellRowSpans.ContainsKey(e.Cell))
e.Cell.RowSpan=cellRowSpans[e.Cell];
voidgrid_HtmlCommandCellPrepared(objectsender,ASPxGridViewTableCommandCellEventArgse)
voidgrid_HtmlRowCreated(objectsender,ASPxGridViewTableRowEventArgse)
if(isOpenMutiHeader)
ASPxGridViewgv=senderasASPxGridView;
if(e.RowType==DevExpress.Web.ASPxGridView.GridViewRowType.Data&
&
e.VisibleIndex==gv.PageIndex*gv.SettingsPager.PageSize)
SplitTableHeader(e.Row,header);
if(isOpenMergeCell)
boolisPrevColumnHasSameFormID=IsSameData(fieldName,e.VisibleIndex,e.VisibleIndex-1);
boolisNextColumnHasSameFormID=IsSameData(fieldName,e.VisibleIndex,e.VisibleIndex+1);
if(Grid.GetRowLevel(e.VisibleIndex)!
=Grid.GroupCount)return;
List<
int>
num=newList<
if(notMergeNumbers!
=null)
num.AddRange(notMergeNumbers);
for(inti=e.Row.Cells.Count-1;
i>
=0;
i--)
if(!
(num!
=null&
num.Count>
0&
num.Contains(i)))
DevExpress.Web.ASPxGridView.Rendering.GridViewTableDataCelldataCell=e.Row.Cells[i]asDevExpress.Web.ASPxGridView.Rendering.GridViewTableDataCell;
DevExpress.Web.ASPxGridView.Rendering.GridViewTableCommandCellcommandCell=e.Row.Cells[i]asDevExpress.Web.ASPxGridView.Rendering.GridViewTableCommandCell;
if(dataCell!
MergeCells(dataCell.DataColumn,e.VisibleIndex,dataCell,isNextColumnHasSameFormID,isPrevColumnHasSameFormID);
elseif(commandCell!
MergeCells(commandCell.Column,e.VisibleIndex,commandCell,isNextColumnHasSameFormID,isPrevColumnHasSameFormID);
voidMergeCells(GridViewCommandColumncolumn,intvisibleIndex,TableCellcell,boolisNextColumnHasSameFormID,boolisPrevColumnHasSameFormID)
if(isNextColumnHasSameFormID)
commandCells.ContainsKey(column))
commandCells[column]=cell;
if(isPrevColumnHasSameFormID)
((TableRow)cell.Parent).Cells.Remove(cell);
if(commandCells.ContainsKey(column))
TableCellcommCell=commandCells[column];
cellRowSpans.ContainsKey(commCell))
cellRowSpans[commCell]=1;
cellRowSpans[commCell]=cellRowSpans[commCell]+1;
isNextColumnHasSameFormID)
commandCells.Remove(column);
voidMergeCells(GridViewDataColumncolumn,intvisibleIndex,TableCellcell,boolisNextColumnHasSameFormID,boolisPrevColumnHasSameFormID)
boolisNextTheSame=IsNextColumnHasSameData(column,visibleIndex);
if(isNextColumnHasSameFormID&
isNextTheSame)
mergedCells.ContainsKey(column))
mergedCells[column]=cell;
if(isPrevColumnHasSameFormID&
IsPrevColumnHasSameData(column,visibleIndex))
if(mergedCells.ContainsKey(column))
TableCellmergedCell=mergedCells[column];
cellRowSpans.ContainsKey(mergedCell))
cellRowSpans[mergedCell]=1;
cellRowSpans[mergedCell]=cellRowSpans[mergedCell]+1;
mergedCells.Remove(column);
}
boolIsNextColumnHasSameData(GridViewDataColumncolumn,intvisibleIndex)
//isitthelastvisiblerow
if(visibleIndex>
=Grid.VisibleStartIndex+Grid.VisibleRowCount-1)returnfalse;
returnIsSameData(column.FieldName,visibleIndex,visibleIndex+1);
boolIsPrevColumnHasSameData(GridViewDataColumncolumn,intvisibleIndex)
ASPxGridViewgrid=column.Grid;
//isitthefirstvisiblerow
if(visibleIndex<
=Grid.VisibleStartIndex)returnfalse;
returnIsSameData(column.FieldName,visibleIndex,visibleIndex-1);
boolIsSameData(stringfieldName,intvisibleIndex1,intvisibleIndex2)
//isitagrouprow?
if(Grid.GetRowLevel(visibleIndex2)!
=Grid.GroupCount)returnfalse;
returnobject.Equals(Grid.GetRowValues(visibleIndex1,fieldName),Grid.GetRowValues(visibleIndex2,fieldName));
///重写表头
targetHeader"
目标表头<
newHeaderNames"
新表头<
remarks>
///等级#级别#上期结存件数,重量,比例#本期调入收购调入件数,重量,比例#本期发出车间投料件数,重量,
///比例#本期发出产品外销百分比件数,重量,比例#平均值
/remarks>
voidSplitTableHeader(TableRowtargetHeader,stringnewHeaderNames)
Tabletable=targetHeader.ParentasTable;
table.Rows.RemoveAt(0);
table.CssClass="
dxgvTable_Office2003_Blue"
;
introw=GetRowCount(newHeaderNames);
intcol=GetColCount(newHeaderNames);
string[,]nameList=ConvertList(newHeaderNames,row,col);
intRowSpan=0;
intColSpan=0;
for(intk=0;
k<
row;
k++)
TableRowtrow=newTableRow();
trow.Height=20;
stringLastFName="
"
for(inti=0;
i<
col;
i++)
TableCellcell=newTableCell();
if(LastFName==nameList[i,k]&
k!
=row-1)
LastFName=nameList[i,k];
continue;
else
intbFlag=IsVisible(nameList,k,i,LastFName);
switch(bFlag)
case0:
break;
case1:
RowSpan=GetSpanRowCount(nameList,row,k,i);
ColSpan=GetSpanColCount(nameList,row,col,k,i);
cell=newTableCell();
cell.RowSpan=RowSpan;
cell.ColumnSpan=ColSpan;
cell.CssClass="
dxgvHeader_Office2003_Blue"
cell.Text=LastFName;
cell.BorderStyle=BorderStyle.Solid;
cell.BorderWidth=Unit.Pixel(0);
cell.Style.Add(HtmlTextWriterStyle.TextAlign,"
center"
);
cell.Style.Add(HtmlTextWriterStyle.BorderCollapse,"
collapse"
separate"
cell.Style["
BORDER-RIGHT-WIDTH"
]="
1px"
BORDER-BOTTOM-WIDTH"
trow.Cells.Add(cell);
case-1:
string[]EndColName=LastFName.Split(newchar[]{'
'
});
foreach(stringeNameinEndColName)
cell.Text=eName;
if(k!
{//不是起始行,加入新行标签
//cell.Text=cell.Text+"
<
/th>
/tr>
tr>
table.Rows.AddAt(k,trow);
/**/
///如果上一行已经输出和当前内容相同的列头,则不显示
ColumnList"
表头集合<
rowIndex"
行索引<
colIndex"
列索引<
returns>
1:
显示,-1:
含'
分隔符,0:
不显示<
/returns>
privateintIsVisible(string[,]ColumnList,introwIndex,intcolIndex,stringCurrName)
if(rowIndex!
=0)
if(ColumnList[colIndex,rowIndex-1]==CurrName)
return0;
if(ColumnList[colIndex,rowIndex].Contains("
"
))
return-1;
return1;
///取得和当前索引行及列对应的下级的内容所跨的行数
row"
行数<
privateintGetSpanRowCount(string[,]ColumnList,introw,introwIndex,intcolIndex)
stringLastName="
intRowSpan=1;
for(intk=rowIndex;
if(ColumnList[colIndex,k]==LastName)
RowSpan++;
LastName=ColumnList[colIndex,k];
returnRowSpan;
summar