// C#
public class DataGridTemplate : ITemplate
{
   ListItemType templateType;
   string columnName;
   
   public DataGridTemplate(ListItemType type, string colname)
   {
      templateType = type;
      columnName = colname;
   }   public void InstantiateIn(System.Web.UI.Control container)
   {
      Literal lc = new Literal();
      switch(templateType)
      {
         case ListItemType.Header:
            lc.Text = "<B>" + columnName + "</B>";
            container.Controls.Add(lc);
            break;
         case ListItemType.Item:
            lc.Text = "Item " + columnName;
            container.Controls.Add(lc);
            break;
         case ListItemType.EditItem:
            TextBox tb = new TextBox();
            tb.Text = "";
            container.Controls.Add(tb);
            break;
         case ListItemType.Footer:
            lc.Text = "<I>" + columnName + "</I>";
            container.Controls.Add(lc);
            break;
      }
   }
}
see:
Creating Templates Programmatically in the DataGrid Control
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskcreatingtemplatesprogrammaticallyindatagridcontrol.asp

解决方案 »

  1.   

    固定的模版列:属性生成器动态填加:TemplateColumn tmp = new TemplateColumn();
    LinkButton lb = new LinkButton();
    tmp.ItemTemplate.InstantiateIn(lb);
    DataGrid1.Columns.Add(tmp);
      

  2.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=175C1EA1-A261-45D3-B5AC-94F6CACCDDEF
      

  3.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.OleDb;
    using System.Configuration;
    namespace csdn
    {
    /// <summary>
    ///在代码里动态创建DataGrid,含链接列,绑定列,按钮列,模板列
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataGrid DataGrid1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    DataGrid1.BorderColor =Color.Red;
                  DataGrid1.BorderWidth =1;
    TemplateColumn Template = new TemplateColumn();//创建模板列
    Template.ItemTemplate=new ColumnTemplate("class_1","id");
    DataGrid1.Columns.Add(Template);
    Template.HeaderText="一级分类";
    Template.HeaderStyle.BackColor = ColorTranslator.FromHtml("#FFF778");
    //DataGrid1.Columns.Add(Template); 
    BoundColumn id=new BoundColumn(); //创建绑定列
    id.HeaderText="编号";
    id.DataField="id";
    id.SortExpression="id";
    DataGrid1.Columns.Add(id);
    HyperLinkColumn linkB=new HyperLinkColumn();//创建超级链接列
    linkB.HeaderText="class_1";
                linkB.DataTextField="class_1";
    linkB.DataNavigateUrlField="id";
    linkB.DataNavigateUrlFormatString="a.aspx?id={0}";
                DataGrid1.Columns.Add(linkB);
    EditCommandColumn Edit=new EditCommandColumn();//创建按钮列
    Edit.ButtonType=ButtonColumnType.PushButton;//为按钮指定类型
    Edit.UpdateText="更新";
    Edit.CancelText="取消";
    Edit.EditText="编辑";
    DataGrid1.Columns.Add(Edit);
    string ConnString=ConfigurationSettings.AppSettings["ConnString"];
    OleDbConnection Conn=new OleDbConnection(ConnString);
    OleDbDataAdapter adapter=new OleDbDataAdapter("select * from shopone",Conn);
    DataSet ds=new DataSet();
    adapter.Fill(ds,"shop");
    DataGrid1.DataSource=ds.Tables["shop"].DefaultView;
    DataBind();
    }
    ///  ColumnTemplate 从ITemplate继承。
    ///  "InstantiateIn"定义子控件的属于谁 public class ColumnTemplate : ITemplate
    {
    private string classname;
    private string hid;
    public  ColumnTemplate(string class_1,string id)
    {
    classname=class_1;
    hid=id; } public void InstantiateIn(Control container)
    {
    LiteralControl l=new LiteralControl();
    l.DataBinding+=new EventHandler(this.OnDataBinding);
    container.Controls.Add(l);
    }
    public void OnDataBinding(object sender,EventArgs e)
    {
    LiteralControl l=(LiteralControl) sender;
    DataGridItem  container1=(DataGridItem) l.NamingContainer;
    l.Text="<a href='lx.aspx?id="+((DataRowView) container1.DataItem)[hid].ToString()+"&classname="+((DataRowView) container1.DataItem)[classname].ToString()+"'>"+((DataRowView) container1.DataItem)[classname].ToString()+"</a>";;
    } }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
      

  4.   

    Public Class c_CreateTemplateColumn
        Implements ITemplate
        Dim templateType As ListItemType
        Dim columnName As String
        Dim F_Name As String
        Dim Txt_Width, Txt_Height As Integer    Sub New(ByVal type As ListItemType, ByVal ColName As String)
            templateType = type
            columnName = ColName
        End Sub    Sub New(ByVal FName As String, ByVal type As ListItemType)
            templateType = type
            F_Name = FName
            Txt_Width = 120
            Txt_Height = 24
        End Sub    Sub New(ByVal FName As String, ByVal type As ListItemType, ByVal TWidth As Integer, ByVal THeight As Integer)
            templateType = type
            F_Name = FName
            Txt_Width = TWidth
            Txt_Height = THeight
        End Sub    Sub New(ByVal type As ListItemType)
            templateType = type
        End Sub    Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
            Dim HeaderLable As New Label
            Dim EditText As New TextBox
            Select Case templateType
                Case ListItemType.Header
                    HeaderLable.Text = columnName
                    container.Controls.Add(HeaderLable)
                Case ListItemType.Item
                    AddHandler HeaderLable.DataBinding, AddressOf Lable_DataBinding
                    container.Controls.Add(HeaderLable)
                Case ListItemType.EditItem
                    AddHandler EditText.DataBinding, AddressOf TemplateControl_DataBinding
                    container.Controls.Add(EditText)
                Case ListItemType.Footer
                    HeaderLable.Text = "Footer"
                    container.Controls.Add(HeaderLable)
            End Select
        End Sub    Private Sub TemplateControl_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim EditText As TextBox
            EditText = CType(sender, TextBox)
            Dim container As DataGridItem
            container = CType(EditText.NamingContainer, DataGridItem)
            EditText.Width = Unit.Pixel(Txt_Width)
            EditText.Height = Unit.Pixel(Txt_Height)
            EditText.Text = DataBinder.Eval(container.DataItem, F_Name)
        End Sub    Private Sub Lable_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim HeaderLable As Label
            HeaderLable = CType(sender, Label)
            Dim container As DataGridItem
            container = CType(HeaderLable.NamingContainer, DataGridItem)
            HeaderLable.Text = DataBinder.Eval(container.DataItem, F_Name)
        End Sub
    End Class
    -----------------------------------------------------------------------
    调用
    Dim tc1 As New TemplateColumn
                tc1.HeaderTemplate = New c_CreateTemplateColumn(ListItemType.Header, ds.Tables(0).Columns(I).Caption)
                tc1.ItemTemplate = New c_CreateTemplateColumn(ds.Tables(0).Columns(I).Caption, ListItemType.Item)
                tc1.EditItemTemplate = New c_CreateTemplateColumn(ds.Tables(0).Columns(I).Caption, ListItemType.EditItem, 80, 20)
                DataGrid1.Columns.Add(tc1)
                tc1 = Nothing
      

  5.   

    另外一个思路:
    先将DATAGRID的模版列建好,但设置该列的VISIBLE=FALSE,
    在要显示该模版列时,再设置VISIBLE=TRUE.