RadioButton dentro ad un Repeater e scelta singola

lunedì 23 marzo 2009 - 18.35

ravalon Profilo | Expert

Salve a tutti

ho necessità di usare un RadioButton per chiedere all'utente la scelta tra alcune cose, ed ho usato un RadioButton....

Purtroppo essendo dentro ad un repeater che ripete i vari record estratti dal db, diventano selezionabili tutti i RadioButton generati, mentre io vorrei che fosse selezionabile soltanto uno di essi....

-.--.-come faccio ?

balfaz Profilo | Expert

spero questo possa soddisfare la tua richiesta
http://www.codeasp.net/blogs/shaitender/microsoft.net/150/radio-button-single-selection-in-reapter-datalist

Dove troverai sempre una mano disposta ad aiutarti è nell'estremo del tuo proprio braccio

Anonimo Profilo | Senior Member

A mio avviso basta che nel repeater devi aggiungere un radioButtonList a cui aggiungi tutti i radioButton che vuoi questo per ogni record del repeater, in questo modo ti garantisci una corretta selezione.

ravalon Profilo | Expert

Si avevo già trovato la soluzione con JS ma non mi piace granchè perchè dovrei impostare il JS nella masterpage, cioè verrebbe caricata sempre quando invece uso radiobutton solo in una pagina....

l'altra soluzione non l'ho capita, mi potresti fare un esempio pratico con codice ?

Anonimo Profilo | Senior Member

Nella pagina aspx, dentro il form scrivi:

<asp:Repeater ID="testRpt" runat="server"> <ItemTemplate> <table border="0"> <tr> <td> <asp:Label ID="txt" runat="server" Text='<%# Eval("Testo") %>'> </asp:Label> </td> <td> <asp:RadioButtonList id="rdbList" runat="server" AutoPostBack="false" RepeatDirection="Horizontal"> <asp:ListItem Text="si" Value="1"></asp:ListItem> <asp:ListItem Text="no" Value="0"></asp:ListItem> </asp:RadioButtonList> </td> </tr> </table> </ItemTemplate> </asp:Repeater>

nella pagina cs usa la direttiva using System.Data e nel page load scrivi:

DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("Testo")); dt.AcceptChanges(); for (int i=0;i<10;i++) { DataRow dr = dt.NewRow(); dr[0] = "Testo " + i; dt.Rows.Add(dr); } dt.AcceptChanges(); testRpt.DataSource = dt; testRpt.DataBind();

prova e capisci cosa intendo, è facile e ottieni cosa vuoi...

ravalon Profilo | Expert

no...a parte che programmo in VB....ma un pochino di C# lo mastico però non ho capito proprio che c'entra un datatable col mio problema...

innanzitutto un codice come mi hai scritto

<asp:RadioButtonList id="rdbList" runat="server"
AutoPostBack="false" RepeatDirection="Horizontal">
<asp:ListItem Text="si" Value="1"></asp:ListItem>
<asp:ListItem Text="no" Value="0"></asp:ListItem>
</asp:RadioButtonList>

non fa al caso mio perchè usi diversi listitem con vari valori, mentre nel mio caso il valore è uno e cambia a seconda del record corrente, non devo mettere io la lista

ti posto il codice...

****************************************
<asp:Repeater ID="RepeaterSpedizioni" runat="server" EnableViewState=true>

<ItemTemplate>
<table width="100%" class="TableBase" cellspacing="1" cellpadding ="0">
<tr>
<td width="90%" align="center" valign="top" class="BGGrigino">
<asp:Image ID="imgFotoServizio" runat="server" ImageUrl=<%#imgpath & "Spedizioni/" & DataBinder.Eval(Container.DataItem, "FotoLogo")%> />
</td>

<td width="10%" align="center" valign="middle" class="BGviolino">
<asp:RadioButton ID="RadSpedizioni" runat="server" GroupName="RadioSpedizioni" Text='<%#DataBinder.Eval(Container.DataItem, "ID")%>' />
</td>
</tr>
</table>

</ItemTemplate>
</asp:Repeater>
****************************************

Sicuramente non ho capito io eh, non fraintendermi, anzi ti ringrazio per la tua gentilezza....

Anonimo Profilo | Senior Member

A questo punto, mi è più chiaro ma mi chiedo?! Perchè usi il radio button al posto di un checkbox? Il radio button implica più scelte e non una scelta si no, non ho capito qualche cosa?

ravalon Profilo | Expert

Ma le checkbutton possono essere selezionate anche non in maniera esclusiva....cioè...

io praticamente elenco alcuni tipi di corrieri per le spedizioni

Di questi elencati, l'utente ne può scegliere solo uno....

spero sia più chiaro il mio problema

Anonimo Profilo | Senior Member

