pietro09 ha scritto:
Ho riprovato e il codice funziona, sia come ho fatto, sia leggendo i dati da database.
Il controllo deve essere creato e popolato sempre. Deve però non essere disabilitato il viewsstate del PlaceHolder.
Da premettere che gli items non vengono inseriti ad ogni load della pagina, ma soltanto alla pressione di un tasto.
I controlli listbox vengono generati esattamente come hai fatto tu. Gli items di queste listbox create a runtime vengono aggiunti tramite dei linkbutton, che prendono l'elemento selezionato da una listbox (creata staticamente) e lo aggiungono alla listbox a runtime. Ora posto il mio codice per farvi comprendere ancora meglio.
NB: per ogni listbox creata a runtime ci sono 2 linkbutton che vengono creati; 1 per aggiungere gli items, 2 per rimuovere. è sul pulsante rimuovi che c'è il problema degli item selected = false (anche se sono selezionati).
Questo è uno UserControl.
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
//rigenero/genero i T e i relativi controlli
GeneraControlli();
//recupero l'id del controllo che ha generato il postback
string ctrl = Page.Request.Params.Get("__EVENTTARGET");
//se il pulsante incolla ha generato il postback
if (ctrl.Contains("btnAdd") == true)
{
//ottengo l'id della listbox da cercare relativa al pulsante premuto
string lstID = "lst" + ctrl.Remove(0, 61);
//aggiungo gli elementi selezionati nella list statica in quella a runtime.
//e quì non ci sono problemi
}
//se il pulsante rimuovi ha generato il postback
if (ctrl.Contains("btnRem") == true)
{
//recupero l'id della listbox da modificare
string lstID = "lst" + ctrl.Remove(0, 61);
RimuoviItemsT(lstID);
}
}
public void Controlli(int _numControlli, string _nomeT, string _nP)
{
PlaceHolderT.Controls.Add(new LiteralControl("<tr>"));
for (int i = 1; i <= _numControlli; i++)
{
//genero i controlli
Label lblT = new Label();
ListBox T = new ListBox();
LinkButton btnAdd = new LinkButton();
LinkButton btnRem = new LinkButton();
//imposto gli ID dei controlli
T.ID = "lst" + _nomeT + i;
btnAdd.ID = "btnAdd" + _nomeT + i;
btnRem.ID = "btnRem" + _nomeT + i;
//assegno i valori
btnAdd.Text = "Incolla";
btnRem.Text = "Rimuovi";
T.Width = 200;
T.Height = 150;
T.SelectionMode = ListSelectionMode.Multiple;
//genero i controlli
//ogni 4 listbox crea una nuova riga
if (i % 5 == 0)
PlaceHolderT.Controls.Add(new LiteralControl("</tr><tr>"));
PlaceHolderT.Controls.Add(new LiteralControl("<td>"));
PlaceHolderT.Controls.Add(lblT);
PlaceHolderT.Controls.Add(new LiteralControl("<br/>"));
PlaceHolderT.Controls.Add(btnAdd);
PlaceHolderT.Controls.Add(new LiteralControl(" "));
PlaceHolderT.Controls.Add(btnRem);
PlaceHolderT.Controls.Add(new LiteralControl("<br/>"));
PlaceHolderT.Controls.Add(T);
PlaceHolderT.Controls.Add(new LiteralControl("</td>"));
}
PlaceHolderT.Controls.Add(new LiteralControl("</tr><tr><td colspan='4'><hr></td></tr>"));
}
public void RimuoviItemsT(string _idLstBoxT)
{
//creo un controllo di appoggio
ListBox lstT = new ListBox();
lstT = (ListBox)PlaceHolderT.FindControl(_idLstBoxT);
//già a questo punto in debug ogni elemento della listbox in questione è deselezionato
//Gli items presenti sono gli items giusti della listbox interessata con la sola differenza
//che sono tutti deselezionati. E' questo il problema:mantenere lo stato selected di ogni items
//anche dopo il postback dei controlli runtime. Una cosa strana: nel debug sono tutti selected = false
//nella pagina sono mantenuti gli elementi selected.
//genero una lista che conterrà tutti gli item da cancellare
List<ListItem> itemCestino = new List<ListItem>();
//ciclo tutti gli elementi di lst Statica
foreach (ListItem item in lstT.Items)
{
//se l'elemento corrente è selezionato
if (item.Selected == true)
{
//aggiungo l'elemento selezionato nella lista degli I
lstI.Items.Add(item);
//setto la lista garbage/cestino
itemCestino.Add(item);
}
}
//per la cancellazione degli I assegnati ai T
foreach (ListItem item in itemCestino)
{
lstT.Items.Remove(item.Value);
}
itemCestino.RemoveRange(0, itemCestino.Count);
}
Grazie ancora.
Francesco
Modificato da francescogt il 20 luglio 2009 18.03 -