I controlli iterativi, come DataGrid, DataList e Repeater, si rivelano quasi indispensabili nella visualizzazione di report.
A renderli così attraenti è il meccanismo basato su template per generare l'interfaccia utente.
Talvolta si rende necessario annidare tra loro più controlli iterativi e questi casi richiedono qualche attenzione in più, specialmente nella registrazione dei gestori d'evento.
Prendiamo il semplice caso di due Repeater annidati.
<asp:Repeater id="ParentRepeater" runat="server" OnItemDataBound="ParentRepeater_ItemDataBound">
<HeaderTemplate>
<table border="1">
<tr>
<td><b>Company</b></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td> <%# DataBinder.Eval(Container.DataItem, "ParentItem") %><br>
<asp:Repeater id="CildrenRepeater" runat="server">
<HeaderTemplate>
<table border="1" bgcolor="red">
<tr>
<td><b>Employ</b></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr id="riga" runat="server">
<td><%# DataBinder.Eval(Container.DataItem, "CildrenItem") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>Nel codebehind:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
//creo un nuovo data set
myDataSet = new DataSet();
//creo la tabella padre
MakeParentTable();
//credo la tabella dei figli
MakeCildrenTable();
//associo il DataSet al repeater padre
ParentRepeater.DataSource = myDataSet;
//imposto il DataMember
ParentRepeater.DataMember = "ParentTable";
//eseguo il bind
ParentRepeater.DataBind();
}
}
public void ParentRepeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem)
{
//recupero il riferimento al Repeater annidato
Repeater tr = (Repeater)e.Item.FindControl("CildrenRepeater");
//recupero l'id del padre per filtrare i figli
string parentID = ((DataRowView)e.Item.DataItem)[0].ToString();
//creo una vista sulla tabella dei figli
DataView myDataView = myDataSet.Tables["CildrenTable"].DefaultView;
//la filtro
myDataView.RowFilter = "id = " + parentID;
//l'associo come data surce
tr.DataSource = myDataView;
//registro il gestore dell'evento
tr.ItemDataBound += new RepeaterItemEventHandler(tr_ItemDataBound);
//eseguo il bind
tr.DataBind();
}
}
private void tr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem)
{
//recupero il referimento alla riga della tabella
System.Web.UI.HtmlControls.HtmlTableRow riga = (HtmlTableRow)e.Item.FindControl("riga");
//recupero il valore dal DataRowView
string cildrenID = ((DataRowView)e.Item.DataItem)[0].ToString();
if(null != riga)
{
//imposto il colore
if(cildrenID == "1")riga.BgColor = "white";
}
}
}Una volta eseguite nel Page_Load le classiche operazioni di binding dei dati, nel gestore dell'evento ParentRepeater_ItemDataBound recuperiamo il riferimento al Repeater figlio, associamo i dati filtrati ed infine prima di eseguire il DataBind registriamo un gestore per l'evento ItemDataBound.
In questo esempio coloreremo la cella con id = 1, una decisione arbitraria usata per esempio, da sostituire con condizioni più adatte ad un contesto reale.
L'esempio è realizzato utilizzando due Repeater, ma le solite regole si applicano a qualsiasi tipo di controllo vogliate annidare.
Nota: Questo script contiene un allegato.
Esprimi il tuo giudizio su questo script:
Per procedere devi essere autenticato.
Stavo provando a usare lo script con un datagrid annidato, ma mi si verifica questo errore in compilazione nella riga in cui registro il gestore dell'...
E se volessi annidare controlli ricorsivamente?Ho bisogno di fare una specie di menu ad albero che può avere anche più di un livello figlio.
Per inserire un commento, devi registrarti alla nostra community.








Stampa
Snippet
Download



Sono sempre io che sto provando ad usare i datagrid annidati.La cosa sembra funzionare bene, ma ho un piccolo problema, non riesto ad "usare" l'evento...
Continua »»» | Rispondi »»»