54 messaggi dal 07 aprile 2005
si marco, il problema era nella mancata dichiarazione

Imports System.Collections.ObjectModel

ora tanto
private Collection<CheckBox> checkBoxCollection = new Collection<CheckBox>();
quanto la versione VB
Private checkBoxCollection As New Collection(Of CheckBox)
sono ok

ho tradotto quindi interamente la pagina in VB ma non mi sembra che risponda al requisito richiesto dato che ancora è necessario scrivere uno per uno i controlli

cito dal tuo codice:
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="myCheckBox" Checked='<%# Bind("IsRequired") %>' />
</ItemTemplate>
</asp:TemplateField>

e, lato server

protected void PropertyGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
checkBoxCollection.Add((CheckBox)e.Row.FindControl("myCheckBox"));
}
}

a parte "Checked='<%# Bind("IsRequired") %>'", che immagino sia anche questa una semplice svista da copia/incolla, siamo sempre al punto iniziale:

i controlli vanno comunque elencati uno ad uno, da una parte e dall'altra (myCheckBox, myCheckBox1, myCheckBox2, ..., myCheckBox200)

200 checkbox = 200 <asp:Checkbox... + 200 findcontrol = 400 linee di codice al posto di un semplice (uno lato client + uno lato server = due linee) loop che mi sembra impossibile non si possa implementare, dato che le checbox vengono recuperate automaticamente da database

...
non è quello che cercavo di fare

ciao

luca

200 checkbox = 200 <asp:Checkbox... + 200 findcontrol = 400 linee di codice al posto di un semplice (uno lato client + uno lato server = due linee) loop che mi sembra impossibile non si possa implementare, dato che le checbox vengono recuperate automaticamente da database

mi spiace proprio non capisco.

Checkbox ne viene definita solo una nella TemplateField, è poi il controllo stesso crearle dinamicamanete.

al metodo FindoControl viene passato l'id del controllo dichiarato (sempre) nella TemplateField, sarà lo stesso metodo a risolvere la ricerca

i controlli non vengono elencati uno ad uno, vengono aggiunti alla collezione dopo che sono stati istanziati (cosa che avviene in automatico)

alla fine ti limiti a ciclare la collezione delle CeckBox, cosa che viene sono alla fine del bind affinche sia stato rispristinato anche lo stato dei controlli con i dati eventualmente inseriti dall'utente.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
54 messaggi dal 07 aprile 2005
è a me che spiace non riuscirmi a spiegare

ti riposto il tuo codice

<div>
<asp:GridView ID="PropertyGridView" runat="server" AutoGenerateColumns="False" DataSourceID="PropertyObjectDataSource"
DataKeyNames="ID" OnRowCreated="PropertyGridView_RowCreated" OnPreRender="PropertyGridView_PreRender">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="myCheckBox" Checked='<%# Bind("IsRequired") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundField DataField="Value" HeaderText="Value" SortExpression="Value" />
<asp:BoundField DataField="Type" HeaderText="Type" ReadOnly="True" SortExpression="Type" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="PropertyObjectDataSource" runat="server" SelectMethod="GetProperties"
TypeName="Giada.TP.Manager.KindPropertyManager"></asp:ObjectDataSource>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>

Checkbox ne viene definita solo una nella TemplateField, è poi il controllo stesso crearle dinamicamanete.

al metodo FindoControl viene passato l'id del controllo dichiarato (sempre) nella TemplateField, sarà lo stesso metodo a risolvere la ricerca

i controlli non vengono elencati uno ad uno, vengono aggiunti alla collezione dopo che sono stati istanziati (cosa che avviene in automatico)


ma dov'è che vengono recuperati i campi a database (le checkbox) in modo da aggiungerli alla collezione?

questi campi a database di tipo bit non devono nemmeno venire mostrati.. e tantomeno selezionati dall'utente
devo unicamente recuperarli per verificare se sono o meno checked in modo da mostrare una diversa gif per ogni campo checked

per ogni row della gridview ho una unità abitativa (record)
ognuno di questi record dispone di una serie di campi di tipo bit si/no (ascensore, aria condizionata, parcheggio, etc..)
se il campo è checked verrà mostrata una particolare gif corrispondente

come fa il metodo che tu mi suggerisci

Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
checkBoxCollection.Add(CType(e.Row.FindControl("myCheckBox"), CheckBox))
End If
End Sub


a creare dinamicamente per ogni row (unità abitativa) tutte le diverse e molteplici checkbox (estraendoli dai campi bit del database)

dopo che le ha recuperate capisco il concetto di aggiungerle ad una collection e quindi manipolarle a piacere

ma non mi è chiaro come faccia il tuo codice a recuperarle dalla datasource (senza quindi doverle elencare io manualmente... questo è il punto) per aggiungerle alla collection

