GridView 动态添加模板列并绑定数据 实现从外部直接传入控件 和 绑定字段参数
2011-10-05 17:54
926 查看
GridView 动态 添加 模板列 并 绑定数据 实现从外部直接传入控件 和 绑定字段参数
前台添加方法:
绑定事件
实现了从外部传入一个控件,利用传入控件的属性值传入绑定字段参数,支持一列添加多个控件,一个控件绑定多个字段。
里面一个委托方法本来打算从外部传入绑定事件,但是没有实现,所以,有些多余。
还有就是用到了反射、字符串处理等,效率不高。
给控件绑定事件需要写在RowCreated里。
public class GridViewTemplate : ITemplate { #region 参数 private DataControlRowType templateType; //区分列的类型 private string headName; //表头名称 private List<Control> controlList; //控件列表,支持同一列添加多个控件 private string strSeparator = "^"; //绑定字段与格式之间的分隔符,绑定字段与格式通过传入控件的属性传入。 private char strSeparatorItem = '/'; //绑定字段之间的分隔符,用于支持多字段绑定。 public DataControlRowType TemplateType { get { return templateType; } set { templateType = value; } } public string HeadName { get { return headName; } set { headName = value; } } public List<Control> ControlList { get { return controlList; } set { controlList = value; } } public string StrSeparator { get { return strSeparator; } set { strSeparator = value; } } public char StrSeparatorItem { get { return strSeparatorItem; } set { strSeparatorItem = value; } } #endregion
#region 构造 public GridViewTemplate() { } public GridViewTemplate(DataControlRowType templateType, string headName) { this.templateType = templateType; this.headName = headName; } public GridViewTemplate(DataControlRowType templateType, List<Control> controlList) { this.templateType = templateType; this.controlList = controlList; } #endregion
public void InstantiateIn(Control container) { switch (templateType) { case DataControlRowType.Header: Literal lc = new Literal(); lc.Text = headName; container.Controls.Add(lc); break; case DataControlRowType.DataRow: foreach (Control control in controlList) { string strControlType = control.GetType().ToString().Trim(); switch (strControlType.Substring(strControlType.LastIndexOf('.') + 1, strControlType.Length - strControlType.LastIndexOf('.') - 1).Trim()) { case "Label": AddControl(container, control, AddLabel); break; case "TextBox": AddControl(container, control, AddTextBox); break; case "DropDownList": AddControl(container, control, AddDropDownList); break; case "Button": AddControl(container, control, AddButton); break; default: break; } } break; default: break; } }
#region 委托 /// <summary> /// 添加控件--委托 /// </summary> /// <param name="container"></param> /// <param name="control"></param> private delegate void AddControlDelegate(Control container, Control control); /// <summary> /// 使用委托添加控件 /// </summary> /// <param name="container"></param> /// <param name="control">控件</param> /// <param name="addControlDelegate">添加控件方法</param> private void AddControl(Control container, Control control, AddControlDelegate addControlDelegate) { addControlDelegate(container, control); } #endregion
#region Label private void AddLabel(Control container, Control control) { Label lblTemp = new Label(); lblTemp.ID = control.ID; lblTemp.Text = ((Label)control).Text; lblTemp.ToolTip = ((Label)control).ToolTip; lblTemp.Visible = ((Label)control).Visible; lblTemp.ApplyStyleSheetSkin(((Label)control).Page); lblTemp.ControlStyle.CopyFrom(((Label)control).ControlStyle); lblTemp.CopyBaseAttributes((Label)control); lblTemp.DataBinding += new EventHandler(Label_DataBinding); container.Controls.Add(lblTemp); } private void Label_DataBinding(object sender, EventArgs e) { Label lblTemp = (Label)sender; GridViewRow row = (GridViewRow)lblTemp.NamingContainer; string strTempText = lblTemp.Text.Trim(); if ((!String.IsNullOrEmpty(strTempText)) && strTempText.Contains(strSeparator)) { lblTemp.Text = ""; string strBindStr = strTempText.Substring(0, strTempText.LastIndexOf(strSeparator)); string strBindStrFomat = strTempText.Substring(strTempText.LastIndexOf(strSeparator) + 1, strTempText.Length - strTempText.LastIndexOf(strSeparator) - 1); string[] strBindStrSubs = strBindStr.Split(strSeparatorItem); string[] strBindStrFomats = strBindStrFomat.Split(strSeparatorItem); if (strBindStrSubs.Length == strBindStrFomats.Length) { for (int i = 0; i < strBindStrSubs.Length; i++) { lblTemp.Text += DataBinder.Eval(row.DataItem, strBindStrSubs[i], strBindStrFomats[i]).ToString(); } } else { lblTemp.Text = "绑定项的个数与设置绑定项格式的字段个数不同"; } } string strTempToolTip = lblTemp.ToolTip.Trim(); if ((!String.IsNullOrEmpty(strTempToolTip)) && strTempToolTip.Contains(strSeparator)) { lblTemp.ToolTip = ""; string strBindStr = strTempToolTip.Substring(0, strTempToolTip.LastIndexOf(strSeparator)); string strBindStrFomat = strTempToolTip.Substring(strTempToolTip.LastIndexOf(strSeparator) + 1, strTempToolTip.Length - strTempToolTip.LastIndexOf(strSeparator) - 1); string[] strBindStrSubs = strBindStr.Split(strSeparatorItem); string[] strBindStrFomats = strBindStrFomat.Split(strSeparatorItem); if (strBindStrSubs.Length == strBindStrFomats.Length) { for (int i = 0; i < strBindStrSubs.Length; i++) { lblTemp.ToolTip += DataBinder.Eval(row.DataItem, strBindStrSubs[i], strBindStrFomats[i]).ToString(); } } else { lblTemp.ToolTip = "绑定项的个数与设置绑定项格式的字段个数不同"; } } } #endregion
#region TextBox private void AddTextBox(Control container, Control control) { TextBox txtTemp = new TextBox(); txtTemp.ID = control.ID; txtTemp.Text = ((TextBox)control).Text; txtTemp.Columns = ((TextBox)control).Columns; txtTemp.TextMode = ((TextBox)control).TextMode; txtTemp.Rows = ((TextBox)control).Rows; txtTemp.ReadOnly = ((TextBox)control).ReadOnly; txtTemp.MaxLength = ((TextBox)control).MaxLength; txtTemp.Enabled = ((TextBox)control).Enabled; txtTemp.Visible = ((TextBox)control).Visible; txtTemp.AutoPostBack = ((TextBox)control).AutoPostBack; txtTemp.ApplyStyleSheetSkin(((TextBox)control).Page); txtTemp.ControlStyle.CopyFrom(((TextBox)control).ControlStyle); txtTemp.CopyBaseAttributes((TextBox)control); txtTemp.DataBinding += new EventHandler(TextBox_DataBinding); container.Controls.Add(txtTemp); } private void TextBox_DataBinding(object sender, EventArgs e) { TextBox txtTemp = (TextBox)sender; GridViewRow row = (GridViewRow)txtTemp.NamingContainer; if ((!String.IsNullOrEmpty(txtTemp.Text.Trim())) && txtTemp.Text.Trim().Contains(strSeparator)) { txtTemp.Text = ""; string strBindStr = txtTemp.Text.Substring(0, txtTemp.Text.LastIndexOf(strSeparator)); string strBindStrFomat = txtTemp.Text.Substring(txtTemp.Text.LastIndexOf(strSeparator) + 1, txtTemp.Text.Length - txtTemp.Text.LastIndexOf(strSeparator) - 1); string[] strBindStrSubs = strBindStr.Split(strSeparatorItem); string[] strBindStrFomats = strBindStrFomat.Split(strSeparatorItem); if (strBindStrSubs.Length == strBindStrFomats.Length) { for (int i = 0; i < strBindStrSubs.Length; i++) { txtTemp.Text += DataBinder.Eval(row.DataItem, strBindStrSubs[i], strBindStrFomats[i]).ToString(); } } else { txtTemp.Text = "绑定项的个数与设置绑定项格式的字段个数不同"; } } } #endregion
#region DropDownList private void AddDropDownList(Control container, Control control) { DropDownList ddlTemp = new DropDownList(); ddlTemp.ID = control.ID; foreach (ListItem item in ((DropDownList)control).Items) { ddlTemp.Items.Add(item); } ddlTemp.Visible = ((DropDownList)control).Visible; ddlTemp.AutoPostBack = ((DropDownList)control).AutoPostBack; ddlTemp.ApplyStyleSheetSkin(((DropDownList)control).Page); ddlTemp.ControlStyle.CopyFrom(((DropDownList)control).ControlStyle); ddlTemp.CopyBaseAttributes((DropDownList)control); container.Controls.Add(ddlTemp); } #endregion
#region Button private void AddButton(Control container, Control control) { Button btnTemp = new Button(); btnTemp.ID = control.ID; btnTemp.Text = ((Button)control).Text; btnTemp.Enabled = ((Button)control).Enabled; btnTemp.ApplyStyleSheetSkin(((Button)control).Page); btnTemp.ControlStyle.CopyFrom(((Button)control).ControlStyle); btnTemp.CopyBaseAttributes((Button)control); btnTemp.DataBinding += new EventHandler(Button_DataBinding); container.Controls.Add(btnTemp); } private void Button_DataBinding(object sender, EventArgs e) { Button btnTemp = (Button)sender; GridViewRow row = (GridViewRow)btnTemp.NamingContainer; if ((!String.IsNullOrEmpty(btnTemp.Text.Trim())) && btnTemp.Text.Trim().Contains(strSeparator)) { btnTemp.Text = ""; string strBindStr = btnTemp.Text.Substring(0, btnTemp.Text.LastIndexOf(strSeparator)); string strBindStrFomat = btnTemp.Text.Substring(btnTemp.Text.LastIndexOf(strSeparator) + 1, btnTemp.Text.Length - btnTemp.Text.LastIndexOf(strSeparator) - 1); string[] strBindStrSubs = strBindStr.Split(strSeparatorItem); string[] strBindStrFomats = strBindStrFomat.Split(strSeparatorItem); if (strBindStrSubs.Length == strBindStrFomats.Length) { for (int i = 0; i < strBindStrSubs.Length; i++) { btnTemp.Text += DataBinder.Eval(row.DataItem, strBindStrSubs[i], strBindStrFomats[i]).ToString(); } } else { btnTemp.Text = "绑定项的个数与设置绑定项格式的字段个数不同"; } } } #endregion }
前台添加方法:
protected override void OnInit(EventArgs e) { TemplateField operationId = new TemplateField(); operationId .ItemStyle.HorizontalAlign = HorizontalAlign.Right; operationId .ItemStyle.Width = 100; Label lblId = new Label(); lblId.ID = "lblId"; lblId.Text = "Id^{0}"; List<Control> idControlList = new List<Control>(); idControlList.Add(lblId); operationId.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "合计"); operationId.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, idControlList ); gridView.Columns.Add(operationId ); }
绑定事件
protected void GridView_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { for (int k = 0; k < itable; k++) { TextBox txtTest= (TextBox)e.Row.FindControl("txtTest"); txtTest.TextChanged += new EventHandler(txtTest_TextChanged); } } } protected void txtTest_TextChanged(object sender, EventArgs e) { }
实现了从外部传入一个控件,利用传入控件的属性值传入绑定字段参数,支持一列添加多个控件,一个控件绑定多个字段。
里面一个委托方法本来打算从外部传入绑定事件,但是没有实现,所以,有些多余。
还有就是用到了反射、字符串处理等,效率不高。
给控件绑定事件需要写在RowCreated里。
相关文章推荐
- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据
- GridView动态添加模板列(并为其添加事件和自动绑定数据)
- 地磅称量系统之(37~39) 直接向数据库的数据表WtBill添加测试数据以及绑定用户控件和使用编码的方式控制dataGridView控件的每列属性和添加数据数据库的表中不存在的字段(非绑定列)
- GridView动态添加模板列并自动绑定数据
- GridView动态添加模板列(数据绑定)
- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据
- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据
- 我的ASPxGridView控件的数据是在后台绑定的,但是实现不了筛选和分页的功能,只能显示一页的数据?
- 动态添加GRIDVIEW内容 和数据绑定
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- GridView动态添加列并判断绑定数据DataTable的列类型控制展示内容
- GridView动态添加模板列,并解决数据列PostBack后数据丢失问题!
- GridView 动态添加绑定列和模板列
- 在aspx页动态加载ascx页面内容,给GridView控件绑定数据
- wpf GridView 动态添加 GridViewColumn 及绑定控件
- GridView 动态添加绑定列和模板列
- 利用GridView控件实现数据添加
- 将 TemplateField 字段列动态添加到 GridView 控件
- Silverlight动态添加数据模板(以RadGridView为例子)
- 简单高级搜索页面的简单实现,包括数据控件循环嵌套,DataTable动态生成数据添加等