2015-09-24 27 views
9

Ho il seguente codice nel codice aspx. Volevo aggiungere le caselle di controllo ListItem a ColumnsList e trovare tutti quelli selezionati sul clic del pulsante.CheckBoxList ListItem Conta sempre 0 dopo l'aggiunta dinamica dei dati

Ma quando cerco di ottenere gli elementi selezionati sul pulsante clicca il conteggio ColumnsList diventa 0.

<asp:checkboxlist runat="server" EnableViewState="true" id="ColumnsList"/> 

Nel codice dietro aggiungo i dati al mio ColumnsList come segue

public override void OnLoad() 
{ 
    if(!this.IsPostBack) 
    { 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" }); 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" }); 
    } 
} 

// Qui è l'ascoltatore del clic sul pulsante

private void Button_Click(object sender, EventArgs eventArgs) 
{ 
    // Count is 0 instead of 2 
    var count = this.ColumnsList.Items.Count; 
    foreach(ListItem item in this.ColumnsList.Items) 
    { 
     var selected = item.Selected; 
     // add selected to a list..etc 

    } 
}   

Nota: l'applicazione viene distribuita nel punto di condivisione 2010.

risposta

4

Ho finito per spostare il codice che carica l'elenco da pageload a OnInit come segue e ha funzionato.

protected override void OnInit(EventArgs e) 
{ 
    this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" }); 
    this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" }); 

}

2

Si dovrebbe aggiungere dati dinamici sul PreInit evet quando è necessario Reate o ricreare i controlli dinamici:

protected override void OnPreInit(EventArgs e) 
{ 
    if(!this.IsPostBack) 
    { 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" }); 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" }); 
    } 
} 

More information su ciclo di vita pagina.

2

Il codice funziona bene nella mia soluzione ad eccezione dei seguenti:

L'implementazione della vostra OnLoad non ha i EventArgs parametro override. Nella mia soluzione, è un requisito per dichiarare il parametro EventArgs in OnLoad().

protected override void OnLoad(EventArgs e) 
{ 
    //base.OnLoad(e); 
    if(!this.IsPostBack) 
    { 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" }); 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" }); 
    } 
} 

E, infine, è il separatore virgola Text='text' Value='value' per Text='text', Value='value' Tutto il resto funziona bene.

MODIFICA: ecco l'implementazione del mio pulsante.

protected void Button_Click(object sender, EventArgs e) 
{ 
    foreach (ListItem itemList in ColumnsList.Items) 
    { 
     if (itemList.Selected) 
     { 
      // selected 
     } 
    } 
} 
+0

Ho fatto una modifica man..kindly dare un'occhiata .. –

+0

semplicemente perfetto. @Amete mi sto chiedendo anche se hai scritto metodo privato per il clic del pulsante che sta colpendo debug poing? – Suresh

+0

oh, quindi si prega di spostare i vostri commenti il ​​loro post, la sua confusione. :) –

6

Ho provato a simulare quello che stavi cercando e qui è la soluzione passo dopo passo.

Fase 1: Invece di creare override OnLoad() metodo, è possibile utilizzare Page_Load() metodo per aggiungere elementi al controllo ComboBoxList, come sotto. Nondimenticare per inserire un comma tra Text e Value mentre si crea un nuovo ListItem.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!this.IsPostBack) 
    { 
     this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" }); 
     this.ColumnsList.Items.Add(new ListItem { Text = "Text2", Value = "value2" }); 
     this.ColumnsList.Items.Add(new ListItem { Text = "Text3", Value = "value3" }); 
     this.ColumnsList.Items.Add(new ListItem { Text = "Text4", Value = "value4" }); 
    } 
} 

Fase 2: Dopo questo, ho creato un evento click del pulsante come la tua, ma scritto unica linea singola lì per ottenere il numero di elementi selezionati come indicati di seguito.

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var count = this.ColumnsList.Items.Cast<ListItem>().Count(li => li.Selected); 
} 

Nota: Controlla il tuo evento click del pulsante.this.ColumnsList.Items.Count restituirà il conteggio degli elementi presenti in ComboBoxList e item.Selected da loop ti dirà se l'elemento è stato selezionato o meno. Tuttavia, var selected ti darà lo stato dell'ultimo elemento, poiché stai sovrascrivendo il suo valore per ciascun elemento.

+0

Grazie per aver dedicato del tempo per rispondere. La tua soluzione non ha funzionato. Una cosa che non ho menzionato nel mio post è che sto lavorando su un'applicazione MVC distribuita in share-point. Potrebbe essere questo il problema? –

+0

@Amete Il codice che hai menzionato non è adatto per MVC. Sono sorpreso, come funzionerebbe. –

+0

@Amete Sono anche sorpreso di vedere un'architettura di moduli Web in un MVC. Sicuramente stai scherzando con due diverse architetture. MVC non supporta l'architettura del modulo web e eventi come ** OnLoad, Page_Load e PreInit ** ecc. –