Colonna Dropdownlist alla modifica di una riga della griglia

sabato 28 aprile 2007 - 18.19

motogpdesmo16 Profilo | Senior Member

Salve a tutti, ho questa necessità: al clic sul comando "Modifica" della griglia, vorrei che due colonne si trasformino in dropdownlist (fin qui nessun problema, sono già riuscito a farlo).
La difficoltà è questa: le due dropdown devono seguire la tipologia "Regione-Provincia": al cambio di valore della prima, i dati della seconda dovrebbero essere filtrati in relazione a questo dato appena estratto. Mi spiego meglio:
1a dropdown che presenta i valori: "Campania, Lazio, Puglia, Molise, Basilicata". Se clicco "Puglia" mi devono comparire, nella seconda, queste voci: "Bari, Brindisi, Foggia, Lecce, Taranto".

Sapreste aiutarmi per caso su come risolvere questa faccenda??
Grazie mille.

Pongo Profilo | Senior Member

Beh, la prima cosa sei già riuscito a farla giusto?! Hai usato l'evento ItemDataBound , vero?!

Per la seconda: non c'è un evento associato al cambio dell'index di selezione di una DDL?

Così, la prima idea che mi viene in mente.

Poi però mi sa che devi tenere a memoria i dati selezionati e fare un refresh della tabella. Ma potrei sbagliarmi!

Ciao cioa

motogpdesmo16 Profilo | Senior Member

Ciao, grazie per l'interessamento innanzitutto.
Il problema della conversione da gridview a dropdownlist l'ho risolto andando a modificare il codice di origine ItemTemplate/EditItemTemplate e quindi, al clic su "modifica", ottengo la conversione in DropDownlist.
Non so adesso quale deve essere l'evento da andare a modificare affinchè le due DropDownlist vengano collegate alla sorgente dati. inoltre adesso non ho il codice su questo pc per poter controllare se le prove che ho fatto fossero nell'ItemDataBound o meno.
Per quel che posso ricordare l'itemdatabound era un evento della Datagrid e non della Gridview...ma potrei aver detto anche una emerita fesseria....

PEPE Profilo | Senior Member

Io ho fatto esattamente quello che tu cerchi di fare...ci ho messo un pochinpo ma alla fine il concetto non è molto difficile.


Nell'evento itemdatabound del datagrid verifico con l'istruzione If e.Item.ItemType = ListItemType.EditItem se sto facendo un operazione di modifica.

Private Sub dg2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dg2.ItemDataBound
If e.Item.ItemType = ListItemType.EditItem Then
Dim DRV As Data.DataRowView = CType(e.Item.DataItem, Data.DataRowView)
'------------------------------
'Acquisisco l'istat della regione che sta in una boundcolumn non visibile del datagrid
'Splitto il codice per risalire alla regione provicnia e comune
Dim istC As String = CStr(DRV("istatcomune")) 'istat del comune memorizzato in una colonna (nascosta)
Dim istP As String = Left(istC, 5)
Dim istR As String = Left(istP, 2) 'istat della regione
istP = Right(istP, 3) 'istat della provincia
'------------------------------
'Carico la dropdownlist relativa alla regione
Bind_Drop_Regioni("drpAnagRegioni", sender, e, DRV, istR)
'------------------------------
'Carico la dropdownlist relativa alla provincia
Bind_Drop_Province("drpAnagProvince", sender, e, DRV, istR, istP)
'------------------------------
'Carico la dropdownlist relativa al comune
Bind_Drop_Comuni("drpAnagComuni", sender, e, DRV, istP, istC)
'------------------------------
End If
End Sub

Questi sono i metodi di binding delle drop:

Protected Sub Bind_Drop_Regioni(ByVal nomeDrop As String, ByRef sender As Object, ByRef e As System.Web.UI.WebControls.DataGridItemEventArgs, ByRef DRV As Data.DataRowView, Optional ByRef istr As String = "")
Dim DDLREG As DropDownList = CType(e.Item.FindControl(nomeDrop), DropDownList)
Dim item As ListItem
Dim objContainer As New Ris_ConnectDb.DbGateway
Try
DDLREG.DataSource = CType(objContainer.Carica_Regioni, Data.DataTable)
DDLREG.DataTextField = "regione"
DDLREG.DataValueField = "istat_regione"
DDLREG.DataBind()
If istr <> "" Then
item = DDLREG.Items.FindByValue(istr)
If Not item Is Nothing Then item.Selected = True
End If
Finally
objContainer = Nothing
End Try
End Sub

