• User Newbie

    [ASP.NET] Datagrid complesso con tabella di textbox a runtime

    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.


  • Moderatore

    Ciao Terrix77 e benvenuto sul Forum GT!

    per geneare TemplateColumn al volo, all'interno dell'evento ItemDataBound, potresti
    dare uno squardo a questa discussione su thescripts.com

    http://www.thescripts.com/forum/thread344619.html

    PS: Per regolamento non è possibile postare più di 15-20 righe di codice. Grazie
    :ciauz:


  • User Newbie

    ciao,

    visto che qui non si può postare molto codice, e non mi è molto chiaro il contesto, se mi mandi in privato la pagina in questione (aspx e cs) provo a darti una mano. Io una volta ho fatto una cosa del genere, e credo di aver capito che si tratti di una cosa simile..


  • User Newbie

    Ciao Braidiano, sei molto gentile per la risposta e per il tuo aiuto. Con molta fatica sono riuscito a sviluppare la pagina in questione. Non è stata per nulla facile, in quanto dovevo renderizzare e allo stesso tempo memorizzare i valori inputati nelle textbox costruite a runtime contenute a loro volta in una struttura di controlli abbastanza articolata (masterpage- datagrid- tabella - placeholder). Visto che sono riuscito a costruire una struttura simile, se per caso qualcuno avesse la necessità di una struttura simile la metto a completa disposizione della comunità.

    Vi saluto a tutti