74 messaggi dal 06 settembre 2002
E' inutile, non riesco a risolvere il problema, e sono settimane che ci giro intorno .
Problema: Inserire a runtime dei controlli web (text-box, drop-down e quant'altro).
Non posso inserirli a casaccio, i controlli, ma debbo metterli, ben formattati, all'interno di una tabella.

Ho pensato di utilizzare un DataGrid in modo da costruire, a run-time, una tabella così concepita:

<code>
|-------------|---------|---------|---------|
|&nbsp;&nbsp;CAMPO 1&nbsp;&nbsp;| CAMPO 2 | CAMPO 3 | CAMPO 4 |
|-------------|---------|---------|---------|
| placeholder |&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|-------------|---------|---------|---------|
| placeholder |&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|-------------|---------|---------|---------|
| placeholder |&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|-------------|---------|---------|---------|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;|
</code>

L'idea è quella di piazzare, i campi input attraverso i placeholder.
Ecco, dunque, il codice:


<code>
&lt;script language="C#" runat="server"&gt;
protected void Page_Load(Object sender, EventArgs e) {
// creo la nuova tabella con cui "popolare" il DataGrid
DataTable dt = new DataTable(); // Dichiara nuovo oggetto DataTable
DataRow dr; // Dichiara nuovo oggetto DataRow
// Intestazione tabella
// --------------------
dt.Columns.Add(new DataColumn("campo 1", typeof(object))); // Dichiaro di tipo object perchè voglio piazzarci dentro un componente PlaceHolder. Sarà corretto?
dt.Columns.Add(new DataColumn("campo_2", typeof(string)));
dt.Columns.Add(new DataColumn("campo_3", typeof(string)));
dt.Columns.Add(new DataColumn("campo_4", typeof(string)));
// impostazione contenuti
// ----------------------
for (int i = 0; i &lt; 10; i++) { // voglio realizzare 10 righe
PlaceHolder myPlaceHolder = new PlaceHolder(); // dichiaro componente PlaceHolder
myPlaceHolder.ID = "myplace";
dr = dt.NewRow(); // nuova riga
dr[0] = myPlaceHolder; // La prima cella vorrei contenesse il PlaceHolder
dr[1] = "testo";
dr[2] = "testo";
dr[3] = "testo";
dt.Rows.Add(dr); // aggiunge la nuova riga
// mi piacerebbe aggiungere un componente TextBox
// nel PlaceHolder appena creato
TextBox myTextBox = new TextBox(); // dichiaro il nuovo componente
myTextBox.ID = "mis"+i; // lo "battezzo"
myPlaceHolder.Controls.Add(myTextBox); // lo aggiungo nel PlaceHolder
};
my_dataGrid.DataSource = dt; // Riempie il DataGrid con il DataTable preparato sopra
my_DataGrid.DataBind();
};
&lt;/script&gt;

&lt;form method="post" runat="server"&gt;
&lt;asp:datagrid ID="cartone" runat="server"&gt;&lt;/asp:datagrid&gt;
&lt;/form&gt;
</code>


Ecco questo è quanto.
Non è che mi da errore, questo no, ma della colonna con i textbox non c'è neanche l'ombra.
Ecco quel che mi restituisce la pagina:

<code>
|---------|---------|---------|
| campo_2 | campo_3 | campo_4 |
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|&nbsp;&nbsp;testo&nbsp;&nbsp;|
|---------|---------|---------|
</code>

Per favore, qualcuno mi da una mano?
Sono al limite dello "sclero".

Grazie a tutta la comunità.


Modificato - Lupo - 18 Lug 2002 10:50:25
19 messaggi dal 15 febbraio 2002
Ciao avevo il tuo stesso problema...
La cosa è un po' complicata, ma capito il meccanismo è molto potente....
Crei un datagrid, poi crei delle colonne di tipo ColoumnTemplate, così:
//crei l'oogetto datagrid, ad esempio lo chiami Pippo

TemplateColumn l_dgrc = new TemplateColumn();
l_dgrc.HeaderText = "Choose"; //nome della colonna del dg

Adesso arriva la parte tosta:P Ora devi creare una classe template da associare alla colonna, derivi dalla classe System.Web.UI.ITemplate. Questa interfaccia ha un solo metodo che devi implementare: InstantiateIn a cui è passato un oggetto Container in cui devi mettere (nell'implementazione del metodo) tutti i controlli che vorrai che appariranno nella tua cella del dg.
ad esempio.
public class TxtTemplate: System.Web.UI.ITemplate
{
System.Web.UI.WebControls.TextBox m_txt;
public void InstantiateIn(Control container)
{
m_txt = new TextBox();
//se vuoi che sia effettuato anche il binding auotomatico aggiungi e implementi l'evento OnDataBinding, così: m_txt.DataBinding += new EventHandler(this.[nome metodo che effettua il binding]);


Control.Add(m_txt);
//se vuoi aggiungere anche un validate, lo crei, lo associ al textbox e metti dentro il container... Così fai x ogni controllo che vuoi aggiungere....
}
//la classe finisce qua, se vuoi il binding automatico crei il metodo ad es:
public void OnDataBindingTxt(object sender, EventArgs e)
{
TextBox l_txt = (TextBox) sender;
DataGridItem container = (DataGridItem) l_txt.NamingContainer;
//riga della tabella dataset associata al datagrid
DataRowView dr = (DataRowView)container.DataItem;
l_txt.Text = dr.Row.ItemArray[0];
.....
}
}

Una volta creato il template associ all'oggetto columnTemplate che hai creato, un'istanza dell'oggetto Template creato, es:
//prima hai creato l_dgrc come TemplateColomn, ora ti basta fare così:
l_dgrc.ItemTemplate = new TxtTemplate();
//ora aggiungi la colonna al datagrid ed abbiamo finito:P;
Pippo.Columns.Add(l_dgrc);

Dai un'occhiata alle MSDN, queste cose le ho prese da li...:)
Ciao!
Gian







Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.