Salve a tutti sono nuovo da queste parti e con me porto un problema riscontrato (ormai una ossessione) in una articolata pagina asp.net.
Ho una pagina ASP.NET 2.0 così strutturata: un datagrid contenente delle colonne di tipo itemtemplate (1 colonna immagine- 2 colonna label, 3 colonna placeholder - 4 colonna label) i cui valori sono letti da database e la cui logica è piazzata è tutta piazzata nell'evento ONITEMDATABOUND, e fin qui nessun problema. Sempre nel medesimo evento costruisco a runtime una tabella (3 colonna del datagrid di tipo itemtemplate contenete un placeholder) avente il numero di righe e il numero di colonne dipendenti da tre query differenti; sempre all'interno di tale tabella le celle contengono dei textbox creati anch'essi runtime secondo alcune condizioni dettate dalle query precedenti. Tale tabella ASP.NET è aggiunta runtime al placeholder, il quale come già detto, è piazzato nella 3 colonna itemtemplate del datagrid, ed anche fin qui nessun problema.
In pratica i problemi sono relativi alla tabella ASP.NET, in quanto deve dipendere necessariamente da 3 query che mi danno nell'ordine: intestazione (1 query), prima colonna (2 query), corpo della tabella (3 query dipendente dagli ID delle due precedenti), in pratica si tratta di una struttura matriciale.
Il mio problema principale consiste nel salvataggio(quando inputo i valori nei textbox) e recupero(quando accedo alla pagina) dei valori di tali textbox in quanto non conosco a priori quanti textbox verranno creati e come strutturare la tabella sql per effettuare le suddette operazioni. Per ridurre la lettura del codice ti posto parte del codice funzionante (contenuto nell'evento ONITEMDATABOUND del datagrid).
//**********************************************************
//COSTRUZIONE MATRICE VARIANTI
//**********************************************************
Table VariantTable = new System.Web.UI.WebControls.Table();
VariantTable.BorderWidth = 1;
VariantTable.CssClass = "Varianti";
VariantTable.GridLines = GridLines.Both;
VariantTable.CellPadding = 0;
VariantTable.CellSpacing = 0;
VariantTable.Width = Unit.Percentage(98);
//REPERIMENTO DEI COLORI
SqlConnection conn_color;
conn_color = new SqlConnection(ConfigurationManager.ConnectionStrings["WFDB"].ConnectionString);
string SelectColor = "SELECT StyleAssociations.Product AS IDProduct, StyleAssociations.Color AS IDColor, Colors.Name, Colors.Red, Colors.Green, Colors.Blue FROM StyleAssociations INNER JOIN Colors ON StyleAssociations.Color = Colors.Id GROUP BY StyleAssociations.Color, StyleAssociations.Product, Colors.Name, Colors.Red, Colors.Green, Colors.Blue HAVING (StyleAssociations.Product = " + idproduct + ")";
SqlCommand CmdColor = new SqlCommand(SelectColor, conn_color);
conn_color.Open();
SqlDataReader ObjDRColor = CmdColor.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
TableRow tr = new TableRow();
//PRIMA CELLA VUOTA
TableCell tdv = new TableCell();
tdv.Width = Unit.Percentage(10);
tdv.Text = "";
tdv.VerticalAlign = VerticalAlign.Middle;
tr.Cells.Add(tdv);
ArrayList ListColor = new ArrayList();
while (ObjDRColor.Read())
{
ListColor.Add(ObjDRColor["IDColor"].ToString());
TableCell td = new TableCell();
td.Width = Unit.Percentage(10);
td.Text = /*ObjDRColor["Name"].ToString().ToLower() + */ "<div style='background-color: " + System.Drawing.ColorTranslator.ToHtml(System.Drawing.Color.FromArgb(Int32.Parse(ObjDRColor["Red"].ToString()), Int32.Parse(ObjDRColor["Green"].ToString()), Int32.Parse(ObjDRColor["Blue"].ToString()))) + "; width: 10px; height: 10px;'></div>";
td.VerticalAlign = VerticalAlign.Middle;
tr.Cells.Add(td);
}
ObjDRColor.Close();
conn_color.Close();
//INTESTAZIONE DEI TOTALI DELLE QUANTITA'
TableCell tdIntTotal = new TableCell();
tdIntTotal.Width = Unit.Percentage(10);
tdIntTotal.Text = "TOTALE";
tdIntTotal.VerticalAlign = VerticalAlign.Middle;
tr.Cells.Add(tdIntTotal);
//AGGIUNGO LE CELLE COLORI ALLA TABELLA
VariantTable.Rows.Add(tr);
//REPERIMENTO DELLE TAGLIE
SqlConnection conn_size;
conn_size = new SqlConnection(ConfigurationManager.ConnectionStrings["WFDB"].ConnectionString);
string SelectSize = "SELECT StyleAssociations.Product AS IDProduct, StyleAssociations.Size AS IDSize, Sizes.Name AS Size FROM StyleAssociations INNER JOIN Sizes ON StyleAssociations.Size = Sizes.Id GROUP BY StyleAssociations.Product, StyleAssociations.Size, Sizes.Name HAVING (StyleAssociations.Product = " + idproduct + ")";
SqlCommand CmdSize = new SqlCommand(SelectSize, conn_size);
conn_size.Open();
SqlDataReader ObjDRSize = CmdSize.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
while (ObjDRSize.Read())
{
TableRow trsize = new TableRow();
TableCell tdsize = new TableCell();
tdsize.Width = Unit.Percentage(10);
tdsize.Text = ObjDRSize.ToString().ToUpper();
tdsize.VerticalAlign = VerticalAlign.Middle;
trsize.Cells.Add(tdsize);
//REPERIMENTO DELLE QUANTITA'
for (int j = 0; j < ListColor.Count; j++)
{
TableCell tdquantity = new TableCell();
tdquantity.Width = Unit.Percentage(10);
SqlConnection conn_quantity;
conn_quantity = new SqlConnection(ConfigurationManager.ConnectionStrings["WFDB"].ConnectionString);
string SelectQuantity = "SELECT * FROM STYLEASSOCIATIONS WHERE Product = " + idproduct + " AND COLOR=" + ListColor[j].ToString() + " AND SIZE=" + ObjDRSize["IDSize"].ToString() + "";
SqlCommand CmdQuantity = new SqlCommand(SelectQuantity, conn_quantity);
conn_quantity.Open();
SqlDataReader ObjDRQuantity = CmdQuantity.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
if (ObjDRQuantity.Read())
{
if (ObjDRQuantity["Quantity"] != DBNull.Value)
{
tdquantity.Text = ObjDRQuantity["Quantity"].ToString(); /* + "<input type=text size=3 class=InputClass>"; */
//TODO: DA PROVARE
ArrayList ListQuantityCode = new ArrayList();
string QuantityCode = "";
SqlConnection connQuantityCode;
connQuantityCode = new SqlConnection(ConfigurationManager.ConnectionStrings["WFDB"].ConnectionString);
string SelectQuantityCode = "SELECT ASPNETQUANTITYCODE FROM SHOPPINGCART_PRODUCTS WHERE IDShoppingCart = " + idshoppingcart + "";
SqlCommand CmdQuantityCode = new SqlCommand(SelectQuantityCode, connQuantityCode);
connQuantityCode.Open();
SqlDataReader ObjDRQuantityCode = CmdQuantityCode.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
if (ObjDRQuantityCode.Read())
{
if (ObjDRQuantityCode["ASPNETQUANTITYCODE"] != DBNull.Value)
{
ListQuantityCode.Add(ObjDRQuantityCode["ASPNETQUANTITYCODE"].ToString());
}
}
ObjDRQuantityCode.Close();
connQuantityCode.Close();
TextBox qty = new TextBox();
qty.ID = "Crr_" + ListColor[j].ToString() + "_" + ObjDRSize["IDSize"].ToString();
//DEVO EFFETTUARE QUI LA PROCEDURA PER RECUPERARE I VALORI DEI MIEI TEXT BOX, E COME?
//DEVO EFFETTUARE QUI LA PROCEDURA PER SALVARE I VALORI DEI TEXTBOX, E COME?
qty.Text = "";
qty.CssClass = "InputClass";
qty.Width = 30;
tdquantity.Controls.Add(qty);
}
else
{
tdquantity.Text = "";
}
}
ObjDRQuantity.Close();
conn_quantity.Close();
tdquantity.VerticalAlign = VerticalAlign.Middle;
trsize.Cells.Add(tdquantity);
}
//CALCOLO TOTALI DELLE QUANTITA' PER COLOR/SIZE
TableCell tdtotal = new TableCell();
tdtotal.Width = Unit.Percentage(10);
int TotaleQuantita = 0;
for (int i = 0; i < ListColor.Count; i++)
{
SqlConnection conn_totalquantity;
conn_totalquantity = new SqlConnection(ConfigurationManager.ConnectionStrings["WFDB"].ConnectionString);
string SelectTotalQuantity = "SELECT * FROM STYLEASSOCIATIONS WHERE Product = " + idproduct + " AND COLOR=" + ListColor*.ToString() + " AND SIZE=" + ObjDRSize["IDSize"].ToString() + "";
SqlCommand CmdTotalQuantity = new SqlCommand(SelectTotalQuantity, conn_totalquantity);
conn_totalquantity.Open();
SqlDataReader ObjDRTotalQuantity = CmdTotalQuantity.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
while (ObjDRTotalQuantity.Read())
{
if (ObjDRTotalQuantity["Quantity"] != DBNull.Value)
{
TotaleQuantita += Int32.Parse(ObjDRTotalQuantity["Quantity"].ToString());
tdtotal.Text = TotaleQuantita.ToString();
}
}
ObjDRTotalQuantity.Close();
conn_totalquantity.Close();
}
tdtotal.VerticalAlign = VerticalAlign.Middle;
//END TOTALI DELLE QUANTITA' PER COLOR/SIZE
trsize.Cells.Add(tdtotal);
//AGGIUNGO LE CELLE SIZE ALLA TABELLA
VariantTable.Rows.Add(trsize);
}
ObjDRSize.Close();
conn_size.Close();
//AGGIUNGO AL PLACEHOLDER LA TABELLA VARIANTI
PlhVarianti.Controls.Add(VariantTable);
//**********************************************************
//END COSTRUZIONE MATRICE VARIANTI
//**********************************************************
Capisco che il problema non è di facile soluzione infatti in ben 12 forum dedicati ad asp.net nessuno mi ha saputo dare una soluzione al mio problema, ma io ci tento anche qui, ciao e grazie in anticipo.