<HTML>
<HEAD>
<title>MergeHeader</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server"
BorderColor="Tan" BorderWidth="1px" BackColor="LightGoldenrodYellow" CellPadding="1" ForeColor="Black"
CellSpacing="1">
<FooterStyle BackColor="Tan"></FooterStyle>
<SelectedItemStyle ForeColor="GhostWhite" BackColor="DarkSlateBlue"></SelectedItemStyle>
<AlternatingItemStyle BackColor="PaleGoldenrod"></AlternatingItemStyle>
<HeaderStyle Font-Bold="True" BackColor="Tan"></HeaderStyle>
<PagerStyle HorizontalAlign="Center" ForeColor="DarkSlateBlue" BackColor="PaleGoldenrod"></PagerStyle>
</asp:datagrid>
</form>
</body>
</HTML>
public class MergeHeader : System.Web.UI.Page
{
private DataGrid m_dgDatagridToDecorate = null;
private ArrayList m_arrHeaderCells = null;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private Hashtable m_htblRowspanIndex = new Hashtable();
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
MergeGrid();
}
}

AddMergeHeader#region AddMergeHeader
private void AddMergeHeader(ArrayList arrHeaderCells)
{
m_arrHeaderCells =arrHeaderCells;
}
#endregion

property#region property
private DataGrid DatagridToDecorate
{
get
{
return m_dgDatagridToDecorate;
}
set
{
if(null != m_dgDatagridToDecorate)
{
m_dgDatagridToDecorate.ItemCreated -= new DataGridItemEventHandler(DatagridToDecorate_ItemCreated);
}
m_dgDatagridToDecorate = value;
m_dgDatagridToDecorate.ItemCreated += new DataGridItemEventHandler(DatagridToDecorate_ItemCreated);
}
}
#endregion 

DatagridToDecorate_ItemCreated#region DatagridToDecorate_ItemCreated
private void DatagridToDecorate_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
//*** Examine if the item created is the header item
ListItemType lit = e.Item.ItemType;
if(ListItemType.Header == lit)
{
//*** Redirect the default header rendering method to our own method
e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMethod));
}
}
#endregion 

NewRenderMethod#region NewRenderMethod
private void NewRenderMethod(HtmlTextWriter writer, Control ctl)
{
int iCurrIndex = 0;
for(int i=0; i<m_arrHeaderCells.Count; i++)
{
TableCell item = (TableCell)m_arrHeaderCells[i];
if(item.ColumnSpan > 1)
{
iCurrIndex += item.ColumnSpan-1;
}
if(item.RowSpan > 1)
{
m_htblRowspanIndex.Add(iCurrIndex + i, iCurrIndex + i);
}
item.RenderControl(writer);
}
writer.WriteEndTag("TR");
//*** Add the style attributes that was defined in design time
// to our second row so they both will have the same appearance
m_dgDatagridToDecorate.HeaderStyle.AddAttributesToRender(writer);
//*** Insert the second row
writer.RenderBeginTag("TR");
//*** Render all the cells that was defined in design time, except the last one
// because we already rendered it above
for(int i=0; i< ctl.Controls.Count; i++)
{
if((null == m_htblRowspanIndex[i]))
{
ctl.Controls[i].RenderControl(writer);
}
}
//*** We don't need to write the </TR> close tag because the writer will do that for us
// and so we're done :)
}
#endregion

GetData#region GetData
private DataTable GetData()
{
DataTable dt;
dt = new DataTable();
dt.Columns.Add("Code");
dt.Columns.Add("FName");
dt.Columns.Add("MName");
dt.Columns.Add("LName");
dt.Columns.Add("Age");
dt.Columns.Add("Elementary");
dt.Columns.Add("Junior");
dt.Columns.Add("High");
dt.Columns.Add("Religion");
for(int i=1; i <= 12; i++)
{
DataRow dr = dt.NewRow();
dr["Code"] = "Code" + i.ToString();
dr["FName"] = "FName" + i.ToString();
dr["MName"] = "MName" + i.ToString();
dr["LName"] = "LName" + i.ToString();
dr["Age"] = "Age" + i.ToString();
dr["Elementary"] = "Elementary" + i.ToString();
dr["Junior"] = "Junior" + i.ToString();
dr["High"] = "High" + i.ToString();
dr["Religion"] = "Religion" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}
#endregion

MergeGrid#region MergeGrid
private void MergeGrid()
{
TableCell cell = null;
DatagridToDecorate = DataGrid1;
ArrayList header = new ArrayList(); 
cell = new TableCell();
cell.Text = "Name";
cell.RowSpan = 2;
cell.HorizontalAlign = HorizontalAlign.Center;
header.Add(cell);
cell = new TableCell();
cell.Text = "Name";
cell.ColumnSpan = 3;
cell.HorizontalAlign = HorizontalAlign.Center;
header.Add(cell);
cell = new TableCell();
cell.Text = "Age";
cell.RowSpan = 2;
cell.HorizontalAlign = HorizontalAlign.Center;
header.Add(cell);
cell = new TableCell();
cell.Text = "School";
cell.ColumnSpan = 3;
cell.HorizontalAlign = HorizontalAlign.Center;
header.Add(cell);
cell = new TableCell();
cell.Text = "Religion";
cell.RowSpan = 2;
cell.HorizontalAlign = HorizontalAlign.Center;
header.Add(cell);
AddMergeHeader(header);
DataGrid1.DataSource = GetData();
DataGrid1.DataBind();
}
#endregion 

Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
本文介绍了一种在ASP.NET Web应用程序中使用DataGrid控件时,通过自定义渲染方法实现复杂表格头合并的方法。该方法利用了Hashtable来跟踪跨行单元格的位置,并通过覆盖默认的渲染过程来达到美观且灵活的布局效果。
&spm=1001.2101.3001.5002&articleId=630331&d=1&t=3&u=e6b4a2263d3b48b49b87a6ecaed7acbf)
9061

被折叠的 条评论
为什么被折叠?



