何动态生成GridView的模版列

来源:互联网 发布:百度开发的软件 编辑:程序博客网 时间:2024/05/12 07:11

何动态生成GridView的模版列收藏
何动态生成GridView的模版列TemplateField,并在模版列TemplateField中添加复选框CheckBox

首先,第一步,创建一个类MyTemplate.cs

public class MyTemplate:ITemplate
...{
    private string strColumnName;
    private DataControlRowType dcrtColumnType;

    public MyTemplate()
    ...{
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    /**//// <summary>
    /// 动态添加模版列
    /// </summary>
    /// <param name="strColumnName">列名</param>
    /// <param name="dcrtColumnType">列的类型</param>
    public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
    ...{
        this.strColumnName = strColumnName;
        this.dcrtColumnType = dcrtColumnType;
    }

    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: //模版列内容——加载CheckBox
                CheckBox cb = new CheckBox();
                cb.ID = "CheckBox1";
                cb.Checked = false;
                ctlContainer.Controls.Add(cb);
                break;
        }
    }

}
第二步,在绑定GridView方法中,生成模版列

/**//// <summary>
    /// 绑定生成GridView
    /// </summary>
    /// <param name="gdv">要绑定的GridView</param>
    /// <param name="dtblDataSource">GridView的数据源</param>
    /// <param name="strDataKey">GridView的DataKeyNames</param>
    public static void GridViewBind(GridView gdv, DataTable dtblDataSource, string strDataKey)
    ...{
        gdv.Columns.Clear();

        gdv.AutoGenerateColumns = false;
        gdv.DataSource = dtblDataSource;
        gdv.DataKeyNames = new string[] ...{ strDataKey };

        TemplateField tfColumn = new TemplateField();
        tfColumn.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
        gdv.Columns.Add(tfColumn);

       //………………

        gdv.DataBind();
    }
这样模版列也可以动态生成啦!

==============================================================================================

动态添加绑定列很简单:例如:

GridView1.DataSourceID = "SqlDataSource1";

        BoundField bf1 = new BoundField();
        BoundField bf2 = new BoundField();
        BoundField bf3 = new BoundField();

        bf1.HeaderText = "Employee ID";
        bf1.DataField = "EmployeeID";
        bf1.ReadOnly = true;
        bf1.SortExpression = "EmployeeID";
        bf2.HeaderText = "First Name";
        bf2.DataField = "FirstName";
        bf2.SortExpression = "FirstName";

        bf3.HeaderText = "Last Name";
        bf3.DataField = "LastName";
        bf3.SortExpression = "LastName";

        CommandField cf = new CommandField();
        cf.ButtonType = ButtonType.Button;
        cf.ShowCancelButton = true;
        cf.ShowEditButton = true;

        GridView1.Columns.Add(bf1);
        GridView1.Columns.Add(bf2);
        GridView1.Columns.Add(bf3);
        GridView1.Columns.Add(cf);
动态绑定模板列稍微复杂:

首先创建一个类,该类时继承了System.Web.UI.ITemplate

public class MyTemplate:System.Web.UI.ITemplate
{
    private string proName;
    public MyTemplate()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    public string ProName//要绑定的数据源字段名称
    {
        set { proName = value; }
        get { return proName; }
    }

    public void InstantiateIn(Control container)//关键实现这个方法
    {
        TextBox hi = new TextBox();
        hi.Text = "";
        hi.DataBinding += new EventHandler(hi_DataBinding);//创建数据绑定事件
        container.Controls.Add(hi);
    }

    void hi_DataBinding(object sender, EventArgs e)
    {
        TextBox hi = (TextBox)sender;
        GridViewRow container = (GridViewRow)hi.NamingContainer;
        //关键位置
        //使用DataBinder.Eval绑定数据
        //ProName,MyTemplate的属性.在创建MyTemplate实例时,为此属性赋值(数据源字段)
        hi.Attributes.Add("onclick", "alert('" + DataBinder.Eval(container.DataItem, ProName).ToString() + "');");
   
}
上面时创建了一个textbox的模板,

页面使用时

2.*.aspx页面后台cs代码

