2016-06-07 13 views
5

Utilizzando l'approccio indicato nella domanda here, io sono in grado di ottenere i valori di elementi selezionati dal mio CheckBoxList:Determinare se sono elementi selezionati in CheckBoxList utilizzando Request.Form

var selectedCheckBoxItems = from key in Request.Form.AllKeys 
         where key.Contains(cbl.ID) 
         select Request.Form.Get(key); 

Posso quindi scorrere i risultati :

foreach (var item in selectedCheckBoxItems) 
{ 

} 

il problema è che item è solo il valore di iscrizione, che per una casella di controllo, è semplicemente la stringa "on".

on

Ho bisogno di essere in grado di determinare quale elemento è "on", mediante indice o qualche altro metodo.

Domanda: Come faccio a determinare quali elementi della CheckBoxList sono selezionati, utilizzando Request.Form?

Ecco la mia definizione CheckBoxList:

<asp:CheckBoxList runat="server" ID="cblAnimalType" SelectionMode="Multiple" DataTextField="OptionText" DataValueField="OptionId" AutoPostBack="True"/> 

Gli articoli sono aggiunti all'elenco da codice dietro:

DataTable dt = GetData(SqlGetListOptions, paramList); 
cbl.DataSource = dt; 
cbl.DataBind(); 

L'altra cosa importante da sapere è che ViewStateMode="Disabled", quindi devo usare Request.Form per ottieni gli oggetti selezionati.


In risposta a un commento, ecco come il codice HTML per la CheckBoxList rende:

html


@Leopard rilevato che vede i valori resi nel codice HTML che non è si verificano nella mia situazione. La risposta di AdamE allo this question spiega perché. Ho la seguente riga nel file web.config:

<pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"> 

il che spiega perché vedo "on" al posto del valore effettivo degli elementi selezionati. Non riesco a strappare la compatibilità da web.config senza verificare che non rompere qualcos'altro, ma sembra che se tale impostazione è sicura da rimuovere, i valori della casella di controllo saranno accessibili da codebehind.

+0

Stai dicendo che quando si imposta 'ViewStateMode =" Abilitato "' quindi il corretto stato degli elementi di 'CheckListBox' funziona correttamente? – RBT

+1

