Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    ASP.NET Caricare più WebUserControl dinamicamente

    Ciao a tutti,

    premesso che sono alle prime armi con ASP.NET.

    Sto cercando di caricare dinamicamente un WebUserControl n volte nella stessa pagina

    Per il momento mi basterebbe sapere come farlo con un ''for'' semplice, poi successivamente, il mio progetto prevede una chiamata di una store procedure che restituisce dei valori che mi servono per la creazione di questi controlli!

    tornando a noi io ho provato cosi:
    codice:
    <form id="form1" runat="server" style="height: 100%" > 
    
                  <% For i As Integer = 1 To 3%> 
    
                   <uc1:ctlProva ID="ctlProva" runat="server" ></uc1:ctlProva>  
      
                 <%Next%> 
    
    </form>
    nel controllo è presente un label e una textbox... che ora come ora non fanno nulla...(era solo per inserire qualcosa)

    grazie a tutti
    a disposizione
    Far del Male è peccato,
    Far del Bene è sprecato...

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    E' l'approccio sbagliato, devi usare un placeholder.

    codice:
    <asp: placeholder id="phUCS" runat="server" />
    e lato server
    codice:
    Dim uc1 as New UserControl
    uc1 = LoadControl("...percorso del file ascx")
    
    If not isnothing(uc1) then
       uc1.ID = "uc1"
       phUCS.Controls.Add(uc1)
    End if
    e cosi' via per uc2 ed uc3


    l'ho scritto in VB ma e' facilmente traducibile

  3. #3
    grazie per la risposta.

    ero sicuro che sbagliavo dall'inizio!


    Altra domanda: Secondo te posso mettere quello che ho scritto in un ciclo for?

    proverò anche io questo pomeriggio!
    Far del Male è peccato,
    Far del Bene è sprecato...

  4. #4
    RISOLTO(credo) grazie a te!

    Semplicemente con un array di UserControl

    codice:
    Dim uc() As UserControl 
    
       ReDim uc(3)
    
       For i As Integer = 1 To 3 
    
          uc(i) = LoadControl("/ctlProva.ascx")
    
          If Not IsNothing(uc) Then
    
             uc(i).ID = "uc" & i 
    
             myPlaceholder.Controls.Add(uc(i))
    
          End If 
    
       Next

    postato il codice fatto! Magari serve a qualcuno!

    grazie ancora Mod
    Far del Male è peccato,
    Far del Bene è sprecato...

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    va bene ma dal punto di vista della memoria non credo sia proprio ottimale, gli array di UC sono pesantucci (specialmente quando l'UC diventa complesso).

    Ti converrebbe:

    codice:
     Dim uc as New UserControl 
     uc= LoadControl("/ctlProva.ascx")
     If Not IsNothing(uc) Then
             uc.ID = "uc" & i 
             myPlaceHolder.Controls.Add(uc)
     End if
    in un ciclo con un contatore qualsiasi.
    Il framework istanziera' uno User Control per ogni passaggio.

    ps: puoi anche aggiungere lo UC alla pagina con Me.Controls.Add(ucX), ma il placeholder serve a posizionarlo esattamente nel posto che vuoi.

    ciao

  6. #6
    Grazie mille ancora...

    infatti avevo notato la lentezza nel caricamento della pagina!

    Posso chiederti un altra cosetta? (ne approfitto)

    nel controllo che poi carico n volte ho 2 metodi di cui uno è il cambio nome della label che carico!

    come faccio a richiamare questi metodi? (sarà una cavolata lo so ma ripeto che non alle prime armi... poi prometto che mi leggo un manuale!!)
    Far del Male è peccato,
    Far del Bene è sprecato...

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Nello UC il metodo di cambio label deve essere pubblico, anzi a dire la verita' dovrebbe esserci una proprieta' con Set e Get che setta il suo testo, sempre pubblica.


    codice:
    Public Property TestoLabel() as String
       Get
          Return idLabel.Text
       End Get
       Set(ByVal Value as String)
          idLabel.Text = Value
       End Set
    End Property
    comunque:

    codice:
     Dim uc as New UserControl 
     uc= LoadControl("/ctlProva.ascx")
     If Not IsNothing(uc) Then
             uc.ID = "uc" & i 
             uc.TestoLabel = "ProvaSettaggioTesto"
             'uc. etc etc tutte le proprieta' ed i metodi che vuoi
    
             myPlaceHolder.Controls.Add(uc)
     End if

  8. #8
    facendolo cosi pero non mi trovava la proprietà 'TestoLabel'.

    se invece dichiaro la uc non come usercontrol ma come ctlProva mi trova la proprietà 'TestoLabel' e tutto fila liscio!

    codice:
    Dim uc as New ctlprova ....

    mi confermi che è corretto?!


    GRAZIE GRAZIE GRAZIE davvero!



    PS: posso chiederti altro?
    Far del Male è peccato,
    Far del Bene è sprecato...

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Si, in realta' il metodo LoadControl restituisce un oggetto di tipo (classe madre) UserControl.

    La metodologia corretta e' invocarlo e poi fare un ulteriore cast di sicurezza verso il tipo target. Scusa ma andavo a memoria.

    codice:
     Dim uc as New ctlProva
     uc= DirectCast(LoadControl("/ctlProva.ascx"), ctlProva)
     etc.
    se c'e' altro ed e' un argomento diverso, apri un nuovo thread.

    ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.