Hoje ajudei uma pessoa que precisava ter um GridView criado de forma dinâmica. É uma tarefa simples, no entanto o problema estava em inserir um controle DropDownlist dentro do TemplateField.
O que facilitou foi utilizar uma classe que herda de ITemplate:
public class GridViewTemplate : ITemplate
{
}
No aspx foi inserido apenas um button que faz a carga do gridview:
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnCarregar" runat="server"
onclick="btnCarregar_Click" Text="Carregar" />
<br />
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
</div>
</form>
</body>
A idéia foi mostrar um GridView com informações sobre cursos: Código do Curso, Nome do curso e O status (concluído, em andamento ou encerrado).
Para isto comecei criando duas classes (Status e Curso):
public class Status
{
public int CODIGO { get; set; }
public string DESC { get; set; }
public static List<Status> GetStatus()
{
List<Status> lista = new List<Status>();
lista.Add(new Status() { CODIGO = 1, DESC = "Concluído" });
lista.Add(new Status() { CODIGO = 2, DESC = "Em andamento" });
lista.Add(new Status() { CODIGO = 3, DESC = "Encerrado" });
return lista;
}
}
public class Curso
{
public int CODIGO { get; set; }
public string DESC { get; set; }
public static List<Curso> GetCursos()
{
List<Curso> lista = new List<Curso>();
lista.Add(new Curso() { CODIGO = 1, DESC = "Contabilidade" });
lista.Add(new Curso() { CODIGO = 2, DESC = "Informática" });
lista.Add(new Curso() { CODIGO = 3, DESC = "Letras" });
return lista;
}
}
Em seguida realizar a carga gridview:
void BindGrid()
{
GridView grv = new GridView();
grv.AutoGenerateColumns = false;
grv.ID = "grvExemplo";
BoundField columnCodigo = new BoundField();
columnCodigo.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
columnCodigo.HeaderText = "Codigo";
columnCodigo.DataField = "CODIGO";
grv.Columns.Add(columnCodigo);
BoundField columnCurso = new BoundField();
columnCurso.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
columnCurso.HeaderText = "Curso";
columnCurso.DataField = "DESC";
grv.Columns.Add(columnCurso);
TemplateField templateEmail = new TemplateField();
templateEmail.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "");
templateEmail.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "");
grv.Columns.Add(templateEmail);
List<Curso> cursos = Curso.GetCursos();
grv.DataSource = cursos;
grv.DataBind();
Panel1.Controls.Add(grv);
}
O controle DropDownlist foi criado no evento InstantiateIn da classe GridViewTemplate:
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)
{
if (templateType == DataControlRowType.DataRow)
{
List<Status> status = Status.GetStatus();
DropDownList ddl = new DropDownList();
ddl.ID = "ddlStatus";
ddl.DataTextField = "DESC";
ddl.DataValueField = "CODIGO";
ddl.DataSource = status;
ddl.DataBind();
container.Controls.Add(ddl);
}
}
}
Resultado:

Referências:
ITemplate Interface
http://msdn.microsoft.com/en-us/library/system.web.ui.itemplate.aspx
Método ITemplate.InstantiateIn
http://msdn.microsoft.com/pt-br/library/system.web.ui.itemplate.instantiatein%28v=vs.90%29.aspx
Programmatically adding template field in ASP.NET GridView problem
http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/Q_23171849.html
Os tipos genéricos foram adicionados ao framework 2.0 e estão dentro do namespace System.Collections.Generic.











