23 messaggi dal 23 novembre 2006
Ciao,

ho una listbox e un linkbutton creati a runtime, alla pressione del linkbutton tutti gli elementi selezionati nella listbox devono essere eliminati.

Ho provato in questo modo:
if (IsPostBack)
{
ListBox lstTemp = new ListBox();
lstTemp = (ListBox)PlaceHolder1.FindControl("lstbox1");

foreach (ListItem item in lstTemp.Items)
{
if (item.Selected == true)
{
lstTemp.Items.Remove(item);
}
}
}

ma mi accorgo, già prima del foreach, che la proprietà selected di ogni item è settata su false anche se alcuni di loro sono selezionati. L'oggetto è rappresentato correttamente perchè ha tutti gli items giusti, con la sola differenza che lo stato "selected" di ogni item è su false.
Come posso recuperare lo stato "selected" (dopo il postback) per tutti quei item selezionati prima del postback?

Grazie in anticipo.
Modificato da francescogt il 16 luglio 2009 18.06 -

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
francescogt wrote:
Come posso recuperare lo stato "selected"
(dopo il postback) per tutti quei item selezionati prima del postback?

evita di creare ad ogni postback gli elementi, altrimenti perderai il loro stato. e possibilmente controlla nel Page_Load, perchè nell'Init lo stato non è ancora stato caricato.
.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
23 messaggi dal 23 novembre 2006
Il punto è che al postback devo necessariamente ricreare gli oggetti, altrimenti non posso accedervi. Tutto il codice viene eseguito già nel page_Load, non nell'init.

Se perdo il loro stato, come posso ovviare a questo problema? I dati che servono sono soltanto gli items selected, o al massimo l'indice degli elementi selezionati. Come posso eliminare quegli elementi senza effettuare il postback?

p.s i controlli sono in un placeholder. Al postback io non perdo lo stato perchè tutti gli item selezionati rimangono selezionati, ma recuperando il controllo da codice non mantiene gli item selezionati.

Grazie per l'interessamento.
Modificato da francescogt il 17 luglio 2009 18.32 -

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
3.939 messaggi dal 28 gennaio 2003
così mi pare che funzioni
Option Strict On
Imports l = libreria.ModuloWeb

Partial Class prove_a
    Inherits System.Web.UI.Page

    Private dd As ListBox
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        dd = New ListBox()
        dd.SelectionMode = ListSelectionMode.Multiple
        msole.FillListControl(dd, New ListItem("text1", "value1"), New ListItem("text2", "value2"), New ListItem("text3", "value3"))
        Me.PlaceHolder1.Controls.Clear()
        Me.PlaceHolder1.Controls.Add(dd)

    End Sub

    Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
        For i As Integer = dd.Items.Count - 1 To 0 Step -1
            Dim item As ListItem = dd.Items(i)
            If item.Selected Then
                dd.Items.RemoveAt(i)
            End If
        Next
    End Sub

End Class
francescogt ha scritto:
Il punto è che al postback devo necessariamente ricreare gli oggetti, altrimenti non posso accedervi. Tutto il codice viene eseguito già nel page_Load, non nell'init.


non mi sono spiegato: certo che devi ricreare i controlli, non devi ripopolarli, cioè rifare il databinding. se lo rifai, lo stato precedente viene azzerato, se non lo fai, la lista viene popolata dallo stato precedente.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
3.939 messaggi dal 28 gennaio 2003
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.
23 messaggi dal 23 novembre 2006
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 -

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.
23 messaggi dal 23 novembre 2006
Può sembrare assurdo, ma ho riscritto il codice in una pagina aspx e tutto funziona come dovrebbe!!! Allora il problema è lo UserControl? Ormai la soluzione l'ho trovata, ma qualcuno di voi mi sa spiegare questo dilemma?
Grazie.

Un sistema deve essere sempre concepito in modo da resistere alla peggiore combinazione possibile di circostanze.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.