technofantasy

博客园 首页 新随笔 联系 订阅 管理
前两天在做ASP.NET程序时候碰到一个问题,我需要在DataGrid中的一列中实现绑定多个列(而且绑定哪些个列是不确定的,需要根据页面传过来的参数决定)。因此做了一个自定义列模版来实现,首先创建一个自定义的列模版:

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

namespace BusinessObjects.Reference
{
    
/// <summary>
    
/// Summary description for CustomDeleteTemplate.
    
/// </summary>

    public class CustomDeleteTemplate : ITemplate
    
{
        ListItemType templateType;
        
string columnName;
        
//关键指标项列表
        string[] _keycols;
        
//指标项索引
        string _indexid;

        
/// <summary>
        
/// 获得所有的关键指标项
        
/// </summary>
        
/// <param name="cols">以|分割的关键指标项列表</param>

        public void SetKeyColumn(string cols)
        
{
            _keycols 
= cols.Split('|');
        }


        
/// <summary>
        
/// 自定义模版的构造函数(针对数据列)
        
/// </summary>
        
/// <param name="type">列类型</param>
        
/// <param name="colname">列名称</param>
        
/// <param name="keyCols">关键指标列表</param>
        
/// <param name="IndexID">指标项分类索引</param>

        public CustomDeleteTemplate(ListItemType type, string colname, string keyCols, string IndexID)
        
{
            templateType 
= type;
            columnName 
= colname;
            SetKeyColumn(keyCols);
            _indexid 
= IndexID;
        }


        
/// <summary>
        
/// 自定义模版的构造函数(针对除了数据列的其它列)
        
/// </summary>
        
/// <param name="type">列类型</param>
        
/// <param name="colname">列名称</param>

        public CustomDeleteTemplate(ListItemType type, string colname)
        
{
            templateType 
= type;
            columnName 
= colname;
        }


        
private void TemplateControl_DataBinding(object sender,    System.EventArgs e)
        
{

            HyperLink link 
= (HyperLink)sender;
            
            DataGridItem container 
= (DataGridItem) link.NamingContainer;
            link.Text 
= "删 除";
            
string strKeyParams = "";
            
foreach (string s in _keycols)
            
{
                strKeyParams 
+= "&";
                strKeyParams 
+= s;
                strKeyParams 
+= "=";
                strKeyParams 
+= DataBinder.Eval(container.DataItem, s);
            }

            
            link.NavigateUrl 
= "CommonList.aspx?Type=Delete&IndexID=" + _indexid + strKeyParams;
            
        }


        
public void InstantiateIn(System.Web.UI.Control container)
        
{
            Literal lc 
= new Literal();
            
switch(templateType)
            
{
                
case ListItemType.Header:
                    lc.Text 
= "<B>" + columnName + "</B>";
                    container.Controls.Add(lc);
                    
break;
                
case ListItemType.Item:
                    HyperLink link 
= new HyperLink();
                    container.Controls.Add(link);
                    link.DataBinding 
+= new EventHandler(TemplateControl_DataBinding);
                    
break;
                
case ListItemType.EditItem:
                    TextBox tb 
= new TextBox();
                    tb.Text 
= "";
                    container.Controls.Add(tb);
                    
break;
                
case ListItemType.Footer:
                    lc.Text 
= "<I>" + columnName + "</I>";
                    container.Controls.Add(lc);
                    
break;
            }

        }

    }

}


在这个类的构造函数中,我将需要绑定的列的名称以一个 | 分割的字符串传递进去。然后在InstantiateIn中判断列的类型,如果是数据列就创建一个HyperLink对象添加到container中,并且将DataBinding事件绑定到TemplateControl_DataBinding函数中,在TemplateControl_DataBinding这个函数中获得多个列的数据并绑定到相应的HyperLink上面。
添加这个自定义模版列的代码如下:
            TemplateColumn tcDel = new TemplateColumn();
                
            tcDel.ItemStyle.Width 
= 100;
            tcDel.HeaderTemplate 
= new 
                CustomDeleteTemplate(ListItemType.Header, 
"删除");
                
            tcDel.ItemTemplate 
= new 
                CustomDeleteTemplate(ListItemType.Item, 
"Column1", keyCols, IndexID);

            DataGrid1.Columns.Add(tcDel);

其中keyCols是从外面获取的多个字段的列表。这样就可以在模版列的HyperLink中生成一个包含了多个列数据的链接。
posted on 2005-11-25 18:05  陈锐  阅读(414)  评论(0)    收藏  举报