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 } } } } }
相关阅读 更多 +