Scusa avevo capito male io, allora cancella tutto nell'aspx e ti basta scrivere nel pageload del cs:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

è chiaro che è un esempio, quindi il ciclo for lo devi adattare a quanti record hai e se al posto della scritta fornitore hai un'immagine devi mandare lo stream html come per l'input. Non credo che ci sia molto da spiegare mando in accodamento codice html alla pagina, è uan tecnica che si usa abbastanza, stabile e di effetto se vuoi divertirti con cose molto particolari...

balfaz Profilo | Expert

pensavo che magari questo script (quello segnalato precedentemente) potevi usarlo direttamente dentro la contentPage in questione, ma non so com'è il tuo sistema di organizzazione del tuo progetto, comunque potresti fare anche in questa maniera:

Private Sub CtrolCheck(ByVal id As String) Dim x, y As Integer For y = 0 To 3 For x = 0 To 3 Dim chckX As CheckBox chckX = CType(FindControl("RdBtn" & y & x), CheckBox) If ("RdBtn" & y & x) = id Then chckX.Checked = True Session.Add("selek", y & ";" & x & ";" & chckX.Text) Else chckX.Checked = False End If Next Next End Sub

con il postback su ogni radiobutton puntando tutti allo stesso evento checkedChanged
Non so si mi spiego...... quello che diceva TeamIcon non è sbagliato ma mi sembra di aver capito che questi rB si trovano nei repeater distribuiti, no?

Per tutto c'è sempre una soluzione.... Facci sapere

--- OOOOooppsss ---
devi far qualche modifica, questo l'ho presso da un vecchio progetto ma come vedi avevo anche una matrice di controlli già specificata, questo lo puoi sistemare con un bel for each

Dove troverai sempre una mano disposta ad aiutarti è nell'estremo del tuo proprio braccio

Anonimo Profilo | Senior Member

No non si trovano nel repeater ma mando flusso html alla pagina, il "baco", passatemi il termine, nei repeater è che microsoft .NET framework crea degli input type="radio" con name diverso che coincide con l'idClient del comando e quindi si perde il raggruppamento perchè per lui sono diversi. Mandando flusso html si garantisce lo stesso name e quindi si è raggiunto l'obiettivo finale.

ravalon Profilo | Expert

Grazie ad entrambi

in effetti stamani stavo già pensando di risolvere la cosa con l'uso di un response.write che generasse dinamicamente il codice e di includerlo in un webusercontrol cosi da poter essere riutilizzato....

penso che seguirò questa via dato che cosi non devo "correggere" un problema con cicli vari ma lo elimino alla radice....

ravalon Profilo | Expert

Ok....

ho generato tutto quanto con i response.write...l'avevo già fatto e funziona....

...però mi trovo nei casini lo stesso col radiobutton

il radiobutton è generato cosi

Response.Write("<input type='radio' name='TipoSpedizioni' value='" & Es("ID") & "'")

Adesso è possibile selezionarne soltanto uno tra quelli creati dal ciclo ...

Ora il problema è .... ho un VALUE che contiene l'ID di un valore estratto dal db, quindi posso capire quale è stato selezionato...

Però vorrei che, NELLA STESSA PAGINA, potessi aggiungere un qualcosa che mi recupera quale radio è stato selezionato....

Ho provato con OnClick="NomeRoutine" ma non mi fa nulla....

Anonimo Profilo | Senior Member

se usi nel response write onclick minuscolo dovrebbe funzionare se no posta il codice e vediamo.

ravalon Profilo | Expert

Purtroppo ho dovuto fare marcia indietro....

con il response.write la pagina mi da errore quando premo qualsiasi bottone, riportando un messaggio che dice che è un problema tipico di alcuni atteggiamenti di programmazione, come l'avere usato il response.write

Non so se è perchè nella pagina uso AJAX....

quindi sono ritornato al repeater....esiste un'altra strada per far funzionare il tutto ?
Certo che con un linguaggio cosi avanzato, dover faticare per una cosa tanto banale non è il massimo....

Anonimo Profilo | Senior Member

Mi incuriosisce il fatto che hai menzionato ajax, ma come hai fatto la pagina riesci a postare il codice, ho paura che centri parecchio...

ravalon Profilo | Expert

Ti posto solo la parte che riguarda il repeater perchè è molto grande altrimenti....lo faccio per semplificare la lettura, se poi c'è bisogno di postarla tutta non ci sono problemi

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e poi posto il codice vb

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

di fatto ora sono tornato alla condizione in cui uso il repeater perchè altrimenti mi da dei problemi......metto anche il codice dell'usercontrol che utilizzava il response.write , che mi andava benissimo non fosse per il fatto che poi avevo problemi alla pressione di qualsiasi bottone


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ravalon Profilo | Expert

Se esiste un altro sistema per bypassare l'uso delle radiobutton è bene accetto eh
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5