前两天在做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中生成一个包含了多个列数据的链接。
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中生成一个包含了多个列数据的链接。


浙公网安备 33010602011771号