Templatecolumn

martedì 06 settembre 2005 - 17.51

PEPE Profilo | Senior Member

Cercando di capire come funzionano gli eventi del datagrid mi sono imbattuto in un problema.
Ho creato il mio famoso datagrid e l'ho associato ad una tabella.
Ho impostato gli eventi per edit dei dati e tutto sembra funzionare correttamente.

Il problema nasce se io volessi sostituire una textbox che compare nell'edit, con una dropdownlist.
Vi mostro il codice.
PAGINA ASPX:
<asp:DataGrid id="dgStab" Runat="server" OnItemDataBound="ItemDataBound" AutoGenerateColumns="False"
OnEditCommand="EditCommand" OnCancelCommand="CancelCommand">
<Columns>
<asp:BoundColumn DataField="codice_univoco" ReadOnly="True" HeaderText="Codice Univoco"></asp:BoundColumn>
<asp:BoundColumn DataField="indirizzo" HeaderText="Indirizzo"></asp:BoundColumn>
<asp:BoundColumn DataField="localita" HeaderText="Localita"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="Direttiva">
<ItemTemplate>
<asp:Label Runat=server text='<%#Databinder.Eval(Container.Dataitem, "id_direttiva")%>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList Runat="server"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Conferma" CancelText="Annulla" EditText="Modifica"></asp:EditCommandColumn>
</Columns>
</asp:DataGrid>


PAGINA VB
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Carica_Elementi(Nothing)
End Sub

Private Sub Carica_Elementi(ByVal data As Date)
'SE LA DATA VIENE PASSATA COME NOTHING IL VALORE DI data E' 0.00.00
Dim ObjElementi As New ComponentArir.Elenchi
Dim objCommand As New SqlClient.SqlCommand
Try
dgStab.DataSource = ObjElementi.EseguiQuery(ComponentArir.Elenchi.tipoRisultatoSelect.Tabella, ComponentArir.Elenchi.selectProcedure.SelectAnagraficaByCodiceUnivoco, objCommand)
dgStab.DataBind()
Catch ex As Exception
lblmessage.Text = "Errore nel caricamento dei dati"
Finally
objCommand.Dispose()
objCommand = Nothing
End Try
ObjElementi = Nothing
End Sub

Protected Sub EditCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs)
dgStab.EditItemIndex = e.Item.ItemIndex
dgStab.DataBind()
End Sub

Protected Sub CancelCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs)
dgStab.EditItemIndex = -1
dgStab.DataBind()
End Sub

Protected Sub UpdateCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs)
dgStab.EditItemIndex = -1
'Aggiorno il database
'...
'...
'...
dgStab.DataBind()
End Sub

Come si fa a gestire l'associazione dei dati alla dropdownlist quando si fa l'edit della riga?

Brainkiller Profilo | Guru

Ciao Pepe,
tanto per cominciare al tuo DropDownList devi assegnare un ID.
Successivamente durante l'operazione di Edit devi recuperare il dropdwonlist tramite il metodo FindControl eseguire un cast esplicito e solo a quel punto puoi assegnare al dropdown un DataSet ed eseguire DataBind.

Nel caso sia già selezionata una voce, puoi eseguire uno step aggiuntivo e ricercare l'elemento del DB e selezionarlo automaticamente nella Combo Box con i metodi FindByText o FindByValue come riportato in questo Tip:
http://www.dotnethell.it/tips/SelectDropDownList.aspx

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

PEPE Profilo | Senior Member

Grazie 1000 per la spiegazione.
L'unica cosa che non ho capito, e comunque mi ristudio meglio la teoria, e' in quale metodo fare questa operazione.
Il datagrid in fase di portback fa un sacco di roba che mi confonde un po le idee.

Dato che te mi hai detto in fase di edit credo di aver capito che queste operazioni vanno messe nel metodo relativo all'OneditCommand.


PEPE Profilo | Senior Member

Aho!! io non ce riesco porca paletta :D:D.

Nel metodo Edit command ho fatto questo

Protected Sub EditCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs)
dgStab.EditItemIndex = e.Item.ItemIndex
dgStab.DataBind()
Dim ctrl As Control = dgStab.FindControl("dropArticolo")
lblmessage.Text = ctrl.GetType.ToString()
End Sub

Quando eseguo mi da errore sul ctrl.GetType.ToString()

Riferimento a un oggetto non impostato su un'istanza di oggetto.
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto

PEPE Profilo | Senior Member

Ho fatto come hai detto ma drop e' nothing.
Sicuramente sbaglio qualche cosa ma non capisco cosa :D.

Cmq se ci riesco vi metto in allegato i file aspx e vb che funzionano da soli.

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