none
Stampare risultato query linq da oggetto EnumerableRowCollection RRS feed

  • Domanda

  • Salve a tutti, mi sto approcciando al C# e sto sviluppando un piccolo progetto, mi sono imbattutto in diversi problemi per generare una stampa con anteprima, alcuni li ho superati, ma questo non rieco proprio.
    Ho una query linq dichiarata come EnumerableRowCollection che può produrre svariate righe, non riesco ad aggiungere pagine nuove e continuare la stampa.

    Questa è la query

    EnumerableRowCollection qry;
    /*
    altro codice tra cui la connessione ad un file access
    da cui recupero i dati popolando una DataTable chiamato res
    */
    
    qry = from d in res.AsEnumerable()
      where d.Field<DateTime>("DATORD") >= DALd
      where d.Field<DateTime>("DATORD") <= ALd
      where d.Field<string>("TIPO").Substring(0, 1) == "R"
      where d.Field<string>("CAU_UFF_OR") != "1"
      where d.Field<string>("CAU_UFF_OR") != "10"
      where d.Field<string>("CAU_UFF_OR") != "30"
      where d.Field<string>("CAU_UFF_OR") != "40"
      where d.Field<string>("CAU_UFF_OR") != "60"
      orderby d.Field<string>("CAU_UFF_OR") ascending
      select d;

    mentre la funzione che scrive il documento è:

    /*
    chiaramente non funziona bene, ma al momento la funzione
    che genera il documento è questa
    */
    private void prnDoc_Printpage(object sender, PrintPageEventArgs e)
      {
      Graphics graphics = e.Graphics;
      SolidBrush fColor = new SolidBrush(Color.Black);
      int linePerPage = 0;
      int fontHeight = (int)docFont.GetHeight(e.Graphics);
      int topMargin = e.MarginBounds.Top;
      int startX = 50;
      int startY = 50;
      int Ypos = 0;
      int count = 0;
      // max linee per pagina
      linePerPage = (e.MarginBounds.Height / fontHeight) - 2;
      // intestazione
      graphics.DrawString(intestazione, docFont, fColor, startX, startY);
      string divisione = "----------------------------------------------------------------------------------------------------";
    
      int totRighe = 0;
      foreach (DataRow r in qry) { totRighe++; }
    
      while (count < linePerPage && count < totRighe)
      {
      foreach (DataRow r in qry)
      {
      Ypos = topMargin + (count * (fontHeight * 2)) + startY + 30;
      string riga =
      "Ord. " + r.Field<string>("NORD") +
      " - " + r.Field<string>("DESCLI") + "\n" + divisione + "\n\n";
       
      graphics.DrawString(riga, docFont, fColor, startX, Ypos, new StringFormat());
      count++;
      }
      }
    
      //if (line != null) { e.HasMorePages = true; }
      //else { e.HasMorePages = false; }
      }

    non so come andare avanti....
    grazie a tutti in aticipo per qualsiasi aiuto e suggerimento prezioso!!!

    giovedì 9 giugno 2016 13:33

Risposte

  • Capisco che a parole sia complicato, quindi siccome stasera avevo un po' di tempo da perdere e siccome sono molto buona :P

    Ti ho preparato un esempio funzionante elaborando un altro esempio che ho postato qualche giorno fa.

    Se sei alle prime armi, ti consiglio di leggere entrambi, perché il primo insegna come caricare i dati da un database (in questo caso è SQL Server ma è uguale anche per Access) e il secondo mostra come stampare i dati caricati sulla data table, ho usato parte del tuo codice quindi dovrebbe essere quasi comprensibile almeno la routine di stampa.

    http://blogs.dotnetwork.it/sabrina/blog/stampare-i-dati-contenuti-in-una-datatable/

    Questo è l'esempio con la stampa, l'altro esempio è linkato dentro a questo.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 16 giugno 2016 20:08
  • Ciao,

    Guardando il tuo codice, senza sapere di più in merito, ti do un paio di idee:

    1) I dati vanno preparati prima della stampa non dentro ad un evento della stampa

    2) Tu dovresti avere prima della stampa un idea (almeno vaga) di quello che stai stampando e quanto spazio occupa.

    e con quanto scritto al punto2 intendo dire, se la tua stampa è un report tabulare, l'evento PrintPage dovrebbe servirti per preparare intestazione, piè pagina e inserire nella pagina una serie di righe pari al massimo che può ospitare oppure tutte le righe (se è l'ultima pagina) informando poi il sistema se c'è un altra pagina oppure no.

    Se il tuo report è una stampa x pagina e ogni pagina stampa uno o più oggetti in essa contenuti, quando arriva l'evento tu dovresti avere nei dati della tua classe le informazioni relative a quello che devi stampare e semplicemente fare il layout degli oggetti sulla pagina, aggiornando quel che stai facendo in modo che alla successiva chiamata tu sai qual'è la pagina che stai per stampare e la prepari.

    Questo solo x darti delle idee.

    La più importante è: Prima di iniziare a stampare, prepara i dati, se stai semplicemente stampando il risultato della query, leggi i dati da access/sqlserver e inseriscili in una datatable usando un datareader oppure, creati un entità che contiene i dati e riempila leggendo i dati da access/sqlserver e infilandoli in una collection.

    A quel punto puoi, in base a quello che inserisci nella pagina calcolare quante pagine stamperai e preparare il necessario.

    Se hai ulteriori problemi, siamo qui.


    Sabrina C. - http://www.dotnetwork.it

    giovedì 16 giugno 2016 14:23