Protected Sub Bind_Drop_Province(ByVal nomeDrop As String, ByRef sender As Object, ByRef e As System.Web.UI.WebControls.DataGridItemEventArgs, ByRef DRV As Data.DataRowView, ByRef istR As String, Optional ByVal istP As String = "")
Dim DDLPRO As DropDownList = CType(e.Item.FindControl(nomeDrop), DropDownList)
Dim item As ListItem
Dim objContainer As New Ris_ConnectDb.DbGateway
Try
DDLPRO.DataSource = CType(objContainer.Carica_Province(istR), Data.DataTable)
DDLPRO.DataTextField = "citta"
DDLPRO.DataValueField = "istat_provincia"
DDLPRO.DataBind()
If istP <> "" Then
item = DDLPRO.Items.FindByValue(istP)
If Not item Is Nothing Then item.Selected = True
End If
Finally
objContainer = Nothing
End Try
End Sub

Protected Sub Bind_Drop_Comuni(ByVal nomeDrop As String, ByRef sender As Object, ByRef e As System.Web.UI.WebControls.DataGridItemEventArgs, ByRef DRV As Data.DataRowView, Optional ByRef istP As String = "", Optional ByVal istC As String = "")
Dim DDLCOM As DropDownList = CType(e.Item.FindControl(nomeDrop), DropDownList)
Dim item As ListItem
Dim objContainer As New Ris_ConnectDb.DbGateway
Try
DDLCOM.DataSource = CType(objContainer.Carica_Comuni(istP), Data.DataTable)
DDLCOM.DataTextField = "comune"
DDLCOM.DataValueField = "istat_comune"
DDLCOM.DataBind()
If istC <> "" Then
item = DDLCOM.Items.FindByValue(istC)
If Not item Is Nothing Then item.Selected = True
End If
Finally
objContainer = Nothing
End Try
End Sub

Questi invece sono gli eventi delle drop

Protected Sub drpAnagRegioni_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Prendo il riferimento del datagrid
Dim dg As DataGrid = DirectCast(Page.FindControl("dg2"), DataGrid)
'Prendo l'id della riga che e' stata editata
Dim idEditItem As Int32 = dg.EditItemIndex()
'Prendo il riferimento della drop delle province
Dim drpP As DropDownList = CType(dg.Items(idEditItem).FindControl("drpAnagProvince"), DropDownList)
'Prendo il riferimento della drop dei comuni
Dim drpC As DropDownList = CType(dg.Items(idEditItem).FindControl("drpAnagComuni"), DropDownList)
If sender.selectedvalue = "00" Then
'Non ho selezionato regioni (ho selezionato campo vuoto) e devo nascondere la provincia ed il comune
drpP.Visible = False
drpC.Visible = False
drpC.SelectedIndex = 0
Else
'Devo cambiare l'elenco delle province e mascherare quella dei comuni.
Dim objContainer As New Ris_ConnectDb.DbGateway
Try
drpP.DataSource = CType(objContainer.Carica_Province(sender.selectedvalue), Data.DataTable)
drpP.DataTextField = "citta"
drpP.DataValueField = "istat_provincia"
drpP.DataBind()
drpP.Visible = True
drpC.Visible = False
Finally
objContainer = Nothing
End Try
End If
End Sub

Protected Sub drpAnagProvince_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Prendo il riferimento del datagrid
Dim dg As DataGrid = DirectCast(Page.FindControl("dg2"), DataGrid)
'Prendo l'id della riga che e' stata editata
Dim idEditItem As Int32 = dg.EditItemIndex()
'Prendo il riferimento della drop dei comuni
Dim drpC As DropDownList = CType(dg.Items(idEditItem).FindControl("drpAnagComuni"), DropDownList)
If sender.selectedvalue = "000" Then
'Non ho selezionato province (ho selezionato campo vuoto) e devo nascondere il comune
drpC.Visible = False
drpC.SelectedIndex = 0
Else
'Devo cambiare l'elenco dei comuni.
Dim objContainer As New Ris_ConnectDb.DbGateway
Try
drpC.DataSource = CType(objContainer.Carica_Comuni(sender.selectedvalue), Data.DataTable)
drpC.DataTextField = "comune"
drpC.DataValueField = "istat_comune"
drpC.DataBind()
drpC.Visible = True
Finally
objContainer = Nothing
End Try
End If
End Sub

Mi rendo conto che ho messo un po di codice...se hai problemi o chiarimenti chiedi :D.
Ciao ciao.
Luca.

motogpdesmo16 Profilo | Senior Member

Ciao PEPE, grazie per avermi postato l'esempio....
Io sono riuscito a fare il caricamento di due DropDownList indipendenti (cioè la prima prendeva i dati da una tabella e la seconda da un'altra tabella) con la Datagrid (oggetto griglia inerente il framework 1.1). Nell'esempio che hai postato ho dato un rapido sguardo e vedo che come parametro [i]e[/i] vengono passati i riferimenti [I]Datagrid[/i] e non [i]Gridview[/i] (che è l'oggetto griglia di Asp.net 2.0 e quindi Visual studio 2005).
Non appena ho la possibilità di tornare sul mio pc portatile dove risiede il progetto vedo di fare qualche test con il tuo codice e, nel caso, si potrebbe valutare di apportare insieme qualche modifica laddove sia necessaria.

Grazie comunque per avermi postato parte del tuo codice sorgente.
Ciao
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