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事件之中或之前设置。动态创建的控件,应该在将该属性添加到控件集合之前设置。

posted @ 2010-09-01 17:48  汤包  阅读(5370)  评论(0编辑  收藏  举报