28 messaggi dal 17 novembre 2005
ciao a tutti!
il mio quesito è semplice ma non banale..
dopo anni di esperianza con ASP mi tocca anche .NET e la voglia di imparare rapidamente mi fa "saltare" alcuni presupposti che sicuramente sono basilari..
i problemi in realtà sono 2, uno + tecnico ed uno + generico.

il primo:
ho una detailsview, pochi campi pescati da un DB SQL, binding fatto direttamente con VWD e non via codice, visualizza solo un record filtrato tramite ID acuisito da querystring.
fin qui, tutto ok.
uno di questi campi dovrebbe essere una dropdownlist popolata da una tabella secondaria e dovrebbe comaprire solo in fase di EDIT.
il binding l'ho implementato all'inizio sempre direttamente con VWD e succesivamente, per fare esperimenti, via codice.
ho implementato quindi un templatefield in cui si visualizza una label in caso di semplice visualizzazione e una dropdownlist in caso di edit.
anche fin qui, tutto ok!
la cosa "apparentmente" + stupida è questa: come fare in modo che il valore selezionato della dropdownlist corrisponda al dato contenuto nella prima tabella relativa alla detailsview?
es: il campo colore contenuto nella detailsview è un INT e contiene l'indice relativo ad una tabella secondaria ID_colore; la DDL conterrà 1 bianco, 2 nero etc etc..
se nella details ho impostato 2 (cioè nero..) quando si passa all'edit la DDL mi presenta come valore selezionato 1 (bianco)!
in molti esempi ho trovato l'utilizo della proprietà SelectedValue ma oltre al fatto che sia VWD che VS non la accettano in fase di editing visuale, ho cmq problemi nell'utilizzo.
pensavo di associare all'evento DATABOUND della detailsview un "qualcosa" per settare il valore nella DDL, naturalmente dopo aver fatto il binding visto che ho scoperto che il bind azzera tutto!
mi space essere stato cosi prolisso ma ci tengo ad illustrare correttamente il problema..
ho trovato molti esempi simili ma niente di concreto..

il secondo problema, egato al primo se vogliamo, è:
come referenziare correttamente i controlli "rinchiusi" all'interno di una detailsview o altri controlli in genere?

vi sarei grato se il codice riportato fosse in VB..


ringrazio tutti anticipatamente!
magnetica wrote:
la cosa "apparentmente" + stupida è questa: come fare in modo che il valore selezionato della dropdownlist corrisponda al dato contenuto nella prima tabella relativa alla detailsview?

aggiungi semplicemente questo:
<asp ropdownlist ... SelectedValue='<%#Bind('nomecampo')%>'...
in molti esempi ho trovato l'utilizo della proprietà SelectedValue ma oltre al fatto che sia VWD che VS non la accettano in fase di editing visuale, ho cmq problemi nell'utilizzo.

che non l'accetti l'editor è un non problema, non è l'editor (nè tanto meno l'anteprima visuale) che ti eseguono le pagine, anzi.

pensavo di associare all'evento DATABOUND della detailsview un "qualcosa" per settare il valore nella DDL, naturalmente dopo aver fatto il binding visto che ho scoperto che il bind azzera tutto!

imho non ha senso intercettare un evento, che ha un costo di esecuzione, quando puoi farlo benissimo in un modo più semplice. poi, se lo preferisci, in quell'evento ce la puoi fare eccome.
ecco un esempio, anche se diverso, per modificare le proprietà di un controllo del DetailsView:
http://www.aspitalia.com/script/764/BoundFieldMultilineaControlloDetailsView.aspx

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
28 messaggi dal 17 novembre 2005
grazie mille per la risposta!

<aspropdownlist ... SelectedValue='<%#Bind('nomecampo')%>'...
non so perche' all'inizio non funzionava nemmeno in locale o via IIS su uno dei miei server..
pazzesco!
ora funziona ed in effetti cosi è fin troppo semplice!

sto cmq dando capocciate per risolvere la cosa codebehind e spero prima o poi di riuscirci!
adesso guardo il link ke mi hai dato e vedo di estrapolare qualcosa di utile.

