GridView动态列绑定
动态绑定模板列的时候
需要在
需要再RowDataBind事件里面处理
1.因为在静态绑定中处理每一行的绑定都需要去实例化一个模板列itemplate,所以在动态绑定中具体的某一行绑定需要在ITemplate的InstantiateIn实现中去实例化一个控件,否则会出现只有最后一行记录出现该模板控件。
2.同时需要注意的问题:
a.skinid的绑定是需要在protected void Page_PreInit(Object sender, EventArgs e)
事件中去处理,所以不建议在动态列绑定的时候使用skinid,可以再相应的
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)里面去处理ImageUrl,或者相应的cssclass
示例代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.UI; using System.Web.UI.WebControls;
namespace Ths.DataCenter.Data.Common { public class GridViewTemplate : ITemplate { private string _innerContorlName; private bool _isImgBtn = false; private string _ImageUrl = "Images/ico/delete.gif"; private string _SkinID = "link_Delete"; public GridViewTemplate(string lbName, bool isImgBtn, string strSkinID) { _innerContorlName = lbName; _isImgBtn = isImgBtn; //_ImageUrl = ImageUrl; }
#region ITemplate 成员
public void InstantiateIn(Control container) {
if (!_isImgBtn) { Label lb = new Label(); lb.ID = _innerContorlName + "Lable"; lb.DataBinding += new EventHandler(lb_DataBinding); container.Controls.Add(lb); } else { //连接按钮 //<asp:ImageButton skinid="link_Delete" runat="server" ImageUrl="Images/ico/delete.gif"></asp:ImageButton> ImageButton ib = new ImageButton(); ib.ID = _innerContorlName + "ImageButton"; ib.ImageUrl = _ImageUrl; ib.SkinID = _SkinID; ib.DataBinding += new EventHandler(ib_DataBinding); container.Controls.Add(ib); } } void ib_DataBinding(object sender, EventArgs e) { ImageButton lbl = sender as ImageButton; GridViewRow gr = lbl.NamingContainer as GridViewRow; lbl.ToolTip = DataBinder.Eval(gr.DataItem, _innerContorlName).ToString(); // lbl. = DataBinder.Eval(gr.DataItem, _innerContorlName).ToString(); } void lb_DataBinding(object sender, EventArgs e) { Label lbl = sender as Label; GridViewRow gr = lbl.NamingContainer as GridViewRow; lbl.Text = DataBinder.Eval(gr.DataItem, _innerContorlName).ToString(); } #endregion } } |
调用如下:
private void SetHeaderVisable(GridView gridView) { gridView.Columns.Clear(); var selectFields = SelectColumns; BoundField bf = new BoundField(); bf.HeaderText = "序号"; bf.DataField = "ROW_NUMBER";//固定序号列 gridView.Columns.Add(bf); TemplateField tf = new TemplateField(); foreach (var obj in selectFields) { switch (obj.Value) { case "Longitude": //模板绑定 tf = new TemplateField(); tf.HeaderText = obj.Text; tf.HeaderStyle.Width = 40; tf.HeaderStyle.CssClass = "gd_center"; tf.ItemStyle.CssClass = "gd_center"; tf.ItemTemplate = new Ths.DataCenter.Data.Common.GridViewTemplate("Longitude", true, "link_GIS"); gridView.Columns.Add(tf); //绑定方式 break; default: bf = new BoundField(); bf.ItemStyle.HorizontalAlign = HorizontalAlign.Center; bf.HeaderText = obj.Text; bf.DataField = obj.Value; bf.SortExpression = obj.Value; gridView.Columns.Add(bf); break; } } } |
扩展知识点:
通过编程指定外观时,静态控件的SkinId属性只能在Page_PreInit事件之中或之前设置。动态创建的控件,应该在将该属性添加到控件集合之前设置。