DataGrid动态添加自定义模板列

自定义列模板定义
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;
     }
    }
   }
  }


转载于:https://www.cnblogs.com/jadychu/archive/2006/04/20/380330.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值