using GMW_data;
using SteamWare;
using System;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GMW.WebUserControls
{
  public partial class mod_sterrTaglio : GMW_data.UserControlBCodeMan
  {
    /// <summary>
    /// Imposta variabili specifiche classe
    /// </summary>
    public override void setupVariabili()
    {
      /// <summary>
      /// flusso associato (hard coded) a sterrati
      /// </summary>
      flusso = "ST";
      /// <summary>
      /// stato associato (hard coded) a  sterrati
      /// </summary>
      statoUDC = "Sterr";
      eventoUDC = "UDC_STTA";
      eventoUDC_qta = "UDC_QTY";
      codLineaKo = "W1000";
      tipoUdcLinea = "Sterratura";
      IdxPosizioneIn = memLayer.ML.cdvi("IdxPosizioneSterrati");
      IdxPosizioneOut = memLayer.ML.cdvi("IdxPosizioneSterratiTemp");
      IdxPosizioneOutTempName = "IdxPosizioneSterratiTemp";
      sVarIdxCella = "IdxCellaLineaST";
      IdxPosizioneOutTemp = memLayer.ML.cdvi(IdxPosizioneOutTempName);
      tipoCartCurr = tipoCartellino.cartSterr;
      enableBCodeParticolare = false;
    }

    /// <summary>
    /// Codice AL associato alla cella corrente...
    /// </summary>
    public override string AlByCella
    {
      get
      {
        string answ = "";
        try
        {
          answ = string.Format("ALS00{0}", Postazione.currCodCella);
          // controllo se esista AL sennò lo creo...
          if (MagClass.magazzino.taEA.getByAL(answ).Rows.Count == 0)
          {
            MagClass.magazzino.taEA.Insert(answ, true, DateTime.Now, MagClass.magazzino.CodSoggCurrUser, "", "", "", 0);
          }
        }
        catch
        { }
        return answ;
      }
    }
    /// <summary>
    /// Codice AL target
    /// </summary>
    public override string destAL
    {
      get
      {
        return lblAL.Text.Trim();
      }
      set
      {
        lblAL.Text = value;
      }
    }
    /// <summary>
    /// controlla particolare selezionato
    /// </summary>
    public override void checkParticolare()
    {
      if (currParticolare != "")
      {
        lblParticolareAttivo.Text = string.Format("Particolare selezionato <b>{0}</b>", currParticolare);
        // aggiungo descrizione del particolare
        string descr = "";
        string disegno = "";
        try
        {
          DS_magazzino.AnagParticolariRow riga = MagClass.magazzino.taAnagPart.likeSearch(currParticolare, memLayer.ML.StringSessionObj("CodCS"))[0];
          descr = riga.DescParticolare;
          disegno = string.Format("( {0} )", riga.DisegnoGrezzo);
        }
        catch
        { }
        lblDescrAttivo.Text = descr;
        lblDisegno.Text = disegno;
      }
      else
      {
        lblParticolareAttivo.Text = "...";
        lblDescrAttivo.Text = "";
        lblDisegno.Text = "";
      }
    }
    /// <summary>
    /// sistemo labels oggetti
    /// </summary>
    public override void traduciObj()
    {
      //txtBox
      txtQta.Text = memLayer.ML.cdv("QtaImballoSterr");
      // buttons
      btnEmptyNote.Text = traduci("btnEmptyNote");
    }
    /// <summary>
    /// valore barcode
    /// </summary>
    public override string barcodeIn
    {
      get
      {
        return txtBarcode.Text.Trim();
      }
      set
      {
        txtBarcode.Text = value;
      }
    }
    /// <summary>
    /// qta pezzi TOTALE
    /// </summary>
    public override int qta
    {
      get
      {
        int qta = 0;
        try
        {
          qta = Convert.ToInt32(txtQta.Text.Trim());
        }
        catch
        { }
        return qta;
      }
      set
      {
        txtQta.Text = value.ToString();
      }
    }
    /// <summary>
    /// Note utente effettive
    /// </summary>
    public override string campoNote
    {
      get
      {
        return txtNote.Text.Trim();
      }

      set
      {
        txtNote.Text = value;
      }
    }
    /// <summary>
    /// controlla se ci sia un barcode
    /// </summary>
    public override void checkBarcode()
    {
      if (barcodeIn != "")
      {
        Postazione.messaggiText = string.Format("Barcode digitato: {0}", barcodeIn);
        Postazione.warningText = "";
        switch (MagClass.tipoBCode_L3(barcodeIn))
        {
          case tipoCodiceBarcode.UDC:
            // effettuo controlli che destAL siano disponibili...
            if (destAL != "ALS00")
            {
              // procedo solo se UDC esistente
              if (MagClass.magazzino.checkUDC(barcodeIn))
              {
                // controllo se NON ci siano NC "pending"
                if (MagClass.magazzino.checkUDC_NC(barcodeIn) != checkUdcNc.HasNc)
                {
                  /********************************************************************
                  * procedo per UDC in ingresso:
                  * - deve essere di tipo IN
                  * - se NON c'è UDC in AL dest a parti particolare LO CREO
                  * - se c'era già UDC per lo stesso particolare --> consumo (il vecchio)
                  * - associo UDC letto ad UDC in AL dest a pari particolare
                  * 
                  ********************************************************************/

                  // controllo IdxPosizione dell'UDC e confronto con posizione in webconfig x fusi (pre sterratura/taglio)
                  int IdxPosizione = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].IdxPosizione;
                  if (IdxPosizione == memLayer.ML.cdvi("IdxPosizioneFusi"))
                  {

                    // calcolo nuovo particolare
                    string newPart = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;
                    string udcDest = "";
                    // imposto particolare!
                    currParticolare = newPart;
                    // verifico che il particolare NON SIA in veto...
                    if (checkPartVetoByLinea(currParticolare))
                    {
                      Postazione.messaggiText += $" - Attenzione, PARTICOLARE {currParticolare} NON ATTIVATO / NON PERMESSO sulla LINEA!";
                      Postazione.CssClass = "stileComandoKo";
                    }
                    else
                    {
                      int idxCellaCurr = 0;
                      try
                      {
                        idxCellaCurr = MagClass.magazzino.taPosUdcCorr.getByUDC(barcodeIn)[0].IdxCella;
                      }
                      catch
                      { }
                      string codBloccoCurr = "";
                      int idxBlocco = 0;
                      try
                      {
                        idxBlocco = MagClass.magazzino.taCelle.getByIdxCella(idxCellaCurr)[0].IdxBlocco;
                        codBloccoCurr = MagClass.magazzino.taBlocchi.getByIdx(idxBlocco)[0].CodBlocco;
                      }
                      catch
                      { }

                      // 2015.01.12 controllo UDC non già su altre postazioni...
                      if (codBloccoCurr == Postazione.currCodBlocco && idxCellaCurr != Postazione.currIdxCella)
                      {
                        Postazione.messaggiText += " - Attenzione, UDC già caricato su ALTRA LINEA!";
                        Postazione.CssClass = "stileComandoKo";
                      }
                      else
                      {
                        // controllo SE esista già UDC in AL dest... altrimenti CREO!!!
                        udcDest = checkCreaUDC(true, true);

                        // verifico che NON SIA GIA' associato...
                        bool udcGiaAssociato = false;
                        try
                        {
                          udcGiaAssociato = MagClass.magazzino.checkAssociazioneUdcParent(udcDest, barcodeIn);
                        }
                        catch
                        { }
                        if (!udcGiaAssociato)
                        {
                          // associo UDC con quello di destinazione SE NECESSARIO
                          MagClass.magazzino.associaUdcParent(udcDest, barcodeIn, true);
                        }
                        // controllo se UDC non sia già stato spostato in posizione... dsMagazzino, posizUdcCorrente, getByUdc
                        if (idxCellaCurr == Postazione.currIdxCella)
                        {
                          Postazione.messaggiText += " - Attenzione, UDC già caricato!";
                          Postazione.CssClass = "stileComandoKo";
                          // controllo SE esista già UDC in AL dest... altrimenti CREO!!!
                          checkCreaUDC(true, true);
                        }
                        else
                        {
                          // verifico per eventuale consumo vecchio UDC... cerco nella posizione
                          DS_magazzino.v_UdcDetailDataTable tabUdcDet = null;
                          try
                          {
                            // cerco nella posizione
                            tabUdcDet = MagClass.magazzino.taDettUDC.getUdcDetailByIdxCella(idxCella);
                          }
                          catch
                          { }
                          // carico UDC letto in cella...
                          DateTime adesso = DateTime.Now;
                          string noteTrim = Postazione.currNomeLinea;
                          // cerco se NON ci sia l'UDC letto...
                          if (tabUdcDet.Select(string.Format("UDC = '{0}'", barcodeIn)).Length == 0)
                          {
                            string oldUdc = "";
                            try
                            {
                              oldUdc = ((DS_magazzino.v_UdcDetailRow)tabUdcDet.Select(string.Format("Particolare = '{0}'", currParticolare))[0]).UDC;
                            }
                            catch
                            { }
                            // se trovo un altro UDC dello stesso particolare...
                            if (oldUdc != "")
                            {
                              // consumo UDC
                              consumaUdc(oldUdc);
                            }

                            // se ho cod cella sposto UDC in nuova posizione!
                            MagClass.magazzino.spostaUDC(memLayer.ML.StringSessionObj("CodCS"), barcodeIn, Postazione.currIdxCella, memLayer.ML.confReadBool("spostaUdcResettaLdp"), Request.UserHostName);
                            // registro spostamento UDC
                            MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, barcodeIn, currParticolare, "spostaUDC", string.Format("Caricato UDC Fusi su linea {2}, qta: {0} {1} ", qta, noteTrim, Postazione.currCodLinea));

                          }
                          Postazione.CssClass = "stileComandoOk";
                        }
                      }
                    }
                  }
                  else
                  {
                    // udc NON corretto, mostro errore...
                    Postazione.messaggiText += " - Attenzione, UDC NON VALIDO (IdxPosizione)!";
                    Postazione.CssClass = "stileComandoKo";
                  }
                  // controllo SE PER CASO ci fosse NC e ci sia stata deroga, cambio MSG...
                  if (MagClass.magazzino.checkUDC_NC(barcodeIn) == checkUdcNc.ChkDis_HasNc)
                  {
                    Postazione.CssClass = "stileComandoKo";
                    Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
                    // recupero l'NC associata...
                    Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
                  }
                }
                else
                {
                  Postazione.CssClass = "stileComandoKo";
                  Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-NC-001"));
                  // recupero l'NC associata...
                  Postazione.warningText += string.Format("<br />{0}", MagClass.magazzino.getDescrNc2Udc(barcodeIn));
                }
              }

              // update 
              doUpdate();
            }
            else
            {
              Postazione.CssClass = "stileComandoKo";
              Postazione.messaggiText += string.Format("<br />{0}", traduci("ERR-ALS00"));
            }

            break;
          case tipoCodiceBarcode.Operatore:
            // calcolo matricola utente
            int MatrUtente = -1;
            string preCodSogg = memLayer.ML.AppConf["prefCodSogg"];
            if (barcodeIn.StartsWith(preCodSogg))
            {
              MatrUtente = DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0)[0].CodMatricola;
            }
            else
            {
              MatrUtente = Convert.ToInt32(barcodeIn);
            }
            if (MatrUtente >= 0)
            {
              // salvo in sessione operatore con AUTH
              OpAuth.startOpAuth(MatrUtente);
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRec");
              Postazione.CssClass = "stileComandoOk";
              Response.Redirect(user_std.pagCorrente);
            }
            else
            {
              Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
              Postazione.CssClass = "stileComandoND";
            }
            break;
          default:
            // cerco se sia "0" = reset utente...
            if (barcodeIn == memLayer.ML.CRS("resetCodSogg"))
            {
              // salvo in sessione operatore con AUTH
              OpAuth.stopAuth();
              // mostro che ho autorizzato...
              Postazione.messaggiText += traduci("userAuthRem");
              Postazione.CssClass = "stileComandoOk";
              Response.Redirect(user_std.pagCorrente);
            }
            Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
            Postazione.CssClass = "stileComandoND";
            break;
        }
        barcodeIn = "";
      }
      txtBarcode.Focus();
    }
    /// <summary>
    /// crea eventualmente UDC per particolare in AL di destinazione e restituisce codice UDC
    /// </summary>
    /// <param name="forceMove">Forza lo spostamento a idxCella corrente...</param>
    /// <param name="createUdcOut">indica se si debba creare UDC in uscita se mancasse...</param>
    public override string checkCreaUDC(bool forceMove, bool createUdcOut)
    {
      string udcDest = "";
      DateTime adesso = DateTime.Now;
      // verifico se ho già quel particolare tra quelli dell'AL...
      try
      {
        udcDest = MagClass.magazzino.taCartellini.getByParticolareAL(currParticolare, destAL)[0].UDC;
      }
      catch
      {
        udcDest = "";
      }
      if (string.IsNullOrEmpty(udcDest))
      {
        try
        {
          // creo nuovo UDC ST... direttamente in posizione definitiva e con un evento differente...
          udcDest = MagClass.magazzino.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, memLayer.ML.cdv("CodImballoSterr"), "U", MagClass.magazzino.CodSoggCurrUser, 0, 0, 0, adesso, 0, statoUDC, memLayer.ML.cdvi("IdxPosizioneSterratiTemp"), "IdxPosizioneSterratiTemp", eventoUDC, "", "", adesso.Year, Request.UserHostName);
          // associo UDC a AL...
          MagClass.magazzino.taAL2UDC.Insert(destAL, udcDest, adesso, MagClass.magazzino.CodSoggCurrUser);
        }
        catch (Exception exc)
        {
          logger.lg.scriviLog(string.Format(new CultureInfo("en-US"), "Errore in creazione UDC temp ST x travaso: {0}{1}", Environment.NewLine, exc));
        }
      }
      if (!string.IsNullOrEmpty(udcDest))
      {
        Postazione.CssClass = "stileAttesa";
        Postazione.warningText = "";
        Postazione.messaggiText = traduci("partAdded");
      }
      else
      {
        Postazione.CssClass = "stileComandoKo";
        Postazione.warningText = traduci("ErroreUdcDest");
      }
      grViewDest.DataBind();
      return udcDest;
    }
    /// <summary>
    /// aggiorna tabella + focus a barcode
    /// </summary>
    public override void doUpdate()
    {
      base.doUpdate();
      grView.DataBind();
      grViewDest.DataBind();
      txtBarcode.Focus();
      // raise dell'evento
      raiseEvent(ucEvType.ReqUpdateParent);
    }
    /// <summary>
    /// controllo l'abilitazione alla stampa UDC:
    /// - particolare ok
    /// - qta > 0
    /// - udc da consumo totale/parziale
    /// altrimenti disabilito btn stampa
    /// </summary>
    public override void checkStampa()
    {
      bool stampaOk = false;
      //controllo siano inseriti valori qta
      if (numCesta != "" && numCesta != "0000" && qta > 0 && grViewDest.SelectedIndex >= 0)
      {
        // controllo ci siano particolare
        if (currParticolare != "")
        {
          stampaOk = true;
          txtNote.Focus();
        }
      }
      divNote.Visible = stampaOk;
    }
    /// <summary>
    /// genera i barcode di
    /// - trattamenti
    /// - nuovo x pezzi liquidi
    /// e lancia la relativa stampa
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public override void btnStampa_Click(object sender, EventArgs e)
    {
      bool needsRedirect = false;
      string[] stringSeparators = new string[] { "#" };
      // verifico postazione x procedere...
      if (Postazione.printer != "n.d.")
      {
        // verifico auth utente OPPURE se NON sia richiesta...
        if (OpAuth.isAuth || !OpAuth.opAuthReq)
        {
          DateTime adesso = DateTime.Now;
          string noteTrim = txtNote.Text.Trim();
          string lineaCesta = string.Format("{0} | cesta: {1}", Postazione.currNomeLinea, numCesta);
          noteTrim = string.Format("{0}{1}{2}", lineaCesta, Environment.NewLine, noteTrim);

          // effettuo controlli che cod_soggetto, cod particolare e destAL siano disponibili...
          if (MagClass.magazzino.CodSoggCurrUser != "" && currParticolare != "" && destAL != "ALS00")
          {

            // aggiorno note e  posizione da temp a definitivo x UDC...
            MagClass.magazzino.updateNotePosizioneDataUDC(currUDC, noteTrim, memLayer.ML.cdvi("IdxPosizioneSterrati"), DateTime.Now);

            if (OpAuth.isAuth)
            {
              // salvo attributo dell'OpAuth...
              MagClass.magazzino.taAtt2UDC.Insert(currUDC, memLayer.ML.CRS("attrOpAuth"), OpAuth.currAuth.CodSoggetto, DateTime.Now, MagClass.magazzino.CodSoggCurrUser);
              // consumo una auth...
              OpAuth.currAuth.remAuth--;
              if (OpAuth.currAuth.remAuth == 0)
              {
                OpAuth.stopAuth();
                needsRedirect = true;
              }
            }

            // registro creazione nuovo UDC
            MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, currUDC, currParticolare, "creaUDC", string.Format("Creato nuovo UDC Sterr Taglio, qta: {0} {1}", qta, ""));
            // tolgo UDC da AL corrente...
            MagClass.magazzino.taAL2UDC.deleteQuery(destAL, currUDC);

            // ora stampo il nuovo cartellino!!!
            MagClass.magazzino.stampaUdc(currUDC, Postazione.printer, tipoCartellino.cartSterr, Request.UserHostName);
            // incremento timing...
            adesso = adesso.AddSeconds(2);
            // registro stampa nuovo UDC
            MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, currUDC, currParticolare, "stampaUDC", "Stampato UDC Sterrato");
            // svuoto campo cesta...
            numCesta = "";

            // 2016.06.15 modifica per creare subito un NUOVO UDC connesso a quello in origine... QTA 0 !!!
            string udcParent = "";
            // recupero parent... IL PIU RECENTE!!!
            try
            {
              udcParent = MagClass.magazzino.getUdcParentDesc(currUDC);
            }
            catch
            { }
            // controllo che sia DAVVERO caricato UDC parent...
            string oldUdc = "";
            // verifico per eventuale consumo vecchio UDC... cerco nella posizione
            DS_magazzino.v_UdcDetailDataTable tabUdcDet = null;
            try
            {
              // cerco nella posizione
              tabUdcDet = MagClass.magazzino.taDettUDC.getUdcDetailByIdxCella(idxCella);
            }
            catch
            { }
            try
            {
              oldUdc = ((DS_magazzino.v_UdcDetailRow)tabUdcDet.Select(string.Format("UDC = '{0}'", udcParent))[0]).UDC;
            }
            catch
            { }
            // PROCEDO SOLO SE HO UN UDC IN INGRESSO!!!
            if (udcParent != "" && oldUdc != "")
            {
              // controllo SE esista già UDC in AL dest... altrimenti CREO!!!
              string udcDest = "";
              udcDest = checkCreaUDC(true, true);
              // associo UDC con quello di destinazione
              MagClass.magazzino.associaUdcParent(udcDest, udcParent, true);
              // registro creazione nuovo UDC
              MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, currUDC, currParticolare, "creaUDC", string.Format("Creato ed associato nuovo UDC Sterr Taglio con codice {2}, qta: {0}, UDC Parent: {1}", qta, udcParent, udcDest));
            }
            // resetto
            doResetData();
          }
          else
          {
            httpLog(string.Format("STERRATI, Errore persi utente/particolare, ricarico!"), tipoLog.ERROR);
            Response.Redirect("~/login.aspx");
          }
        }
        else
        {
          Postazione.messaggiText = traduci("noOpAuth");
          Postazione.CssClass = "stileComandoKo";
          httpLog(string.Format("Errore manca OpAuth x UDC anime"), tipoLog.ERROR);
        }
      }
      else
      {
        Response.Redirect("~/menu.aspx");
      }
      doUpdate();
      // raise dell'evento
      raiseEvent(ucEvType.ReqUpdateParent);
      if (needsRedirect)
      {
        Response.Redirect(user_std.pagCorrente);
      }
    }

    /// <summary>
    /// effettua reset dati
    /// </summary>
    public override void doResetData()
    {
      txtQta.Text = "";
      grViewDest.SelectedIndex = -1;
      base.doResetData();
    }
    /// <summary>
    /// passo alla modalità IN
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnIn_Click(object sender, EventArgs e)
    {
      Response.Redirect("SterrTaglioIN.aspx");
    }
    /// <summary>
    /// traduce gli header delle colonne
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_DataBound(object sender, EventArgs e)
    {
      if (grView.Rows.Count > 0)
      {
        LinkButton lb;
        // aggiorno gli headers        
        foreach (TableCell cella in grView.HeaderRow.Cells)
        {
          try
          {
            lb = (LinkButton)cella.Controls[0];
            lb.Text = traduci(lb.Text);
          }
          catch
          { }
        }
        int totRecord = grView.Rows.Count + grView.PageSize * (grView.PageCount - 1);
        lblNumRec.Text = string.Format("{0} records of ~ {1}", grView.Rows.Count, totRecord);
      }
      else
      {
        lblNumRec.Text = "";
      }
    }
    /// <summary>
    /// evento selezione grView destinazione: ricarico dati!
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grViewDest_SelectedIndexChanged(object sender, EventArgs e)
    {
      // ricarico dati dell'UDC come particolare e quantità...
      currUDC = grViewDest.SelectedDataKey["UDC"].ToString();
      if (MagClass.magazzino.checkUDC(currUDC))
      {
        currParticolare = DataProxy.obj.taCartellini.stp_getByUdc(currUDC)[0].Particolare;
        qta = Convert.ToInt32(DataProxy.obj.taCartellini.stp_getByUdc(currUDC)[0].Qta);
      }
      Postazione.messaggiText = traduci("partSelected");
      Postazione.warningText = "";
      Postazione.CssClass = "stileComandoOk";
      doChecks();
      doUpdate();
      // fisso focus su note!
      txtNote.Focus();
    }
    /// <summary>
    /// sistema modalità input
    /// </summary>
    public override void setVisibility()
    {
      bool showBtn = false;
      // ora controllo btn quantità
      if (grViewDest.SelectedIndex >= 0)
      {
        showBtn = true;
      }
      divQta.Visible = showBtn;
    }
    /// <summary>
    /// reset della selezione
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public override void btnReset_Click(object sender, EventArgs e)
    {
      grViewDest.SelectedIndex = -1;
      base.btnReset_Click(sender, e);
    }

    /// <summary>
    /// gestione specifica update qta
    /// </summary>
    public override void aggiornaQta()
    {
      base.aggiornaQta();
      grViewDest.SelectedIndex = -1;
      setVisibility();
      doUpdate();
    }
    /// <summary>
    /// Numero cesta inserito
    /// </summary>
    public string numCesta
    {
      get
      {
        return txtCesta.Text.Trim();
      }
      set
      {
        txtCesta.Text = value;
      }
    }
    /// <summary>
    /// evento cambio num cesta/grappolo
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtCesta_TextChanged(object sender, EventArgs e)
    {
      txtCesta.Text = txtCesta.Text.ToUpper().Trim().PadLeft(4, '0').Substring(0, 4);
      doUpdate();
    }

    /// <summary>
    /// qui la selezione è x scaricare...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void grView_SelectedIndexChanged(object sender, EventArgs e)
    {
      consumaUdc(grView.SelectedValue.ToString());
      doUpdate();
    }
  }
}