Blog Stats
  • Posts - 7
  • Articles - 0
  • Comments - 319
  • Trackbacks - 5

 

martedì 24 aprile 2007

ImageButton e LinkButton nel Datagrid

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.

 

 

Copyright © Sara Fabris