Come si può inserire nel codice di un progetto Asp.net un'ImageButton oppure un linkButton in un Datagrid??
Nei forum si trovano notizie frammentate e quindi ho deciso di raccogliere tutte qui in questo post.
Vediamo come creare intanto un ImageButton:
public class ImageButtonColumn : TemplateColumn
{
private ImageButtonItem imgItem;
public event ImageClickEventHandler Click
{
add
{
imgItem.Click += value;
}
remove
{
imgItem.Click -= value;
}}
public bool AutoPostBack
{
set
{
imgItem.AutoPostBack = value;
}
get
{
return imgItem.AutoPostBack;
}}
public ImageButtonColumn()
{
imgItem = new ImageButtonItem(false);
imgItem.AutoPostBack = false;
this.ItemTemplate = imgItem as ITemplate;
}}
internal class ImageButtonItem : ITemplate
{
private bool readOnly = true;
public event ImageClickEventHandler Click;
public ImageButtonItem(bool editable)
{
readOnly = (editable==true)?false:true;
}
void ITemplate.InstantiateIn(Control container)
{
ImageButton ib = new ImageButton();
ib.ImageUrl = "info.gif";
//Immagine da Associare al Controllo
ib.Click += new ImageClickEventHandler(this.OnClick);
container.Controls.Add(ib);
}
private void OnClick(object sender, ImageClickEventArgs e)
{
Click(sender, e);
}
private bool autoPostBack=false;
public bool AutoPostBack
{
set
{
autoPostBack = value;
}
get
{
return autoPostBack;
}}}
e ora vediamo la definizione della classe LinkButton:
internal class LinkButtonItem: ITemplate
{
private bool readOnly = true;
public event EventHandler Click;
public LinkButtonItem(bool editable) {
readOnly = (editable==true)?false:true;
}
void ITemplate.InstantiateIn(Control container) {
LinkButton lb = new LinkButton();
lb.DataBinding += new EventHandler(this.BindLabelColumn);
lb.Click += new EventHandler(this.OnClick);
container.Controls.Add(lb);
}
public void BindLabelColumn(object sender, EventArgs e) {
LinkButton lb = (LinkButton)sender;
DataGridItem container =(DataGridItem)lb.NamingContainer;
lb.Text = Convert.ToString(System.Web.UI.DataBinder.Eval(container, "DataItem.ID"));
//CAMPO ASSOCIATO AL DATAGRID - ESTRAZIONE DEL CAMPO ID
}
private void OnClick(object sender, EventArgs e) {
Click(sender, e);
}
private bool autoPostBack=true;
public bool AutoPostBack {
set
{
autoPostBack = value;
}
get
{
return autoPostBack;
} } }
public class LinkButtonColumn : TemplateColumn
{
private LinkButtonItem imgItem;
public string idRecord;
public event EventHandler Click {
add {
imgItem.Click += value;
}
remove {
imgItem.Click -= value;
} }
public bool AutoPostBack {
set
{
imgItem.AutoPostBack = value;
}
get
{
return imgItem.AutoPostBack;
} }
public LinkButtonColumn()
{
imgItem = new LinkButtonItem(false);
imgItem.AutoPostBack = false;
this.ItemTemplate = imgItem as ITemplate;
}
}
ora prima di eseguire il Bind del Datagrid sarà necessario l'ImageButton o il LinkButton
//Supponiamo che il nostro DataTable si componga di più colonne. La colonna "ID" però la visualizzo
//come campo LinkButton e la colonna "Colore" la visualizzo come ImageButton
foreach (DataColumn dc in dt.Columns) {
if (dc.ColumnName.ToLower() == "id") {
LinkButtonColumn linkcol = new LinkButtonColumn(); // LINKBUTTON NELLA COLONNA ID
linkcol .HeaderText= dc.ColumnName;
linkcol .Click +=new EventHandler(linkcol_Click); //ASSOCIO L'EVENTO CLICK
MyDataGrid.Columns.Add(linkcol);
}
else if (dc.ColumnName.ToLower() == "colore") {
ImageButtonColumn imgcol = new ImageButtonColumn(); //IMAGEBUTTON NELLA COLONNA COLORE
imgcol.HeaderText= dc.ColumnName;
imgcol.Click +=new EventHandler(imgcol_Click); //ASSOCIO L'EVENTO CLICK
MyDataGrid.Columns.Add(imgcol);
}
else {
BoundColumn b=new BoundColumn();
b.DataField=dc.ColumnName;
b.DataFormatString="{0}";
b.HeaderText=dc.ColumnName;
MyDataGrid.Columns.Add(b);
} }
MyDataGrid.DataSource = dt;
MyDataGrid.DataBind();
//I DUE EVENTI SARANNO DEFINITI COME SEGUE:
private void imgcol_Click(object sender, ImageClickEventArgs e) {
//CODICE
}
private void linkcol_Click(object sender, EventArgs e) {
LinkButton lbtn = (LinkButton)sender;
DataGridItem dgi = (DataGridItem)lbtn.NamingContainer; //estraggo la colonna del datagrid
//....
}
Ciao a tutti e spero possa essere d'aiuto il post.