Tutte le risposte

  • Sarebbe bello capire un po' meglio come hai impostato la stampa, quali sono gli eventi in cui inserisci i dati sulla pagina, che cosa inserisci e magari da dove ti arrivano i dati quando inizi la stampa, così magari possiamo aiutarti meglio.


    Sabrina C. - http://www.dotnetwork.it

    martedì 14 giugno 2016 08:34
  • Prima di tutto grazie mille della risposta!!!

    Posto tutta la classe come è adesso, test compresi commentati.

    La classe serve sia per recuperare dati da un db access (che poi diventerà sql), che per generare la stampa

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Data;
    using System.Data.OleDb;
    using System.Data.SqlClient;
    
    namespace DTQualityCheck
    {
        class Stampa
        {
            private string conString;
    
            private const string conSql = "user id=produzione;password=produzione;database=QualityCheck;server=DESKTOP-BEFPVF8\\SQLEXPRESS";
            private const string conAccess = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='G:\\2015 RESI Stampe.accdb'";
            private const string qrySelect = "SELECT * FROM PRODUZ";
    
            private DataSet result = new DataSet("result");
            private DataTable res;
            private EnumerableRowCollection<DataRow> qry;
            private string tipo, intestazione, DALs, ALs;
            private DateTime DALd, ALd;
            private bool check;
    
            private PrintDialog prnDialog;
            private PrintDocument prnDoc;
            private PrinterSettings prnSet;
            private PrintPreviewDialog prnPrev;
            private DialogResult prnDialogResult, prnPrevResult;
    
            public PaperSize docSize;
            public Font docFontInt, docFont;
    
            /*
             * 
             * 
             * costruttore della classe
             */
            public Stampa(string LordoNetto, DateTime dataDA, DateTime dataA, bool riunione, string SqlAccess)
            {
                if (SqlAccess.ToUpper() == "SQL") { conString = conSql; }
                else if (SqlAccess.ToUpper() == "ACCESS" || SqlAccess == null) { conString = conAccess; }
                else { MessageBox.Show("Specificare origine dati: Sql o Access !!!"); }
    
                DALd = sistemaData(dataDA); // formato DataTime
                DALs = DALd.ToString();   // formato stringa
    
                ALd = sistemaData(dataA);   // formato DataTime
                ALs = ALd.ToString();     // formato stringa
                check = riunione;
                tipo = LordoNetto.ToUpper();
    
                intestazione = "Dettaglio <" + tipo + "> - periodo dal  " + DALs.Substring(0, 10) + "  al  " + ALs.Substring(0, 10);
    
                recuperaDati();
            }
    
            private DateTime sistemaData(DateTime data)
            {
                int giorno = Convert.ToInt32(data.ToString().Substring(0, 2));
                int mese = Convert.ToInt32(data.ToString().Substring(3, 2));
                int anno = Convert.ToInt32(data.ToString().Substring(6, 4));
                DateTime dataNew = new DateTime(anno, mese, giorno, 00, 00, 00);
                return dataNew;
            }
    
            private void recuperaDati()
            {
                if (conString.Substring(0, 8) == "user id=")
                {
                    SqlConnection con = new SqlConnection(conString);
                    SqlCommand cmd = new SqlCommand(qrySelect, con);
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    try { con.Open(); da.Fill(result); }
                    catch { MessageBox.Show("Impossibile recuperare i dati Sql!!!"); }
                    finally { con.Close(); res = result.Tables["Table"]; }
                }
                else if (conString.Substring(0, 8) == "Provider")
                {
                    OleDbConnection con = new OleDbConnection(conString);
                    OleDbCommand cmd = new OleDbCommand(qrySelect, con);
                    OleDbDataAdapter da = new OleDbDataAdapter();
                    da.SelectCommand = cmd;
                    try { con.Open(); da.Fill(result); }
                    catch { MessageBox.Show("Impossibile recuperare i dati Access!!!"); }
                    finally { con.Close(); res = result.Tables["Table"]; }
                }
                else { MessageBox.Show("ERRORE nella stringa di connessione!!!"); }
    
                if (check == true)
                {
                    qry = from d in res.AsEnumerable()
                          where d.Field<DateTime>("DATORD") >= DALd &&
                            d.Field<DateTime>("DATORD") <= ALd &&
                            d.Field<string>("TIPO").Substring(0, 1) == "R" &&
                            d.Field<string>("CAU_UFF_OR") != "1" &&
                            d.Field<string>("CAU_UFF_OR") != "10" &&
                            d.Field<string>("CAU_UFF_OR") != "30" &&
                            d.Field<string>("CAU_UFF_OR") != "40" &&
                            d.Field<string>("CAU_UFF_OR") != "60"
                          orderby d.Field<string>("CAU_UFF_OR") ascending
                          select d;
                }
                else if (check == false)
                {
                    qry = from d in res.AsEnumerable()
                          where d.Field<DateTime>("DATORD") >= DALd &&
                            d.Field<DateTime>("DATORD") <= ALd &&
                            d.Field<string>("TIPO").Substring(0, 1) == "R"
                          orderby d.Field<string>("CAU_UFF_OR") ascending
                          select d;
                }
            }
            /*
             * 
             * 
             * metodi per la generazione della stampa
             */
            public void echo()
            {
                prnDialog = new PrintDialog();
                prnDoc = new PrintDocument();
                prnSet = new PrinterSettings();
                docFontInt = new Font("Arial", 24, FontStyle.Bold);
                docFont = new Font("Helvetica", 10);
                docSize = new PaperSize("A4oriz", 1170, 826);
                prnDialog.Document = prnDoc;
                prnDialog.Document.DefaultPageSettings.Landscape = true;
                //prnDialog.Document.DefaultPageSettings.PaperSize = docSize;
                prnDoc.PrintPage += new PrintPageEventHandler(prnDoc_Printpage);
    
                prnDialogResult = prnDialog.ShowDialog();
    
                if (prnDialogResult == DialogResult.OK)
                {
                    prnPrev = new PrintPreviewDialog();
                    prnPrev.Document = prnDoc;
                    prnPrevResult = prnPrev.ShowDialog();
                    if (prnPrevResult == DialogResult.OK) { prnDoc.Print(); }
                }
            }
    
            private void prnDoc_Printpage(object sender, PrintPageEventArgs e)
            {
                Graphics graphics = e.Graphics;
                SolidBrush fColor = new SolidBrush(Color.Black);
                int linePerPage = 0;
                int fontHeight = (int)docFont.GetHeight(e.Graphics);
                int topMargin = e.MarginBounds.Top;
                int printableH = e.MarginBounds.Height;
                int printableW = e.MarginBounds.Width;
                RectangleF printableArea = new RectangleF(e.MarginBounds.Left, e.MarginBounds.Right, printableW, printableH);
                StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
                int startX = 10;
                int startY = 10;
                int Ypos = 0;
                int count = 1;
                int countID = 1;
                // max linee per pagina
                linePerPage = ((e.MarginBounds.Height / fontHeight) / 3) - 1;
                // intestazione
                graphics.DrawString(intestazione, docFontInt, fColor, startX, startY);
                graphics.DrawLine(new Pen(Color.Black, 4), startX, (startY + 38), (startX + 1150), (startY + 38));
    
                int totRighe = qry.Count();
                
                /*
                 * 
                 * Creo la struttura del DataTable
                 * aggiungendo una colonna come progressivo
                 */
                DataSet dati2print = new DataSet("PRODUZ");
                DataTable dati = dati2print.Tables.Add("PRODUZ");
                DataColumn progr =  dati.Columns.Add("IdProgressivo", typeof(Int32));
                dati.Columns.Add("UT", typeof(string));
                dati.Columns.Add("I_E", typeof(string));
                dati.Columns.Add("NORD", typeof(string));
                dati.Columns.Add("DATORD", typeof(string));
                dati.Columns.Add("NORD_RIF", typeof(string));
                dati.Columns.Add("DESVETT", typeof(string));
                dati.Columns.Add("AUTO", typeof(string));
                dati.Columns.Add("CODCLI", typeof(string));
                dati.Columns.Add("DESCLI", typeof(string));
                dati.Columns.Add("CODICE", typeof(string));
                dati.Columns.Add("DESC", typeof(string));
                dati.Columns.Add("DESCOLO", typeof(string));
                dati.Columns.Add("ART_SING", typeof(string));
                dati.Columns.Add("QTA_DEN", typeof(Int32));
                dati.Columns.Add("DESCAU_UFF", typeof(string));
                dati.Columns.Add("DESDIF_UFF", typeof(string));
                dati.Columns.Add("NOTE_UFF", typeof(string));
                dati.Columns.Add("SCADENZA", typeof(string));
                dati.Columns.Add("QTA_RIEN", typeof(Int32));
                dati.Columns.Add("DATA_PERIZ", typeof(string));
                dati.Columns.Add("DESCAU_PER", typeof(string));
                dati.Columns.Add("DESDIF_PER", typeof(string));
                dati.Columns.Add("NOTE_PER", typeof(string));
                dati.Columns.Add("ACCR", typeof(Int32));
                dati.Columns.Add("NOTE_RES", typeof(string));
                dati.Columns.Add("NBOLL", typeof(string));
                dati.Columns.Add("DATABOLL", typeof(string));
                dati.Columns.Add("RAP", typeof(string));
                dati.PrimaryKey = new DataColumn[] { progr };
                /*
                 * 
                 * Popolo il datatable appena creato
                 */
                foreach (DataRow r in qry)
                {
                    DataRow riga = dati2print.Tables["PRODUZ"].NewRow();
                    /*0*/ riga["IdProgressivo"] = countID;
                    /*1*/ if (!DBNull.Value.Equals(r["UT"])) { riga["UT"] = (string)r["UT"]; }
                        else { riga["UT"] = ""; }
                    /*2*/ if (!DBNull.Value.Equals(r["I_E"])) { riga["I_E"] = (string)r["I_E"]; } 
                        else { riga["I_E"] = ""; }
                    /*3*/ riga["NORD"] = (string)r["NORD"];
                    /*4*/ riga["DATORD"] = Convert.ToString((DateTime)r["DATORD"]).Substring(0, 10);
                    /*5*/ if (!DBNull.Value.Equals(r["NORD_RIF"])) { riga["NORD_RIF"] = (string)r["NORD_RIF"]; }
                        else { riga["NORD_RIF"] = ""; }
                    /*6*/ if (!DBNull.Value.Equals(r["DESVETT"])) { riga["DESVETT"] = (string)r["DESVETT"]; }
                        else { riga["DESVETT"] = ""; }
                    /*7*/ if (!DBNull.Value.Equals(r["AUTO"])) { riga["AUTO"] = (string)r["AUTO"]; }
                        else { riga["AUTO"] = ""; }
                    /*8*/ riga["CODCLI"] = (string)r["CODCLI"];
                    /*9*/ riga["DESCLI"] = (string)r["DESCLI"];
                    /*10*/riga["CODICE"] = (string)r["CODICE"];
                    /*11*/riga["DESC"] = (string)r["DESC"];
                    /*12*/if (!DBNull.Value.Equals(r["DESCOLO"])) { riga["DESCOLO"] = (string)r["DESCOLO"]; }
                        else { riga["DESCOLO"] = ""; }
                    /*13*/if (!DBNull.Value.Equals(r["ART_SING"])) { riga["ART_SING"] = (string)r["ART_SING"]; }
                        else { riga["ART_SING"] = ""; }
                    /*14*/riga["QTA_DEN"] = Convert.ToInt32((double)r["QTA_DEN"]);
                    /*15*/riga["DESCAU_UFF"] = (string)r["DESCAU_UFF"];
                    /*16*/riga["DESDIF_UFF"] = (string)r["DESDIF_UFF"];
                    /*17*/if (!DBNull.Value.Equals(r["NOTE_UFF"])) { riga["NOTE_UFF"] = (string)r["NOTE_UFF"]; }
                        else { riga["NOTE_UFF"] = ""; }
                    /*18*/riga["SCADENZA"] = Convert.ToString((DateTime)r["SCADENZA"]).Substring(0, 10);
                    /*19*/if (!DBNull.Value.Equals(r["QTA_RIEN"])) { riga["QTA_RIEN"] = Convert.ToInt32((double)r["QTA_RIEN"]); }
                        else { riga["QTA_RIEN"] = 0; }
                    /*20*/if (!DBNull.Value.Equals(r["DATA_PERIZ"])) { riga["DATA_PERIZ"] = Convert.ToString((DateTime)r["DATA_PERIZ"]).Substring(0, 10); }
                        else { riga["DATA_PERIZ"] = ""; }
                    /*21*/if (!DBNull.Value.Equals(r["DESCAU_PER"])) { riga["DESCAU_PER"] = (string)r["DESCAU_PER"]; }
                        else { riga["DESCAU_PER"] = ""; }
                    /*22*/if (!DBNull.Value.Equals(r["DESDIF_PER"])) { riga["DESDIF_PER"] = (string)r["DESDIF_PER"]; }
                        else { riga["DESDIF_PER"] = ""; }
                    /*23*/if (!DBNull.Value.Equals(r["NOTE_PER"])) { riga["NOTE_PER"] = (string)r["NOTE_PER"]; }
                        else { riga["NOTE_PER"] = ""; }
                    /*24*/if (!DBNull.Value.Equals(r["ACCR"])) { riga["ACCR"] = Convert.ToInt32((string)r["ACCR"]); }
                        else { riga["ACCR"] = 0; }
                    /*25*/if (!DBNull.Value.Equals(r["NOTE_RES"])) { riga["NOTE_RES"] = (string)r["NOTE_RES"]; }
                        else { riga["NOTE_RES"] = ""; }
                    /*26*/if (!DBNull.Value.Equals(r["NBOLL"])) { riga["NBOLL"] = (string)r["NBOLL"]; }
                        else { riga["NBOLL"] = 0; }
                    /*27*/if (!DBNull.Value.Equals(r["DATABOLL"])) { riga["DATABOLL"] = Convert.ToString((DateTime)r["DATABOLL"]).Substring(0, 10); }
                        else { riga["DATABOLL"] = ""; }
                    /*28*/if (!DBNull.Value.Equals(r["RAP"])) { riga["RAP"] = (string)r["RAP"]; }
                        else { riga["RAP"] = ""; }
    
                    dati2print.Tables["PRODUZ"].Rows.Add(riga);
                    countID++;
                }
    
                /*
                while (count < linePerPage && count < totRighe)
                {
                    foreach (DataRow r in qry)
                    {
                        string nord = (string)r["NORD"];
                        string datord = Convert.ToString((DateTime)r["DATORD"]).Substring(0, 10);
                        string cli = (string)r["DESCLI"];
                        string qtaDen = Convert.ToString((double)r["QTA_DEN"]);
                        //
                        Ypos = (count * 61) + (startY + 40);
                        // prima riga
                        graphics.DrawString(nord, docFont, fColor, startX, Ypos);
                        graphics.DrawString(datord, docFont, fColor, startX + 60, Ypos);
                        graphics.DrawString(cli, docFont, fColor, startX + 60 + 90, Ypos);
                        // seconda riga
                        graphics.DrawString(cli, docFont, fColor, startX, Ypos + 20);
                        // terza riga
                        graphics.DrawString(qtaDen, docFont, fColor, startX, Ypos + 40);
                        // linea di divisione
                        graphics.DrawLine(new Pen(Color.Black, 1), startX, Ypos + 60, (startX + 1150), Ypos + 60);
                        //
                        count++;
                    }
                }
                */
    
                while (count < linePerPage && count < totRighe)
                {
                    Ypos = (count * 61) + (startY + 40);
                    DataRow r = dati2print.Tables["PRODUZ"].Rows.Find(count);
                    if (r != null)
                    {
                        //graphics.MeasureString(r[3].ToString(), docFont, new SizeF(printableW, printableH), format, out chars, out lines);
                        //graphics.DrawString(r[3].ToString(), docFont, fColor, printableArea, format);
                        graphics.DrawString(r[3].ToString(), docFont, fColor, startX, Ypos, format);
                        if(count == totRighe) { break; }
                    }
                    else { break; }
                    count++;
                    if ((totRighe - count) > 0) { e.HasMorePages = true; }
                    else { e.HasMorePages = false; }
                }
            }
        }
    }

    mercoledì 15 giugno 2016 15:56
  • Ciao,

    Guardando il tuo codice, senza sapere di più in merito, ti do un paio di idee:

    1) I dati vanno preparati prima della stampa non dentro ad un evento della stampa

    2) Tu dovresti avere prima della stampa un idea (almeno vaga) di quello che stai stampando e quanto spazio occupa.

    e con quanto scritto al punto2 intendo dire, se la tua stampa è un report tabulare, l'evento PrintPage dovrebbe servirti per preparare intestazione, piè pagina e inserire nella pagina una serie di righe pari al massimo che può ospitare oppure tutte le righe (se è l'ultima pagina) informando poi il sistema se c'è un altra pagina oppure no.

    Se il tuo report è una stampa x pagina e ogni pagina stampa uno o più oggetti in essa contenuti, quando arriva l'evento tu dovresti avere nei dati della tua classe le informazioni relative a quello che devi stampare e semplicemente fare il layout degli oggetti sulla pagina, aggiornando quel che stai facendo in modo che alla successiva chiamata tu sai qual'è la pagina che stai per stampare e la prepari.

    Questo solo x darti delle idee.

    La più importante è: Prima di iniziare a stampare, prepara i dati, se stai semplicemente stampando il risultato della query, leggi i dati da access/sqlserver e inseriscili in una datatable usando un datareader oppure, creati un entità che contiene i dati e riempila leggendo i dati da access/sqlserver e infilandoli in una collection.

    A quel punto puoi, in base a quello che inserisci nella pagina calcolare quante pagine stamperai e preparare il necessario.

    Se hai ulteriori problemi, siamo qui.


    Sabrina C. - http://www.dotnetwork.it

    giovedì 16 giugno 2016 14:23
  • Grazie mille della risposta, adesso ci studio un po'....

    Credo di aver capito il concetto di quello che dici ed è giustissimo, ma non ho molto le idee chiare (quasi per nulla direi) di come farlo, in particolare come dire all'evento qui metti, ad esmpio, dalla riga 1 alla 10, nella seconda dalla 11 alla 20 e così via fino alla fine

    giovedì 16 giugno 2016 14:48
  • Capisco che a parole sia complicato, quindi siccome stasera avevo un po' di tempo da perdere e siccome sono molto buona :P

    Ti ho preparato un esempio funzionante elaborando un altro esempio che ho postato qualche giorno fa.

    Se sei alle prime armi, ti consiglio di leggere entrambi, perché il primo insegna come caricare i dati da un database (in questo caso è SQL Server ma è uguale anche per Access) e il secondo mostra come stampare i dati caricati sulla data table, ho usato parte del tuo codice quindi dovrebbe essere quasi comprensibile almeno la routine di stampa.

    http://blogs.dotnetwork.it/sabrina/blog/stampare-i-dati-contenuti-in-una-datatable/

    Questo è l'esempio con la stampa, l'altro esempio è linkato dentro a questo.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 16 giugno 2016 20:08
  • Grandissima!!!!

    Stasera ci studio e poi ti dico se non bravo o no..... :) ;)

    venerdì 17 giugno 2016 14:29
  • Ho finito adesso di studiare entrambi i tuoi tutorial, non ho ancora provato a riscriverli adattandoli al mio progetto ed a testarlo, ma è chiarissimo!!!

    In effetti, nei vari disperati tentativi che avevo fatto, avevo provato anche io con un ciclo for, ma sbagliavo in un paio di punti.....

    Grazie mille!!!! Bellissimo tutorial!!!!!

    venerdì 17 giugno 2016 17:35
  • Prego non c'è di che.

    Sabrina C. - http://www.dotnetwork.it

    venerdì 17 giugno 2016 17:52