TemplateColumn aa = new TemplateColumn();
aDatagrid.Columns.AddAt(2, aa);
我知道这样可以添加模板列,现在的问题是如何将我需要的控件放入模板列的ItemTemplate和EditItemTemplate??
恳请高手解决。

解决方案 »

  1.   

    需要对每个模版创建一个实现ITemplate接口的类来达到为模版列添加控件的目的。
    这个模版列包含一个Textbox
    Private Class TxtColumn
            Implements ITemplate        Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
                Dim txt As New TextBox
                txt.Text = "test"
                container.Controls.Add(txt)
            End Sub
    End Class然后这样添加到Datagrid,ItemTemplate,EditTemplate都类似:
                Dim col As New TemplateColumn
                col.ItemTemplate = New TxtColumn
                col.HeaderText = "header"            Me.DataGrid1.Columns.Add(col)            Me.DataGrid1.DataSource = ds
                Me.DataGrid1.DataBind()
    需要说明的是,ASP.NET对于动态创建的控件,不负责维护其状态,也就是说动态创建Textbox,客户端用户输入值,点击一个按钮,页面回传,此时,如果不写代码来获取这个值并加以保存,则下次传回客户端时,这个值将不会被自动保存了,而通过工具箱放到页面上的控件都能自动保存输入。这个是要特别注意的!!!特别是你这种模版列里有控件的情况,取值比较麻烦,呵呵。
      

  2.   

    aa.ItemTemplate.Instantiatein(containner)
      

  3.   

    http://blog.csdn.net/goody9807/articles/198717.aspx
      

  4.   

    private void AddBoundColumnToGrid(string strHeaderText,bool bWrap,int iHeaderWidth,string strDataField,bool bVisible,int iColumnIndex,DataGrid objGrid)
    {
    BoundColumn dc = new BoundColumn();
    dc.HeaderText = strHeaderText;
    dc.HeaderStyle.Wrap = bWrap;
    dc.HeaderStyle.Width = Unit.Parse(iHeaderWidth.ToString() + "%");
    dc.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
    dc.HeaderStyle.VerticalAlign = VerticalAlign.Middle;
    dc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
    dc.ItemStyle.VerticalAlign = VerticalAlign.Middle;
    dc.DataField = strDataField;
    dc.Visible = bVisible;
    dc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
    objGrid.Columns.AddAt(iColumnIndex,dc);
    } /// <summary>
    /// 加入模板列
    /// add by zw
    /// </summary>
    /// <param name="objGrid"></param>
    private void AddTemplateColumnToGrid(DataGrid objGrid,int iColumnIndex,
    string headtype,string headid,string headinfo,
    string itemtype,string itemid,string iteminfo)
    {
    TemplateColumn tc = new TemplateColumn();
    tc.HeaderTemplate = new DataGridTemplates.CTemplateColumn(headtype,headid,true,headinfo);
    tc.ItemTemplate = new DataGridTemplates.CTemplateColumn(itemtype,itemid,false,iteminfo);
    tc.HeaderStyle.Width = Unit.Parse("10%");
    tc.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
    tc.HeaderStyle.VerticalAlign = VerticalAlign.Middle;
    tc.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
    tc.ItemStyle.VerticalAlign = VerticalAlign.Middle;
    objGrid.Columns.AddAt(iColumnIndex,tc); }
      

  5.   

    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;namespace DataGridTemplates
    { public class CTemplateColumn:ITemplate
    { private string ControlType;
    private string ControlID;
    private bool IsHeadColumn;
    private string HeadText; System.Web.UI.Control control; public CTemplateColumn(string type, string id, bool headColumn, string headText)
    { ControlType=type;
    ControlID = id;
    IsHeadColumn = headColumn;
    HeadText = headText; } //为了使用接口必须实现的方法
    public void InstantiateIn(Control container)       
    { switch(ControlType)
    {
    case "checkbox":
    CheckBox chk = new CheckBox();
    if(IsHeadColumn)
    chk.Text = HeadText;
    control = chk;
    break;
    case "linkbutton":
    LinkButton linkbtn = new LinkButton();
    linkbtn.Text = HeadText;
    control = linkbtn;
    break;
    case "button":
    Button btn = new Button();
    if(IsHeadColumn)
    btn.Text = HeadText;
    control = btn;
    break;
    case "litercontrol":
    LiteralControl literalcontrol = new LiteralControl();
    if(IsHeadColumn)
    literalcontrol.Text = HeadText;
    control = literalcontrol;
    break;
    case "dropdownlist":
    DropDownList downlist = new DropDownList();
    control = downlist;
    break;
    case "label":
    Label lbl = new Label();
    lbl.Text = HeadText;
    control = lbl;
    break;
    default:
    Label defaultcontrol = new Label();
    defaultcontrol.Text = HeadText;
    control = defaultcontrol;
    break; }

    control.DataBinding += new EventHandler(this.OnDataBinding); control.ID = ControlID;
    container.Controls.Add(control); } public void OnDataBinding(object sender, EventArgs e)
    { //DataGridItem container = (DataGridItem) l.NamingContainer;
    //((DataRowView)container.DataItem)[colname].ToString(); } }}
      

  6.   

    现在的新问题是,动态增加的模板列中的控件如何将值绑定上去?可以以Label为例来说明。哪位大虾帮忙解决一下?
      

  7.   

    给你个例子吧:
    http://218.84.107.5/g.aspx
      

  8.   

    大家好!我想问一下,DataGrid动态添加DropDownList之后,怎样到得DropDownList 的值?