您的位置:首页 > 其它

DataGrid动态添加自定义模板列

2006-04-20 16:17 417 查看
自定义列模板定义

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CommonComponents
{
/// <summary>
/// 自定义文本显示模板列
/// </summary>
public class SelfDefineTextColumnTemplate:System.Web.UI.ITemplate
{
string colSourceName= "";
/// <summary>
/// 文本显示模板列
/// </summary>
/// <param name="ColSourceName">模板列动态绑定的数据列</param>
public SelfDefineTextColumnTemplate(string ColSourceName)
{
colSourceName = ColSourceName;
}
public void InstantiateIn(Control container)
{
LiteralControl l = new LiteralControl();
l.DataBinding += new EventHandler(this.OnDataBinding);
//数据绑定
container.Controls.Add(l);
}
public void OnDataBinding(object sender, EventArgs e)
{
LiteralControl l = (LiteralControl) sender;//发送绑定请求
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((System.Data.DataRowView)container.DataItem)[colSourceName].ToString();//绑定
}
}

/// <summary>
/// 自定义超级连接模板列
/// </summary>
public class SelfDefineLinkColumnTemplate:System.Web.UI.ITemplate
{
string colSourceName= "",urlTarget = "",colId = "";

/// <summary>
/// 动态绑定超级连接列
/// </summary>
/// <param name="ColSourceName">数据源列</param>
/// <param name="UrlTarget">超级连接的URL</param>
/// <param name="ColId">模板列的ID,便于引用列</param>
public SelfDefineLinkColumnTemplate(string ColSourceName,string UrlTarget,string ColId)
{
colSourceName = ColSourceName;
urlTarget = UrlTarget;
colId = ColId;
}
public void InstantiateIn(Control container)
{
HyperLink hl = new HyperLink();
hl.ID = colId;
hl.DataBinding += new EventHandler(this.OnDataBinding);
container.Controls.Add(hl);
}
public void OnDataBinding(object sender, EventArgs e)
{
HyperLink hl = (HyperLink) sender;
DataGridItem container = (DataGridItem) hl.NamingContainer;
hl.Text = ((System.Data.DataRowView)container.DataItem)[colSourceName].ToString();//绑定
hl.NavigateUrl = urlTarget;
hl.Target = "_blank";//打开新窗口
}
}
}

使用方法:
需要动态添加列定义数据文件processname.xml

<?xml version="1.0" encoding="utf-8" ?>
<NewDataSet>
<tbl_processname>
<prcid>1</prcid><!--列ID-->
<processname>column1</processname><!--自定义列名称-->
<isShow>1</isShow><!--是否显示该列-->
</tbl_processname>
<tbl_processname>
<prcid>2</prcid>
<processname>column2</processname>
<isShow>1</isShow>
</tbl_processname>
<tbl_processname>
<prcid>3</prcid>
<processname>column3</processname>
<isShow>1</isShow>
</tbl_processname>
</NewDataSet>

PageLoad中调用AddColumnToGrid动态添加列

private void AddColumnToGrid()
{
DataSet ds = new DataSet();
ds.ReadXML("processname.xml");
DataTable tblTemp = ds.Tables[0];//需要动态添加列的列表
foreach (DataRow dr in tblTemp.Rows)
{
if (Convert.ToBoolean(dr["isShow"]))//需要显示的列
{
//自定义模板列
TemplateColumn tm=new TemplateColumn();
tm.HeaderText=dr["processname"].ToString();
tm.ItemTemplate =
new SelfDefineLinkColumnTemplate(dr["processname"].ToString(),
"ShowDetail.aspx?processId="+Convert.ToInt32(dr["prcid"])+"",
dr["prcid"].ToString());
this.GrdBrowse.Columns.Add(tm);//表格添加列
}
}
}

对新添加的列进行操作

private void GrdBrowse_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
string strUrl="";
HyperLink hl;
int grdId;

DataSet ds = new DataSet();
ds.ReadXML("processname.xml");
DataTable tblTemp = ds.Tables[0];//需要动态添加列的列表

if (e.Item.ItemType == System.Web.UI.WebControls.ListItemType.Item ||
e.Item.ItemType == System.Web.UI.WebControls.ListItemType.AlternatingItem )
{
//表格行编号
grdId = Convert.ToInt32(this.GrdBrowse.DataKeys[e.Item.ItemIndex]);
foreach(DataRow dr in tblTmp.Rows)
{
if (Convert.ToBoolean(dr["isShow"]))//显示的列
{
hl = (HyperLink)e.Item.FindControl(dr["prcId"].ToString());
strUrl = hl.NavigateUrl + "&id="+grdId";//添加参数
hl.NavigateUrl = strUrl;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: