Monday, April 7, 2008

GridView dugme u koloni i dodavanje JavaScript-a

Ako ste postavili kolonu koja ima polje tipa dugme (ButtonField) prostoji mala "kvaka" kako uzeti tekst iz nje?

Radi se o tome sto je u ovom slucaju tekst koji se prikazivao u polju zapravo ID zapisa u tabeli. Resenje je dodati u GridView EventHandler na RowCommand, uhvatiti id reda iz GridView-a, zatim prvu celiju (kolonu) i uzeti LinkButton kao prvu kontrolu u celiji i iz njega izvuci tekst.

private void GridView1_OnRowCommand(object sender, EventArgs e)
{
LinkButton btn = (LinkButton) GridView1.Row[Convert.ToInt32(e.CommandArgument)].Cells[0].Controls[0];
Obrisi(btn.Text);
}

Posto ova kolona sadrzi opciju za brisanje, morao sam da dodam i pitanje tipa "Da li zelite brisanje?". Definitivno treba izbeci bilo kakav PostBack makar se radilo i u ASP.Ajax-u. Dakle, treba dodati nekako JavaScript confirm prozor.
Za ovo resenje postoje dve opcije. Jedno je da se dodaje atribut u kontrolu LinkButton pri kreiranju svakog reda ili da se isto ovo dodaje, ali nakon DataBind() metode GridView-a.
Ja sam se odlucio za ovu drugu jer je laksa za implementaciju i ne dodajem nikakav novi event za GridView (neznatno se usporava "punjenje" tabele podacima).
Dakle, kod ide ovako:
...
// punjenje podacima
GridView1.DataSource = podaci.Citaj();
GridView1.DataBind();
DodajAtribut();
...

private void DodajAtribut()
{
foreach(GridViewRow red in GridView1.Rows)
{
LinkButton btn = red[0].Controls[0];
btn.Attribute.Add("onclick", "return confirm('Da li ste sigurni za brisanje?')");
}
}

Kao u prethodnom primeru, uzima se prva kontrola celije i kastuje se u LinkButton. Zatim se na njega dodaje JavaScript u svakom redu tabele sa confirm prozorom (OK i Cancel dugmad) za brisanje.

No comments: