动态添加列,关键是实现 ITemplate.InstantiateIn 方法。下面是一个添加 GridView 模板列的例子。
Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=1216855
<%
...@ Page Language
=
"
C#
"
%>
<% ...@ Import Namespace = " System.Data " %>
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN "
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< script runat = " server " > ...
ICollection CreateDataSource()
...{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add( new DataColumn( " id " , typeof (Int32)));
dt.Columns.Add( new DataColumn( " text " , typeof ( string )));
for ( int i = 0 ; i < 6 ; i ++ )
...{
dr = dt.NewRow();
dr[ 0 ] = i;
dr[ 1 ] = " 列表项目 " + i.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
public class GridViewTemplate : ITemplate
...{
private DataControlRowType templateType;
private string columnName;
public GridViewTemplate( DataControlRowType type, string colname )
...{
templateType = type;
columnName = colname;
}
public void InstantiateIn( System.Web.UI.Control container )
...{
switch (templateType)
...{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break ;
case DataControlRowType.DataRow:
DropDownList drr = new DropDownList();
drr.ID = " dropdown " ;
drr.AppendDataBoundItems = true ;
drr.Items.Add( new ListItem( " -----请选择------ " , "" ));
drr.Items.Add( new ListItem( " AA " , " a " ));
drr.Items.Add( new ListItem( " BB " , " b " ));
drr.Items.Add( new ListItem( " CC " , " c " ));
container.Controls.Add(drr);
break ;
default :
break ;
}
}
}
protected void Page_Load( object sender, EventArgs e)
...{
if ( ! IsPostBack)
...{
TemplateField customField = new TemplateField();
customField.ShowHeader = true ;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, " 动态添加列 " );
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "" );
GridView1.Columns.Add(customField);
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
...{
if (e.Row.RowType == DataControlRowType.DataRow)
...{
// 可以在这里访问数据库的其它字段的值,可以设置默认选择项,具体应用,看自己的发挥了。
// 下面只是例子,举一反三,不再费话了
DataRowView gv = (DataRowView)e.Row.DataItem;
int itemSeleted = Int32.Parse(gv.Row[ " id " ].ToString()) > 3 ? 0 : Int32.Parse(gv.Row[ " id " ].ToString());
DropDownList dr = (DropDownList)e.Row.FindControl( " dropdown " );
dr.SelectedIndex = itemSeleted;
}
}
</ script >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head id = " Head1 " runat = " server " >
< title > GridView动态添加模板列的例子 </ title >
</ head >
< body >
< form id = " form1 " runat = " server " >
< asp:GridView ID = " GridView1 " runat = " server " AutoGenerateColumns = " False "
OnRowDataBound = " GridView1_RowDataBound " >
< Columns >
< asp:BoundField HeaderText = " 标题 " DataField = " text " />
</ Columns >
</ asp:GridView >
</ form >
</ body >
</ html >
<% ...@ Import Namespace = " System.Data " %>
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN "
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< script runat = " server " > ...
ICollection CreateDataSource()
...{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add( new DataColumn( " id " , typeof (Int32)));
dt.Columns.Add( new DataColumn( " text " , typeof ( string )));
for ( int i = 0 ; i < 6 ; i ++ )
...{
dr = dt.NewRow();
dr[ 0 ] = i;
dr[ 1 ] = " 列表项目 " + i.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
public class GridViewTemplate : ITemplate
...{
private DataControlRowType templateType;
private string columnName;
public GridViewTemplate( DataControlRowType type, string colname )
...{
templateType = type;
columnName = colname;
}
public void InstantiateIn( System.Web.UI.Control container )
...{
switch (templateType)
...{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = columnName;
container.Controls.Add(lc);
break ;
case DataControlRowType.DataRow:
DropDownList drr = new DropDownList();
drr.ID = " dropdown " ;
drr.AppendDataBoundItems = true ;
drr.Items.Add( new ListItem( " -----请选择------ " , "" ));
drr.Items.Add( new ListItem( " AA " , " a " ));
drr.Items.Add( new ListItem( " BB " , " b " ));
drr.Items.Add( new ListItem( " CC " , " c " ));
container.Controls.Add(drr);
break ;
default :
break ;
}
}
}
protected void Page_Load( object sender, EventArgs e)
...{
if ( ! IsPostBack)
...{
TemplateField customField = new TemplateField();
customField.ShowHeader = true ;
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, " 动态添加列 " );
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "" );
GridView1.Columns.Add(customField);
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
...{
if (e.Row.RowType == DataControlRowType.DataRow)
...{
// 可以在这里访问数据库的其它字段的值,可以设置默认选择项,具体应用,看自己的发挥了。
// 下面只是例子,举一反三,不再费话了
DataRowView gv = (DataRowView)e.Row.DataItem;
int itemSeleted = Int32.Parse(gv.Row[ " id " ].ToString()) > 3 ? 0 : Int32.Parse(gv.Row[ " id " ].ToString());
DropDownList dr = (DropDownList)e.Row.FindControl( " dropdown " );
dr.SelectedIndex = itemSeleted;
}
}
</ script >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head id = " Head1 " runat = " server " >
< title > GridView动态添加模板列的例子 </ title >
</ head >
< body >
< form id = " form1 " runat = " server " >
< asp:GridView ID = " GridView1 " runat = " server " AutoGenerateColumns = " False "
OnRowDataBound = " GridView1_RowDataBound " >
< Columns >
< asp:BoundField HeaderText = " 标题 " DataField = " text " />
</ Columns >
</ asp:GridView >
</ form >
</ body >
</ html >