ciao

luca
ho dato per scontate forse troppo cose, non ho molto tempo magari continuiamo domani, comunque:

ma dov'è che vengono recuperati i campi a database (le checkbox) in modo da aggiungerli alla collezione?


una volta associato un ObjectDataSorce al GridView tramite la proprietà DataSourceID, che deve corrispondere all'id del ObjectDtaSource è possibile recuperare i dati e associarli ad una proprietà dal tipo compatibile con espressioni tipo Checked='<%# Bind("IsRequired") %>'

sarà il Runtime che richiamando alcuni metodi del WebControl, nel nostro Caso un GridView a istanziare per ogni item presente nella fonte dati un CheckBox e ad assegnarli il valore corrispondente.

nell'esempio che ti ho postato intercettando l'evento RowCreated interagisco con la fase di creazione di ogni riga e di conseguenza di ogni CheckBox.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
54 messaggi dal 07 aprile 2005
è possibile recuperare i dati e associarli ad una proprietà dal tipo compatibile con espressioni tipo Checked='<%# Bind("IsRequired") %>'

ovvio
però IsRequired è un campo a database recuperato tramite l'ObjectDataSource, non è un variabile

difatti quello che ho dovuto fare è stato
<asp:CheckBox Visible="False" ID="ascensore" runat="server" Checked='<%# eval("ascensore")%>' />
<asp:CheckBox Visible="False" ID="biciclette" runat="server" Checked='<%# eval("biciclette")%>' />
<asp:CheckBox Visible="False" ID="bagnoprivato" runat="server" Checked='<%# eval("bagno_privato")%>' />
<asp:CheckBox Visible="False" ID="bar" runat="server" Checked='<%# eval("bar")%>' />
<asp:CheckBox Visible="False" ID="cassaforte" runat="server" Checked='<%# eval("cassaforte")%>' />

etc..
etc..
etc.. zzzz

certo, se riuscissi invece a gestire IsRequired come una variabile.. bingo
allora potrei gestirlo dinamicamente row per row a runtime invece di doverli scrivere riga per riga...

è quello che sto tentando di fare dall'inizio

ma sinceramente nell'esempio pratico di codice che hai postato non ho intuito alcun collegamento tra IsRequired ed il corrispondente script e come quindi riesci a gestirlo programmaticamente

ciao

luca
niete ti vieta di impostare le varie proprietà delle CheckBox a mano, lo puoi fare gestendo l'evento RowDataBound dove hai anche l'accesso alla fonte dati.

non mi è chiaro ancora hai un oggetto con 200 campi?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
54 messaggi dal 07 aprile 2005
ho un oggetto (generica struttura ricettiva) con 200 campi bit (si/no) (ascensore, parcheggio, riscaldamento, animali ammessi, giardino, parco, frigobar, barbecue, etc..)

tutti quelli che sono venuti in mente al cliente: non penso sia questo il problema

dato che devo visualizzare, per ogni campo checked=true, una gif, chiedevo una mano al forum per sapere se esistesse una alternativa che mi permettesse di risparmiare diverse centinaia di righe di codice stupidamente ripetitivo

dopo tanto disquisire, a questo punto direi di no

oppure se qualcuno la risposta ce l'ha, se la tiene

grazie comunque

ciao

luca
forse mi sono spiegato male, gestendo l'evento RowDataBound puoi gestire i dati in "entrata" nel GridView, analizzarli e agire di conseguenza.

naturalmente se hai 200 gif diverse da assegnase è logico che devi eseguire qualche tipo di controllo.

io inizierei da l'evento RowDataBound.

comunque era meglio se progettavi il tuo oggetto non con 200 campi ma magari con una collezione di "campi", se un giorno devi aggiungere un campo sei costretto a modificare la classe.

ucco un esempio di utilizzo del evento preso da msdn

Sub AuthorsGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    ' Check for a row in edit mode.
    If e.Row.RowState = DataControlRowState.Edit Then
    
      ' Preselect the DropDownList control with the state value
      ' for the current row.
      
      ' Retrieve the underlying data item. In this example
      ' the underlying data item is a DataRowView object. 
      Dim rowView As DataRowView = CType(e.Row.DataItem, DataRowView)
      
      ' Retrieve the state value for the current row. 
      Dim state As String = rowView("state").ToString()
      
      ' Retrieve the DropDownList control from the current row. 
      Dim list As DropDownList = CType(e.Row.FindControl("StatesList"), DropDownList)
      
      ' Find the ListItem object in the DropDownList control with the 
      ' state value and select the item.
      Dim item As ListItem = list.Items.FindByText(state)
      list.SelectedIndex = list.Items.IndexOf(item)
      
    End If
    
  End Sub


ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

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.