            DataSet ds = null;
            BLL.model_task bll = new BLL.model_task();
            ds = bll.GetList(string.Empty);

            TemplateField tf = new TemplateField();
            tf.HeaderText = "自定义模板列";
            MyTemplate mt = new MyTemplate();
            mt.ProName = "ID";//数据源字段
            tf.ItemTemplate = mt;
            this.GridView1.Columns.Add(tf);
            this.GridView1.DataSource = ds;
            this.GridView1.DataBind();
这样就会添加了一个textbox的模板列;

==============================================================================================

动态添加列,关键是实现 ITemplate.InstantiateIn 方法。下面是一个添加 GridView 模板列的例子。
  
  <%@ Page Language=/"C#/" %>
  <%@ Import Namespace=/"System.Data/" %>
  <!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/"
   /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">
  
  <script runat=/"server/">
   ICollection CreateDataSource()
   {
   DataTable dt = new DataTable();
   DataRow dr;
   dt.Columns.Add(new DataColumn(/"id/", typeof(Int32)));
   dt.Columns.Add(new DataColumn(/"text/", typeof(string)));
   for (int i = 0; i < 6; i++)
   {
   dr = dt.NewRow();
   dr[0] = i;
   dr[1] = /"列表项目 /" + i.ToString();
   dt.Rows.Add(dr);
   }
   DataView dv = new DataView(dt);
   return dv;
   }
  
   public class GridViewTemplate : ITemplate
   {
   private DataControlRowType templateType;
   private string columnName;
  
   public GridViewTemplate( DataControlRowType type, string colname )
   {
   templateType = type;
   columnName = colname;
   }
  
   public void InstantiateIn( System.Web.UI.Control container )
   {
   switch (templateType)
   {
   case DataControlRowType.Header:
   Literal lc = new Literal();
   lc.Text = columnName;
   container.Controls.Add(lc);
   break;
   case DataControlRowType.DataRow:
   DropDownList drr = new DropDownList();
   drr.ID = /"dropdown/";
   drr.AppendDataBoundItems = true;
   drr.Items.Add(new ListItem(/"-----请选择------/",/"/"));
   drr.Items.Add(new ListItem(/"AA/", /"a/"));
   drr.Items.Add(new ListItem(/"BB/", /"b/"));
   drr.Items.Add(new ListItem(/"CC/", /"c/"));
   container.Controls.Add(drr);
   break;
   default:
   break;
   }
   }
   }
  
   protected void Page_Load(object sender, EventArgs e)
   {
   if (!IsPostBack)
   {
   TemplateField customField = new TemplateField();
   customField.ShowHeader = true;
   customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, /"动态添加列/");
   customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, /"/");
   GridView1.Columns.Add(customField);
   GridView1.DataSource = CreateDataSource();
   GridView1.DataBind();
   }
   }
  
   protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
   {
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
   //可以在这里访问数据库的其它字段的值,可以设置默认选择项,具体应用,看自己的发挥了。
   //下面只是例子,举一反三,不再费话了
   DataRowView gv = (DataRowView)e.Row.DataItem;
   int itemSeleted = Int32.Parse(gv.Row[/"id/"].ToString()) > 3 ? 0 : Int32.Parse(gv.Row[/"id/"].ToString());
   DropDownList dr = (DropDownList)e.Row.FindControl(/"dropdown/");
   dr.SelectedIndex = itemSeleted;
   }
   }
  </script>
  
  <html xmlns=/"http://www.w3.org/1999/xhtml/">
  <head id=/"Head1/" runat=/"server/">
   <title>GridView动态添加模板列的例子</title>
  </head>
  <body>
  <form id=/"form1/" runat=/"server/">
   <asp:GridView ID=/"GridView1/" runat=/"server/" AutoGenerateColumns=/"False/"
   OnRowDataBound=/"GridView1_RowDataBound/">
   <Columns>
   <asp:BoundField HeaderText=/"标题/" DataField=/"text/"/>
   </Columns>
   </asp:GridView>
  </form>
  </body>
  </html>

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ljsql/archive/2008/11/27/3389604.aspx

原创粉丝点击