Sto dicendo che View State è disabilitato, quindi devo usare Request.Form. Se View State fosse abilitato, otterrei solo gli elementi selezionati dallo stato di visualizzazione del controllo, come [this] (http://stackoverflow.com/questions/18924147/how-to-get-values-of-selected-items- in-checkboxlist-with-foreach-in-asp-net-c) –

+0

"On" è il 'DataValueField' per tutti gli elementi in' CheckBoxList'? –

risposta

1

Come si sono vincolanti la checkboxList da Database con OptionId feild è possibile controllare quale checkboxes vengono selezionati e memorizzare il valore d'List<int> assumendo il loro valore è int.

Poi di nuovo quando si popolano il checkboxlist è possibile verificare che value è presente nel list memorizzato in precedenza e in base a value è possibile select relativo checkbox.

Ecco un esempio di codice

List<int> SelectedCheckBoxes = new List<int>(); 
var selectedCheckBoxItems = from key in Request.Form.AllKeys 
            where key.Contains(cblAnimalType.ID) 
            select Request.Form.Get(key); 
foreach (var item in selectedCheckBoxItems) 
{ 
    SelectedCheckBoxes.Add(int.Parse(item.ToString())); 
} 

Poi di nuovo quando si populate il checkboxlist si possono trovare gli oggetti da value e selezionarle

foreach (ListItem listItem in cblAnimalType.Items) 
{ 
    if (SelectedCheckBoxes.Contains((int.Parse(listItem.Value)))) 
    { 
    listItem.Selected = true; 
    } 
} 

Potrebbe essere necessario per memorizzare il SelectedCheckBoxes List in session seconda su come si sta compilando il checkboxlist.

Aggiornamento

Come per la discussione con voi stavate usando Asp.net 4.0 ma il vostro checkboxes non ha avuto un value attribute che avrebbe dovuto essere lì.

Questo sta accadendo perché si sta utilizzando controlRenderingCompatibilityVersion="3.5" che non è più necessario poiché si sta già utilizzando Asp.Net 4.0.

Quindi rimozione di questa linea dal web.congif risolverà il problema e si sarà in grado di ottenere il value of checkbox invece di ottenere on

<pages controlRenderingCompatibilityVersion="3.5" /> 
+0

Perché si assume che il valore sia un numero intero? Non sarebbe più semplice e sicuro memorizzare 'Lista SelectedValues' ed evitare' int.Parse' (anche se il valore è in realtà un intero)? – ConnorsFan

+0

@ConnorsFan perché il valore è associato alla proprietà 'ID' che sembra essere' int'. E 'int.parse' perché' .Value' è 'stringa' e' item' è di tipo 'var'. – Mairaj

+0

@MairajAhmad - Il problema con questa soluzione è che item.ToString() è "on", che non può essere analizzato in Int e non può essere correlato agli elementi nell'elenco ("on" non dice me quale casella di controllo è selezionata). Potete vedere questo nella mia domanda originale, dove ho postato lo screenshot che mostra il contenuto di 'item' nel foreach che itera su' selectedCheckBoxItem' –

2

Ho pensato a un modo per farlo, aggiungendo la chiave ai risultati. Non sono completamente soddisfatto di questo metodo a causa dell'analisi delle stringhe richiesta per ottenere l'indice. Forse qualcun altro ha un metodo migliore?

L'idea generale è quella di aggiungere la chiave per i risultati:

var selectedCheckBoxItems = from key in Request.Form.AllKeys 
         where key.Contains(cbl.ID) 
         select new {Value = Request.Form.Get(key), Key = key}; 
foreach (var item in selectedCheckBoxItems) 
{ 
    var val = item.Value; 
    var key = item.Key; 
} 

posso quindi analizzare la chiave per trovare l'indice, che è quello che mi serve per impostare l'opzione selezionata (s):

var selectedCheckBoxItems = from key in Request.Form.AllKeys 
         where key.Contains(cbl.ID) 
         select new {Value = Request.Form.Get(key), Key = key}; 

string[] stringParse = new string[] {listName.Replace(" ", "") + '$'}; 

foreach (var item in selectedCheckBoxItems) 
{ 
    var val = item.Value; 
    var key = item.Key; 
    var idxArray = key.Split(stringParse, StringSplitOptions.None); 
    var idxString = idxArray[idxArray.Length - 1]; 
    int idxInt; 
    if (Int32.TryParse(idxString, out idxInt)) 
    { 
     cbl.Items[idxInt].Selected = true; 
    } 
} 
1

Ecco un altro modo per analizzare la chiave per ottenere indici selezionati. Inoltre, utilizza la proprietà UniqueID per trovare le chiavi pertinenti.

var selectedCheckBoxItems = from key in Request.Form.AllKeys 
          where key.Contains(cblAnimalType.UniqueID) 
          select new { Value = Request.Form.Get(key), Key = key }; 

foreach (var item in selectedCheckBoxItems) 
{ 
    var val = item.Value; 
    string indexToken = item.Key.Replace(cblAnimalType.UniqueID, ""); 
    int index = int.Parse(Regex.Replace(indexToken, @"[^\d]", "")); 
    ... 
} 
+0

Speravo di evitare l'analisi per ottenere l'indice. Tuttavia, capisco se è l'unico modo, sarà quello che devo fare. Questo approccio al parsing sembra migliore di quello che ho trovato. –

0

Mi rendo conto che è molto vicino a risposte precedenti, quindi non so se è l'aggiunta di qualche cosa, ma è un po 'più succinta quindi mi aggiungerlo. In Request.Form.AllKeys, Key è il nome html della casella di controllo. Il nome html della casella di controllo contiene l'indice. Vorrei solo cambiare la query di linq per selezionare solo gli elementi che sono "on" e quindi restituire l'elenco delle chiavi. Dopodiché puoi solo analizzare le chiavi per ottenere l'indice.

var selectedCheckBoxItems = from key in Request.Form.AllKeys 
          where key.Contains(cbl.ID) && Request.Form.Get(key) == "on" 
          select key; 

foreach (var item in selectedCheckBoxItems) 
{ 
    var index = 0; 
    if (int.TryParse(item.Substring(item.LastIndexOf("$") + 1), out index)) 
    { 
     //do what you will 
    } 
} 

Inoltre, all'analisi delle stringhe in questo caso è abbastanza sicuro in quanto i nomi dei campi vengono generati dal quadro in un modo molto specifico e stereotipata. Le probabilità che siano mai state diverse sono vicine se non zero.