经过两天努力,系统已经完工,剩下的测试就交给人力资源部门,原本以为十分容易,其实实现起来还是被几个问题纠缠着,好在有百度和优快云,帮助我迅速解决掉问题,所以说办法总还是比问题多的.
为GridView自动生成模板列
主要是继承 ITemplate:
public class MyTemplate : ITemplate { private string strColumnName; private DataControlRowType dcrtColumnType; private string strBindName; private string txtID; /// <summary> /// 初始化模板列 /// </summary> /// <param name="strColumnName">列名</param> /// <param name="dcrtColumnType">行类型</param> /// <param name="strBindName">绑定名称</param> /// <param name="txtID">控件ID</param> public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType,string strBindName,string txtID) { this.strColumnName = strColumnName; this.dcrtColumnType = dcrtColumnType; this.strBindName = strBindName; this.txtID = txtID; } public void InstantiateIn(Control ctlContainer) { switch (dcrtColumnType) { case DataControlRowType.Header: //列标题 Literal ltr = new Literal(); ltr.Text = strColumnName; ctlContainer.Controls.Add(ltr); break; case DataControlRowType.DataRow: //模版列内容 TextBox txt = new TextBox(); txt.ID = this.txtID; txt.DataBinding += new EventHandler(this.OnDataBinding); txt.Width = 90; txt.Attributes.Add("onblur", "return chktxt(this);"); ctlContainer.Controls.Add(txt); break; } } public void OnDataBinding(object sender, EventArgs e) { TextBox t = (TextBox)sender; GridViewRow container = (GridViewRow)t.NamingContainer; t.Text = ((DataRowView)container.DataItem)[strBindName].ToString(); } }
在页面调用
string[] s = dt.Columns[i].ToString().Split('@'); tp.HeaderTemplate = new MyTemplate(s[0], DataControlRowType.Header, dt.Columns[i].ToString(), s[1]); tp.ItemTemplate = new MyTemplate(s[0], DataControlRowType.DataRow, dt.Columns[i].ToString(), s[1]); grdview.Columns.Add(tp);