64 messaggi dal 04 marzo 2012
Buongiorno,
ho una gridview contenente una dropdownlist (che riempio da codice vedi sotto), devo intercettare l'evento per quando cambio la selezione del valore del dropdown così da poter riempire con un altro valore un campo della riga della grid.
Mi potete dare una mano? Grazie

Io ho pensato di usare il codice sotto ma con debug non ci passa neanche.

Protected Sub dgvOggettiObbligatori_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) Handles dgvOggettiObbligatori.RowEditing
Dim row As GridViewRow
Dim lstdrop As DropDownList
row = dgvOggettiObbligatori.Rows.Item(e.NewEditIndex())
lstdrop = row.FindControl("txtOggetto")

End Sub

'Codice DROPDOWNLIST CON RIEMPIMENTO

<asp:TemplateField HeaderText="Oggetto">
<ItemTemplate>
<asp:DropDownList ID="txtOggetto" runat="server" AutoPostBack="True" >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>

'Riempio
Protected Sub dgvOggettiObbligatori_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles dgvOggettiObbligatori.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then



Try
Dim connectionString = ConfigurationManager.ConnectionStrings("HTS_GestioneConnectionString").ConnectionString

Using conn = New SqlConnection(connectionString)
conn.Open()
Using cmd = conn.CreateCommand()
cmd.CommandText = "SELECT * FROM VW_C_Oggetti WHERE IDOggettoTipo = " & e.Row.DataItem("IDOggettotipo") & " AND Obbligatorio = 1 AND Disattivo = 0 ORDER BY Descrizione"
Using reader = cmd.ExecuteReader()
While reader.Read()

Dim myDrop As DropDownList
myDrop = CType(e.Row.FindControl("txtOggetto"), DropDownList)

myDrop.Items.Add(New ListItem(reader("Descrizione"), reader("IDOggetto")))

End While
End Using
End Using
End Using


Catch ex As Exception
ClsFileLog.ScriviLog(ex.Message, Session.Item("User"))
End Try

End If
End Sub
Modificato da fughy il 18 luglio 2018 16.09 -

Ho fatto qualche prova e sono arrivato che nella sub txtOggetto_SelectedIndexChanged ci passa (vedi sotto), ma a questo punto non so come leggere il contenuto selezionato della dropdownlist, se anzichè EventArgs uso System.Web.UI.WebControls.GridViewRowEventArgs mi da errore "Impossibile eseguire il cast di oggetti di tipo 'System.EventArgs' sul tipo 'System.Web.UI.WebControls.GridViewRowEventArgs'. "
Forse non è la strada corretta.

<asp:TemplateField HeaderText="Oggetto">
<ItemTemplate>
<asp:DropDownList ID="txtOggetto" runat="server" AutoPostBack="True"
OnSelectedIndexChanged="txtOggetto_SelectedIndexChanged" >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>

Protected Sub txtOggetto_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)

End Sub
Modificato da fughy il 18 luglio 2018 17.59 -
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao,
due nozioni importanti:
  • Quando gestisci un evento, hai sempre un oggetto sender che ti viene passato come parametro. Quello contiene il riferimento al controllo che ha scatenato l'evento. In questo caso è la DropDownList, quindi puoi fare un casting così per poi accedere a tutte le sue proprietà, compreso il valore selezionato.
    Protected Sub txtOggetto_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
      Dim ddl = CType(sender, DropDownList)
      Dim selectedValue = ddl.SelectedValue
      'Qui fai qualcosa con selectedValue
    End Sub
    
  • Usa la documentazione per capire di che tipo possono essere i parametri. Un evento sollevato da una DropDownList non può certo prevedere un parametro di tipo GridViewRowEventArgs che, come fa intuire il nome, ti viene fornito per eventi generati dalla GridView. Ecco la documentazione di SelectedIndexChanged:
    https://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.listcontrol.selectedindexchanged(v=vs.110).aspx
    Nella pagina vedi che l'evento è definito per ammetere un delegato di tipo EventHandler quindi i due parametri possono solo essere rispettivamente di tipo object e EventArgs. Comunque non è un problema, puoi recuperare tutti i valori dalle proprietà della DropDownList grazie all'oggetto sender, come abbiamo visto al primo punto.


