venerdì 9 settembre 2011

How To: Add Template column via Code

Ecco una cosa che generalmente si cerca di fare ma che difficilmente risulta semplice.

Ossia aggiungere una column Template via codice. Per far questo è necessario comprendere che cosa è effettivamete una template column.

Nulla di più nulla di meno che un contenitore il nocciolo di questo contenitore è l'interfaccia ITemplate che espone il metodo:

InstantiateIn che come paraemtro espone il control container.


Quest'esempietto mostra come realizzare una Colonna (con Header e Item ) contenente un immagine.

public class ImageColumnTemplate : ITemplate
{
#region Private
private DataControlRowType templateType;
private string _columnName;

private string _alternateText;


public ImageColumnTemplate(DataControlRowType type,
string columnName)
{
templateType = type;
_columnName = columnName;
_alternateText = " ";
}

public ImageColumnTemplate(DataControlRowType type,
string columnName, string altrenate)
{
templateType = type;
_columnName = columnName;
_alternateText = altrenate;
}


public void InstantiateIn(System.Web.UI.Control container)
{

switch (templateType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = "<a href=\"#\">" + _columnName + "</a>";

container.Controls.Add(lc);
break;

case DataControlRowType.DataRow:

Image im = new Image();

im.DataBinding += new EventHandler(im_DataBinding);
container.Controls.Add(im);

im.AlternateText = _alternateText;
break;

default:

break;
}
}


public void im_DataBinding(object sender, EventArgs e)
{
Image l = (Image)sender;

GridViewRow row = (GridViewRow)l.NamingContainer;

if (DataBinder.Eval(
row.DataItem, _columnName).ToString().ToLower() == "true")
{
l.ImageUrl = "/Styles/commons/green.png";
}
else
{
l.ImageUrl = "/Styles/commons/red.png";
}
}
}


E questo è come aggiungere la colonna all grid view

TemplateField tcf = new TemplateField();

tcf.ItemTemplate = new ImageColumnTemplate(
DataControlRowType.DataRow,
NomeCampoBinding);

tcf.HeaderTemplate = new ImageColumnTemplate(
DataControlRowType.Header, "Stato");

gvwDataGrid.Columns.Add(tcf);

Nessun commento: