24 messaggi dal 22 maggio 2007
Ciao a tutti, ho un dubbio! Per ora
In una pagina ho inserito una variabile "Nome" come dal codice seguente:
partial class assegn
Dim Nome as string

Protected Sub DDL_turni_Unload(ByVal sender As Object, ByVal e As System.EventArgs)
Nome = CType(sender, DropDownList).Text
End Sub

Protected Sub DDL_Gio_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
ADS_Gio.SelectParameters("Turno").DefaultValue = Nome
End Sub

end class

il problema è che in debug la variabile viene riempita nella prima sub ma quando si arriva alla seconda sub il suo valore è nothing.
Premetto che utilizzo le estensioni ajax.
Qualcuno saprebbe illuminarmi. Grazie
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
Intuisco che i due eventi che gestisci con le due sub non vengono scatenati uno di seguito all'altro, ma probabilmente a seguito di un post/callback, quindi è normale che il valore assegnato alla variabile nella prima Sub sia azzerato in quanto non c'è condivisione tra le due istanze della "pagina".

Non so se ho capito bene il tuo problema, ma mi sembra di intuire che stai cercando di popolare una lista a seguito della selezione di un valore da un'altra lista, utilizzando AJAX per non ricaricare tutta la pagina:http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx.

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
24 messaggi dal 22 maggio 2007
Perfetto hai centrato il problema solo che le due ddl sono dentro un gridview in edittemplate. Però come devo dichiarare la variabile oppure come devo fare per passare quel valore???
L'ho dichiarata come Shared ho fatto bene oppure è sono un paliativo?
Posso chiederti come usare l'accessdatasource con le ddl sempre all'interno del gridview? Non le vede
Grazie e Ciao da Luigi
Modificato da gigisector il 08 marzo 2008 21.03 -
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
gigisector ha scritto:
Perfetto hai centrato il problema solo che le due ddl sono dentro un gridview in edittemplate. Però come devo dichiarare la variabile oppure come devo fare per passare quel valore???

Guarda, vado sempre ad intuito perchè non conosco il tuo codice, ma non è un problema di variabile ma di eventi rispetto al ciclo di vita della pagina, mi sembra che tu valorizzi Nome nel metodo gestore dell'evento Unload della prima DDL (lo intuisco dal nome della SUB, correggimi se sbaglio) io penso che dovresti gestire l'evento OnSelectedIndexChanged generato dalla selezione di un elemento e direttamente nella corrispondete SUB potresti scatenare il DataBind della seconda DDL avendo anche a disposizione la proprietà Nome, dovresti provare tenendo a mente che qualunque sia la dichiarazione della variabile essa viene azzerata al ricaricamento della pagina.

L'ho dichiarata come Shared ho fatto bene oppure è sono un paliativo?

Beh, Shared rende la proprietà accessibile e condivisibile da tutta l'applicazione, in questo caso non risolve perchè la variabile viene reinizializzata ogni volta, e mi permetto di sconsigliartene l'uso in contesti come questi perchè riempi l'applicazione di informazioni in memoria di difficile controllo.

Posso chiederti come usare l'accessdatasource con le ddl sempre all'interno del gridview? Non le vede
Grazie e Ciao da Luigi
Modificato da gigisector il 08 marzo 2008 21.03 -

Poi recuperare le istanze delle DDL nei metodi gestori di un evento RowDataBound se hai bisogno anche dei dati associati oppure di un evento RowCreated se ti è sufficiente l'accesso agli elementi.
Gestendo questi eventi puoi recuperare le DDL accendendo direttamente all'oggetto es.
DropDownList _ddl = (DropDownList)e.Row.Cells[0].Controls[0];

(con l'aiuto di un po' di debug)

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
24 messaggi dal 22 maggio 2007
novecento ha scritto:

Guarda ... non è un problema di variabile ma di eventi rispetto al ciclo di vita della pagina...


Ho capito finalmente il perchè. Sai venendo dal VB6 e poi VB.NET non immaginavo che il postback della page mi annullasse la variabile. Grazie

... dovresti gestire l'evento OnSelectedIndexChanged generato dalla selezione di un elemento e direttamente nella corrispondete SUB potresti scatenare il DataBind della seconda DDL avendo anche a disposizione la proprietà Nome


Quell'evento già lo gestivo via codice quando la prima ddl faceva postback, ma a me serviva alla prima visualizzazione della grid in editmode.
Ho risolto cosi:(ho cambiato qualche nomenclatura tanto per fare casino)
Partial Class Assegn
    Dim NomeTurno as string

    Protected Sub DDL_Gio_DataBinding(ByVal sender As Object, ByVal e As System.EventArgs)
        'serve a passare il parametro del nome del turno nell'accessdatasource della seconda ddl
        ADS_Gio.SelectParameters("Nome").DefaultValue = NomeTurno
    End Sub

    Protected Sub DDL_turni_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
        'leggo il valore selezionato nella prima ddl        
        NomeTurno = CType(sender, DropDownList).Text
    End Sub
    
Protected Sub Carica_gio()
        Dim sql As String
        Dim DS As DataSet
        Dim MyConnection As OleDbConnection
        Dim MyCommand As OleDbDataAdapter

        MyConnection = New OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings("Access").ConnectionString)
        MyConnection.Open()
        NomeTurno = DirectCast(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Turni"), DropDownList).Text
        sql = "SELECT Giornate.giornata FROM ((Turni LEFT OUTER JOIN Giornate ON Turni.ID = Giornate.idturno) LEFT OUTER JOIN Impianti ON Turni.idImp = Impianti.id) WHERE (Impianti.Impianto = '" & DDL_Imp.SelectedValue & "') AND (Turni.Nome = '" & NomeTurno & "')"
        MyCommand = New OleDbDataAdapter(sql, MyConnection)
        DS = New DataSet
        MyCommand.Fill(DS, "Giornate")
        CType(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Gio"), DropDownList).DataSourceID = ""
        CType(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Gio"), DropDownList).DataSource = DS.Tables("Giornate")
        CType(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Gio"), DropDownList).DataTextField = "Giornata"
        CType(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Gio"), DropDownList).DataValueField = "Giornata"
        CType(GV_Ass.Rows(GV_Ass.EditIndex).FindControl("DDL_Gio"), DropDownList).DataBind()
    End Sub
End Class


Nel markup ho inserito SelectedValue='<%# Bind("giornata") %>' per associare la seconda ddl e ora funziona questo.

Se cambio valore alla prima ddl quindi postback mi restituisce il seguente errore:
InvalidOperationException:
I metodi di associazione dati come Eval(), XPath() e Bind() possono essere utilizzati solo nel contesto di un controllo con associazione a dati.

Prima caricavo con la sub carica_gio la seconda ddl sul selectedindexchanged della prima e funzionava.
Ma adesso vorrei chiederti è l'ultima cosa, per ricaricare le giornate sulla seconda ddl posso inviare all'accessdatasource un nuovo parametro e se si come si fa? O cambiare la query? o qualcos'altro?

GRazie 100000 e scusami se ti inquieto
2.190 messaggi dal 04 marzo 2004
Contributi | Blog

Ma adesso vorrei chiederti è l'ultima cosa, per ricaricare le giornate sulla seconda ddl posso inviare all'accessdatasource un nuovo parametro e se si come si fa? O cambiare la query? o qualcos'altro?

Si, puoi inviare un nuovo valore ad un parametro richiamando il metodo Select() dell'AccessDataSource e gestendo l'evento OnSelecting.
Puoi predere spunto da questo script:http://www.aspitalia.com/script/877/Impostare-Programmaticamente-Valore-Parametri-Controllo-DataSource.aspx

GRazie 100000 e scusami se ti inquieto

E' un divertimento, non ti preoccupare!

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer

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.