ciao,
Moreno
Modificato da BrightSoul il 18 luglio 2018 21.29 -

Enjoy learning and just keep making
64 messaggi dal 04 marzo 2012
Ciao Moreno,
grazie per la dritta, professionale come sempre.

Mi sorge un ulteriore problema però dopo aver recuperato le info da altre tabelle con il selectvalue trovato, devo adesso però aggiornare il valore di una textbox presente sulla stessa riga della gridview, come posso fare?
E' giusto fare gridview.row(x).cells(4) = valore ?
Ma come faccio a sapere su che riga sono? Grazie
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao,


E' giusto fare gridview.row(x).cells(4) = valore ?

No, perché non conosci il numero della riga. Ti conviene arrivarci partendo dalla DropDownList stessa e risalendo alla cella e poi alla riga che la contengono. Ogni controllo ha una proprietà Parent che ti permette di ottenere un riferimento al controllo padre che lo contiene. Quando sei arrivato alla riga, riscendi a cercare la textbox con FindControl("nomeTextbox").

Non so bene quante volte dovrai usare la proprietà Parent per arrivare alla riga, quindi dovrai sperimentare. Aiutati col debugger per capire a cosa fa riferimento ogni Parent.
Protected Sub txtOggetto_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
  Dim ddl = CType(sender, DropDownList)
  Dim selectedValue = ddl.SelectedValue
  Dim textbox = ddl.Parent.Parent.FindControl("nomeTextbox") 'Oppure ddl.Parent.Parent.Parent.FindControl("nomeTextbox")
  'Qui fai qualcosa con selectedValue e textbox
End Sub


ciao,
Moreno

Enjoy learning and just keep making
64 messaggi dal 04 marzo 2012
Ciao Moreno,
scusami ma non ho ben capito, o meglio ho visto che sul primo Parent sembra che stiamo parlando della cella, mentre sul secondo stiamo parlando della Riga, in effetti ho visto che nel secondo Paret nel valore RowIndex c'è il numero di riga.

Però non ho ben capito come utilizzare queste info.
in poche parole ho un grid con 6 colonne (codice, descrizione, Dropdown, prezzo, id1, id2), selezionando il drop con il selectvalue che abbiamo recuperato come da te indicato, ho trovato il prezzo contenuto in una determinata tabella e lo devo inserire nella 4 colonna e nella 5 l'ID di riferimento, come faccio?

L'indicazione da te indicata Dim textbox = ddl.Parent.Parent.FindControl("nomeTextbox") cosa fa di preciso? Cosa trovo dentro textbox in quato tramite il debug mi trovo sempre "nothing" sicuramente sbaglio qualche cosa.
Grazie
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao,
FindControl serve a trovare un controllo in base al suo ID, tra tutti quelli contenuti nel contenitore. Ecco la documentazione.
https://msdn.microsoft.com/it-it/library/486wc64h(v=vs.110).aspx

Ovviamente devi sostituire "nomeTextbox" con l'ID della textbox di cui vuoi aggiornare il valore. Credo che fosse questo il tuo quesito, infatti avevi scritto:

devo adesso però aggiornare il valore di una textbox presente sulla stessa riga della gridview


Fornendo l'id corretto, il controllo viene trovato e quindi non avrai più Nothing come risultato. Potrai fare il casting di quell'oggetto sul tipo TextBox e aggiornare la sua proprietà Text.
Dim textbox = CType(ddl.Parent.Parent.FindControl("ID_della_tua_Textbox"), TextBox)
textbox.Text = "Qualcosa"


ciao,
Moreno
Modificato da BrightSoul il 19 luglio 2018 14.35 -

Enjoy learning and just keep making

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.