Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    CheckBoxList a run-time: salvare lo stato

    Ciao a tutti,
    è da quasi una settimana che sto su un problema!

    Ho gia cercato a fondo sul forum, ma non sono riuscito a trovare nulla che potesse fare al caso mio, anche se ci sono decine di 3D che parlano di CheckBoxList

    Ho 2 pulsanti: uno mi crea una CheckBoxList a run-time; l'altro mi dovrebbe stampare a video (sempre sulla stessa pagina) il valore delle checkbox selezionate.

    Quando creo la CheckBoxList e la popolo, mi salvo su due variabili di sessione l'oggetto appena creato ed i singoli elementi
    codice:
    while(read.Read())
    {
      //list item
      newItem = new ListItem();
      newItem.Text=read.GetString(1);
      newItem.Value = readEMAIL.GetString(11);
      myChkList.Items.Add(newItem);
      Page.FindControl("Form1").Controls.Add(myChkList);
      
      Session["chk"]=myChkList;
      Session["chkItem"]=newItem;
    }
    read.Close();
    Ma appena premo il pulsante per stampare il valore delle checkbox arrivano due problemi:
    - il primo è che l'handler "SelectedIndexChanged" non viene chiamato sebbene abbia dichiarato sulla "#region" il metodo corrispondente (ho verificato che se uso lo stesso controllo a design-time, "SelectedIndexChanged" funziona correttamente);
    - l'altro è che i valori dei singoli elementi nella CheckBoxList sono tutti settati a False

    codice:
    foreach(ListItem Itm in ((CheckBoxList)Session["chk"]).Items)
    {
      if (Itm.Selected)
      {
         Response.Write(Itm.Text);
      }
    }
    Come faccio a salvarmi lo stato delle singole checkbox?

  2. #2
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    mi pare di capire.........tu leggi da db tramite di Reader dei dati. Per ogni record crei un checkbox e lo valorizzi in base ai dati letti. in seguito aggiungi le checkbox alla pagina. Fino a qua tutto bene. A che ti serve salvare in sessione l'ultime checkbox creata non l'ho capito.....

    prima devi assegnare in ID ai controlli utilizzando un contatore all'interno del ciclo di creazione. In seguito recuperi i controlli untilizzando il metodo FindControl della classe page e mandi a video i valori

  3. #3
    Ciao edaje, grazie per avermi risposto
    Originariamente inviato da edaje
    mi pare di capire.........tu leggi da db tramite di Reader dei dati.
    esatto...

    Per ogni record crei un checkbox e lo valorizzi in base ai dati letti. in seguito aggiungi le checkbox alla pagina. Fino a qua tutto bene.
    questo non è esatto, ma sicuramente sono io che non sono riuscito a spiegarmi bene (perdonami, visto che ci sto diventando scemo).
    Ho creato un solo oggetto CheckBoxList che vado a popolare con una ListItem che prende i valori da un DB...

    A che ti serve salvare in sessione l'ultime checkbox creata non l'ho capito.....
    scusami ancora, mi sono dimenticato di levare l'istruzione: faceva parte della serie infinita di tentativi che sto facendo :rollo:

    prima devi assegnare in ID ai controlli utilizzando un contatore all'interno del ciclo di creazione. In seguito recuperi i controlli untilizzando il metodo FindControl della classe page e mandi a video i valori
    Ho provato a fare come dici tu, ma la ListItem non ha una definizione per "ID"...

    L'unico oggetto a cui posso associare un ID è la CheckBoxList (myChkList), ma il problema persiste, visto che alla pressione del pulsante l'oggetto mi risulta "nuovo"...o almeno è questo che penso io, considerato che se mi faccio stampare il numero di record con Response.Write(((CheckBoxList)Session["chk"]).Items.Count); mi da il numero esatto degli elementi presenti nella checkboxlist :master:

  4. #4
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    while(read.Read())
    {
    //list item
    newItem = new ListItem();
    newItem.Text=read.GetString(1);
    newItem.Value = readEMAIL.GetString(11);
    myChkList.Items.Add(newItem);
    Page.FindControl("Form1").Controls.Add(myChkList);

    Session["chk"]=myChkList;
    Session["chkItem"]=newItem;
    }
    read.Close();

    questo codice contiene un errore. In questo modo ad ogni passaggio del ciclo sovrascrivi le variabili di sessione, Quindi alla fine terrai in sessione solo l'ultima checkbox. Quello che devi fare è assegnare un ID alle checkbox mentri esegui il ciclo
    int i = 0;
    while(read.Read())
    {
    CheckBox myChkList = new CheckBox();
    myChkList.ID = "id"+i.ToString();
    i = i+1;
    }

    nell'evento onclick del bottone vai a recuperare i controlli con il metodo FindControl

  5. #5
    Perdona la mia ignoranza, ma è solo da poco che ho cominciato a lavorare con le asp.net

    cmq, ho provato come mi suggerisci, ma ottengo sempre il seguente messaggio di errore: Riferimento a un oggetto non impostato su un'istanza di oggetto

    questo è il codice che ho associato al pulsante:
    codice:
    for(int i=1; i<Page.FindControl("Form1").Controls.Count; i++)        
    {          
      Response.Write(Page.FindControl("ID"+i.ToString()).ID.ToString());        
    }
    ...e l'errore è segnalato sulla riga del Response.Write

    per cortesia, chi mi sa dire dove sbaglio?

  6. #6
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    in questo modo cicli su tutti i controlli del form e non solo sulle checkbox. Metti il Response.Write all'interno di un blocco try catch

  7. #7
    forse ho capito quello che vuoi dire!

    con il codice da me utilizzato posso avere anche un ID che non esiste, vero? ed è per questo che mi da errore!

    ora provo!

  8. #8
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    esatto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.