grazie
ancora
28 messaggi dal 17 novembre 2005
scusa.. mi sono dimenticato la cosa + importante..
la dropdownlist viene visualizzata nell'edititemtemplate e l'evento databound viene eseguito all'apertura della pagina.. qundi in modalità NON EDIT.
il ke da errore l'intercettazione della ddl perche' non esiste ancora (almeno.. questo è quello che credo di aver capito..)
infatti se intercetto la proprietà DetailsView1.CurrentMode ed esegui il codice SOLO se in EDIT funzia qualcosa in +.
è corretta la mia ipotesi? i controlli "nascosti", cioè nei template edit etc vengono cmq costruiti al LOAD della pagina o in un altro momento?
28 messaggi dal 17 novembre 2005
scusa ancora..
forse ho capito perche' continuo a riscontrare errori..
il controllo viene intercettato non come ddl ma come literal! è possibile?
questa è una pagina che dovrebbe fare solo l'inseriemento di un nuovo record e vorrei preimpostare la ddl con un valore che gli passo da querystring.


ti alego un pezzo di codice per capire..


<asp:Label ID="EditMSG" EnableViewState="False" ForeColor="Red" runat="Server" />


<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="id"
DataSourceID="SqlDataSource1" OnItemInserting="Validate_Update_Data" CellSpacing="1"
DefaultMode="Insert">
<Fields>
<asp:TemplateField HeaderStyle-BackColor="#E0E0E0" HeaderStyle-Font-Bold="True" HeaderStyle-HorizontalAlign="Right"
ItemStyle-VerticalAlign="Top" ItemStyle-BackColor="#E0E0E0" ItemStyle-ForeColor="#FF0000"
HeaderText="AZIONI >>">
<EditItemTemplate>
<asp:Button CommandName="Insert" Text="Crea nuova sede" CssClass="fieldsize" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Anagrafica" HeaderStyle-CssClass="r_alt">
<EditItemTemplate>
<asp:DropDownList SelectedValue='<%#bind("id_anagrafica")%>' ID="id_anagrafica"
runat="server" DataTextField="rag_sociale" DataValueField="id" CssClass="fieldsize"
DataSourceID="SqlDataSource2">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="sede" HeaderText="sede" SortExpression="sede" ControlStyle-CssClass="fieldsize"
HeaderStyle-CssClass="r_alt" />
</Fields>
</asp:DetailsView>


<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:GFM-studioConnectionString %>"
SelectCommand="SELECT sedi.* FROM sedi INNER JOIN anagrafiche ON sedi.id_anagrafica = anagrafiche.id"
InsertCommand="INSERT INTO dbo.sedi(id_anagrafica, sede) VALUES (@id_anagrafica, @sede)">
<InsertParameters>
<asp:Parameter Name="id_anagrafica" />
<asp:Parameter Name="sede" />
</InsertParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:xxxxx%>"
SelectCommand="SELECT [id], [rag_sociale] FROM [anagrafiche] WHERE ([id] = @id)">
<SelectParameters>
<asp:QueryStringParameter Name="id" QueryStringField="id" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>



e nel codebehind:

Protected Sub DetailsView1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles DetailsView1.Load
EditMSG.Text = DetailsView1.Rows(1).Cells(1).Controls(0).ToString
End Sub


Sub Validate_Update_Data(ByVal Src As Object, ByVal Args As DetailsViewInsertEventArgs)

If Args.Values("sede") = "" Then
Args.Cancel = True
EditMSG.Text = "-- La SEDE va specificata!"
End If

End Sub
magnetica wrote:
scusa ancora..
forse ho capito perche' continuo a riscontrare errori..
il controllo viene intercettato non come ddl ma come literal! è possibile? questa è una pagina che dovrebbe fare solo l'inseriemento di un nuovo record e vorrei preimpostare la ddl con un valore che gli passo da querystring.

starai beccando un controllo errato, perchè altrimenti non c'è verso che risulti un literal, forse non è ancora in edit mode (per cui sarebbe normale), dato che non vedo un pezzo di codice in cui verifichi che lo sia.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
2 messaggi dal 15 novembre 2003
Anche io ho lo stesso problema.
ho una detailsview con un templatefield al cui interno c'e; una ddl.
se cerco di iterare e stampo i tipi di controllo (DetailsView1.Rows[x].Cells[1].Controls[0].GetType().ToString()) mi trova tutte textbox ma la ddl me la vede come literalcontrol.
come e' possibile?
29 messaggi dal 20 maggio 2007
per intercettare una dropdownlist dentro un detailsview si deve fare questo:
(dropdownlist)detailsview.rows[x].cells[y].findcontrol("idDropdownlist")
almeno io faccio questo e la riesco a trovare.

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.