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.