Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    repeater e tabella dinamica

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    6
    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

  3. #3
    grazie..
    me lo studio un po'..
    nicola

  4. #4
    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.

    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);
    		}
    
    	}
    }
    Rispondo già alla prima domanda:
    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

  5. #5
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.