vorrei costruire una tabella in funzione del numero di colonne che contiene (può cambiare di volta in volta) con un repeater, Qualcuno l'ha già fatto o mi può suggerire la strada da seguire?
grazie
Nick
vorrei costruire una tabella in funzione del numero di colonne che contiene (può cambiare di volta in volta) con un repeater, Qualcuno l'ha già fatto o mi può suggerire la strada da seguire?
grazie
Nick
Qualcosa di vagamente simile l'ho fatto, ma considerato la mia poca esperienza in asp.net non so se sia la soluzione migliore.
Per farlo mi sono servito della classe System.Web.UI.ITemplate
Nel mio caso:
Nella Page_Load della mia pagina ho inserito:
repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header, objStruct);
repeater1.ItemTemplate = new MyTemplate(ListItemType.Item, objStruct, ...., ... altri parametri specifici per le mie esigenze);
repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer);
repeater1.EmptyTemplate = new MyTemplate(ListItemType.Header, objStruct);
repeater1.DataBind();
dove objStruct nel mio caso è un'oggetto strutturato che passo alla classe MyTemplate(ITemplate) per generare dinamicamente la tabella
nella classe MyTemplate le cose più significative sono:
public void InstantiateIn(System.Web.UI.Control container)
{
PlaceHolder ph = new PlaceHolder();
switch (templateType)
{
case ListItemType.Header:
//Prima riga di Intestazione della Tabella
HtmlTableRow row1 = new HtmlTableRow();
//Seconda riga di Intestazione della Tabella
HtmlTableRow row2 = new HtmlTableRow();
LoadHeader(row1,row2);
ph.Controls.Add(row1);
ph.Controls.Add(row2);
break;
case ListItemType.Item:
HtmlTableRow rowi = new HtmlTableRow(); //Riga Item Template
rowi.EnableViewState = false;
LoadItem(rowi);
ph.Controls.Add(rowi);
ph.DataBinding += new EventHandler(Item_DataBinding);
break;
case ListItemType.AlternatingItem:
case ListItemType.Footer:
ph.Controls.Add(new LiteralControl("</table>"));
break;
}
container.Controls.Add(ph);
}
LoadHeader e LoadItem sono due 'Metodi' che in base all'objStruct mi creano dinamicamente la tabella.
Spero che di tutto questo qualcosa ti possa essere utile e o che magari ti dia qualche spunto
grazie..
me lo studio un po'..
nicola
Mi aggangio a questa discussione.
Ho provato a elaborare il codice postato in quanto anche a me serve ottenere la dinamicità della tabella, perchè sto realizzando uno usercontrol che andrà sfruttato su svariate tabelle e svariati portali.
Il problema è che il repeater non viene popolato, e a livello di sorgente html della pagina è come se non esistesse.
Questa è la mia interpretazione del codice sopra scritto. Per comodità in questa fase di test e prove varie la classe MyTemplate è nel medesimo file dello UserControl.
Rispondo già alla prima domanda:codice:namespace web_test { public partial class UCTest : System.Web.UI.UserControl { private string strSQL = ""; protected void Page_Load(object sender, EventArgs e) { DataTable dt=new DataTable(); OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=web_test\\App_Data\\Newsletter.mdb"); con.Open(); string cmdstr = "select * from Newsletter"; OleDbCommand aCommand = new OleDbCommand(cmdstr, con); OleDbDataReader aReader = aCommand.ExecuteReader(); dt.Load(aReader); Repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header, dt); Repeater1.ItemTemplate = new MyTemplate(ListItemType.Item, dt); //, ...., ... altri parametri specifici per le mie esigenze); Repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer,dt); Repeater1.DataBind(); aReader.Close(); con.Close(); } public string SQLString { get { return strSQL; } set { strSQL=value;} } } public partial class MyTemplate : ITemplate { private ListItemType templateType; private DataTable objSource; public MyTemplate(ListItemType Type, DataTable objStruct) { templateType = Type; objSource = objStruct; } public void InstantiateIn(System.Web.UI.Control container) { PlaceHolder ph = new PlaceHolder(); switch (templateType) { case ListItemType.Header: HtmlTableRow row1 = new HtmlTableRow(); ph.Controls.Add(new LiteralControl("<table>")); for (int i = 0; i < objSource.Columns.Count; i++) { HtmlTableCell cell=new HtmlTableCell(); cell.InnerHtml=objSource.Columns[i].ColumnName; row1.Cells.Add(cell); } ph.Controls.Add(row1); break; case ListItemType.Item: HtmlTableRow rowi = new HtmlTableRow(); //Riga Item Template rowi.EnableViewState = false; for (int j = 0; j < objSource.Rows.Count; j++) { for (int i = 0; i < objSource.Columns.Count; i++) { HtmlTableCell cell = new HtmlTableCell(); cell.InnerHtml = objSource.Rows[j][i].ToString(); rowi.Cells.Add(cell); } } ph.Controls.Add(rowi); // ph.DataBinding += new EventHandler(Item_DataBinding); break; case ListItemType.AlternatingItem: case ListItemType.Footer: ph.Controls.Add(new LiteralControl("</table>")); break; } container.Controls.Add(ph); } } }
Si, lo usercontrol è stato inserito correttamente all'interno della pagina, in quanto se lo popolo con dati statici (quindi sapendo in precedenza i campi da visualizzare) l'oggetto viene inserito e popolato correttamente nella pagina html generata.
Il mio mononeurone ormai ha fatto le valigie e m'ha lasciato in completa solitudine...yuuuuhuuuuu, c'è neeessuuuuuunoooooo????...gluglugl...u
Ho risolto lavorando direttamente sull'ItemDataBound.
Come nel codice precedente il mio DataSource è una DataTable.
codice:protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { switch(e.Item.ItemType) { case ListItemType.Header: e.Item.Controls.Add(new LiteralControl("<table>")); e.Item.Controls.Add(new LiteralControl("\r\n\t<tr>")); for (int i = 0; i < ((DataTable)Repeater1.DataSource).Columns.Count; i++) { e.Item.Controls.Add(new LiteralControl("\r\n\t\t<td>")); Label l = new Label(); l.ID = "Test " + i.ToString(); l.Text = ((DataTable)Repeater1.DataSource).Columns[i].ToString(); e.Item.Controls.Add(l); e.Item.Controls.Add(new LiteralControl("</td>")); } e.Item.Controls.Add(new LiteralControl("\r\n\t</tr>")); break; case ListItemType.Item: for (int j = 0; j < ((DataTable)Repeater1.DataSource).Rows.Count; j++) { e.Item.Controls.Add(new LiteralControl("\r\n\t<tr>")); for (int i = 0; i < ((DataTable)Repeater1.DataSource).Columns.Count; i++) { e.Item.Controls.Add(new LiteralControl("\r\n\t\t<td>")); Label l = new Label(); l.ID = "Test item" + i.ToString(); l.Text = ((DataTable)Repeater1.DataSource).Rows[j][i].ToString(); e.Item.Controls.Add(l); e.Item.Controls.Add(new LiteralControl("</td>")); } e.Item.Controls.Add(new LiteralControl("\r\n\t</tr>")); } break; case ListItemType.Footer: e.Item.Controls.Add(new LiteralControl("</table>")); break; } }
Il mio mononeurone ormai ha fatto le valigie e m'ha lasciato in completa solitudine...yuuuuhuuuuu, c'è neeessuuuuuunoooooo????...gluglugl...u