GridView如何动态添加模板列TemplateField
时间:2010-11-07 来源:tiandong
1 实施原因:
因为在做一个MOSS WebPart控件时候,遇到一个问题,如何选择需要导出的数据列;
GridView的数据源是动态的,所以没有办法静态使用模板列,来选择导出的列;
之所以没有用BoundField的原因,是因为一列数据列中不能放入两个或两个以上的控件,
以及不能在表头加入相关控件。所以,最后,我采用动态添加模板列的方法解决这个问题,
欢迎大家测试和改善。
2、待改善问题:
a、如何控制模板列中子控件集合的UI布局,
b、HeaderTemplate区域不能对子控件进行数据绑定。
如图所示:
选择文件清单“Site_Menu”时候:
选择文件清单“Web 部件库”时候
二、代码结构
类对象的使用关系:
GridVeiw-->Column-->TemplateField-->Header/DataRow-->MyTemplateColumn-->ColumnField;
其中MyTemplateField继承ITemplate;
ControlField为MyTemplateField提供构造模板列的相关数据。
三、代码内容
1、MyTemplateColumn.cs,详情如下:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace Test.WebControls.GridView.MyTemplateColumn
{
public class MyTmeplateColumn:ITemplate
{
/// <summary>
/// 委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void EventHandler(object sender, EventArgs e);
/// <summary>
/// 事件
/// </summary>
public event EventHandler eh;
/// <summary>
/// 模板列的类型
/// </summary>
private DataControlRowType templateType;
/// <summary>
/// 数据绑定列的标题
/// </summary>
private string HeaderText;
/// <summary>
/// 模板列控件对象的集合<控件ID, 控件对象>
/// </summary>
private System.Collections.Generic.Dictionary<string, ControlField> ControlsFieldList;
public MyTmeplateColumn(DataControlRowType type, string headerText)
{
this.templateType = type;
this.HeaderText = headerText;
}
public MyTmeplateColumn(DataControlRowType type, string headerText, System.Collections.Generic.Dictionary<string, ControlField> ControlsFieldList)
{
this.templateType = type;
this.HeaderText = headerText;
this.ControlsFieldList = ControlsFieldList;
}
/// <summary>
/// 进行数据绑定
/// </summary>
/// <param name="container"></param>
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case DataControlRowType.Header:
{
if (this.ControlsFieldList != null && this.ControlsFieldList.Count > 0)
{
for (int i = 0; i < this.ControlsFieldList.Count; i++)
{
string ID = this.ControlsFieldList.Keys.ToArray()[i].ToString().Trim();
ControlField controlField = this.ControlsFieldList[ID];
// 执行数据绑定
System.Web.UI.Control control = controlField.UIControl;
if (control != null && controlField != null)
{
//control.DataBinding += new System.EventHandler(ControlFieldDataBinding);
container.Controls.Add(control);
}
}
}
Literal lc = new Literal();
lc.Text = this.HeaderText;
container.Controls.Add(lc);
break;
}
case DataControlRowType.DataRow:
{
if (this.ControlsFieldList != null && this.ControlsFieldList.Count > 0)
{
for (int i = 0; i < this.ControlsFieldList.Count; i++)
{
string ID = this.ControlsFieldList.Keys.ToArray()[i].ToString().Trim();
ControlField controlField = this.ControlsFieldList[ID];
// 执行数据绑定
System.Web.UI.Control control = controlField.UIControl;
if (control != null && controlField != null)
{
control.DataBinding += new System.EventHandler(ControlFieldDataBinding);
container.Controls.Add(control);
}
}
}
break;
}
default:
{
break;
}
}
}
/// <summary>
/// ControlField的对象进行数据绑定
/// </summary>
/// <param name="controlField"></param>
public void ControlFieldDataBinding(object sender, EventArgs e)
{
GridViewRow container = null;
ControlField controlField = null;
string control_type = sender.GetType().Name;
string control_id = "";
switch (control_type)
{
case "Label":
{
control_id = (sender as Label).ID.Trim();
break;
}
case "TextBox":
{
control_id = (sender as TextBox).ID.Trim();
break;
}
case "LinkButton":
{
control_id = (sender as LinkButton).ID.Trim();
break;
}
case "Button":
{
control_id = (sender as Button).ID.Trim();
break;
}
case "DropDownList":
{
control_id = (sender as DropDownList).ID.Trim();
break;
}
case "CheckBox":
{
control_id = (sender as CheckBox).ID.Trim();
break;
}
case "RadioButton":
{
control_id = (sender as RadioButton).ID.Trim();
break;
}
}
if (control_id != "")
{
controlField = this.ControlsFieldList[control_id];
}
if (controlField != null)
{
// 转化子控件
System.Collections.Generic.Dictionary<string, string> fields = null;// <property, key> = <服务器控件属性名称, 属性绑定数据字段>
string property = "";//服务器控件属性名称
string key = "";//属性绑定数据字段
string value = ""; //临时变量
//
switch (controlField.ControlType)
{
#region 按控件类别,进行数据绑定
case ControlTypeEnum.Label:
{
#region Label DataBinding
Label obj = controlField.UIControl as Label;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
}
}
}
}
}
break;
#endregion
}
case ControlTypeEnum.TextBox:
{
#region TextBox DataBinding
TextBox obj = controlField.UIControl as TextBox; //sender as TextBox;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
}
}
}
}
}
break;
#endregion
}
case ControlTypeEnum.LinkButton:
{
#region LinkButton DataBinding
LinkButton obj = controlField.UIControl as LinkButton;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
case "POSTBACKURL":
{
obj.PostBackUrl = value;
break;
}
}
}
}
}
}
break;
#endregion
}
case ControlTypeEnum.Button:
{
#region Button DataBinding
Button obj = controlField.UIControl as Button;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
case "POSTBACKURL":
{
obj.PostBackUrl = value;
break;
}
}
}
}
}
}
break;
#endregion\
}
case ControlTypeEnum.DropDownList:
{
break;
}
case ControlTypeEnum.CheckBox:
{
#region CheckBox DataBinding
CheckBox obj = controlField.UIControl as CheckBox;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
case "CHECKED":
{
obj.Checked = Convert.ToBoolean(value);
break;
}
}
}
}
}
}
break;
#endregion
}
case ControlTypeEnum.RadioButton:
{
#region RadioButton DataBinding
RadioButton obj = controlField.UIControl as RadioButton;
container = obj.NamingContainer as GridViewRow;
if (obj != null && container != null)
{
if (obj != null && controlField.Fields != null && controlField.Fields.Count > 0)
{
fields = controlField.Fields;
for (int i = 0; i < fields.Count; i++)
{
property = fields.Keys.ToArray()[i];
if (property != null && property.Trim() != "")
{
key = fields[property];
value = DataBinder.Eval(container.DataItem, key).ToString().Trim();
switch (property.Trim().ToUpper())
{
case "TEXT":
{
obj.Text = value;
break;
}
case "TOOLTIP":
{
obj.ToolTip = value;
break;
}
case "ENABLED":
{
obj.Enabled = Convert.ToBoolean(value);
break;
}
case "VISIBLE":
{
obj.Visible = Convert.ToBoolean(value);
break;
}
case "CHECKED":
{
obj.Checked = Convert.ToBoolean(value);
break;
}
}
}
}
}
}
break;
#endregion
}
#endregion
}
}
}
}
}
相关阅读 更多 +










