esmaspäev, 21. september 2009

Delegaadil põhinev andmevahetus usercontrolite vahel

Tegelikult ei soovitata nii teha aga kui harva tuleb sellised asju ette siis hea lihtne meeles pidada.
Definitsioonide nimetused võivad siis postituses segamini olla.
Veebilehel on mitu usercontroli ja tahad, et näiteks kui GridView peal klikid seda Select nuppu siis tahad, et selle tulemusena mingil teisel usercontrolil midagi juhtuks.

Gridview Select nupu saab teha niimoodi

Usercontroli Code-behindis defineerib delegaadi ja eventi mille külge saavad teised controlid end külge pookida, kui asja peaks olema. UserControli nimi on näiteks OtsiKohamaara

public event ValitiKorter KorterValiti; //see event saadab välja ValitiKorter(int indeks) delegaati
public delegate void ValitiKorter(int indeks);


GridView SelectedIndexChanged SelectedIndexChanged event, mis hakkab seda delegaati välja saatma:

protected void GridViewKorterid_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewRow se = this.GridViewKorterid.SelectedRow;
if ( se != null)
{
if (KorterValiti != null) // kas on keegi ennast külge pannud, et sellele SelectedIndexChanged reageerida
{
KorterValiti(Convert.ToInt32(this.GridViewKorterid.SelectedDataKey.Value));
}
}
}


Kuida asja tarbida teise veebilehe peal, kõigepealt registreerime ennast delegaati vastu võtma.

protected void Page_Load(object sender, EventArgs e)
{
//OtsiKohamaara1 on nüüd see UserControl lehe peal mille Select nupu kliki tahame kinni püüda
//see tuleb iga kord PostBackist sõltumata, muidu unustab ära
this.OtsiKohamaara1.KorterValiti += new UserControl_OtsiKohamaara.ValitiKorter(OtsiKohamaara1_KorterValiti);
if (!IsPostBack)
{
}
}

ja meetod, mis selle delegaadiga tegelema hakkab.

// kui OtsiKohamaara korter valitakse, siis tuleb sealt delegaat
void OtsiKohamaara1_KorterValiti(int indeks)
{
//indeks on nüüd see int väärtus, mis usercontroli poolt teele saadetakse
// ja siin saab juba asju edasi teha
this.LiteralFlatId.Text = indeks.ToString();
}