Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887

    Controlli figlio di un PlaceHolder

    Carico dinamicamente un controllo (ascx) in un placeholder

    codice:
                ' Carica la prima riga ordine...
                If phrigaordine.Controls.Count = 0 Then
                    Dim ctlrigheord As Control = LoadControl("controls/ctrRigaOrdine.ascx")
                    phrigaordine.Controls.Add(ctlrigheord)
                    ctlrigheord = Nothing
                    lbrighe.Text = "- Righe: <font color=red>" & phrigaordine.Controls.Count & "</font>"
                End If
    ora, alla pressione di un tasto eseguo questa routine per aggiungere una riga :

    codice:
        Public Sub addRow(ByVal Src As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
            Dim ctlrigheord As Control = LoadControl("controls/ctrRigaOrdine.ascx")
            phrigaordine.Controls.Add(ctlrigheord)
            ctlrigheord = Nothing
            lbrighe.Text = "- Righe: <font color=red>" & phrigaordine.Controls.Count & "</font>"
        End Sub


    il controllo ascx è molto semplice ed è una cosa tipo:
    codice:
    <%@ Control Language="vb" AutoEventWireup="false" %>
         <tr>
            .
            .
            .
         </tr>

    Ora, perchè oltre il secondo controllo aggiunto non va ? O meglio, perchè alla seconda pressione del tasto di aggiunta rimpiazza il secondo controllo (l'ultimo quindi) con uno nuovo ?

  2. #2
    ho provato a fare quello che dici tu, cioè che il secondo controllo si aggiunga sempre ci sono riuscito utilizzando un array di usercontrol in una session. Magari non è il massimo a livello di prestazioni ma va'

    Prima di tutto inizializzo la session nel global.asax

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    Dim controlli(10) As UserControl
    Session("p") = controlli
    End Sub

    Poi creo la segg. classe:

    codice:
    Public Class prop
        Inherits System.Web.UI.Page
    
        Public Function SetArrCont(ByVal value As UserControl) As UserControl()
            Dim controlli() As UserControl = Session("p")
            For i As Integer = 1 To 10
                If controlli(i) Is Nothing Then
                    controlli(i) = value
                    Exit For
                End If
            Next
            Session("p") = controlli
        End Function
    
        Public Function GetArrCont() As UserControl()
            Dim controlli() As UserControl = Session("p")
            Return controlli
        End Function
    
    End Class
    ed ecco la pagina con i controlli:

    codice:
     
    
    'Istanzio la classe creata
    Private p As New prop
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If Not IsPostBack Then
                Dim ctlrigheord As UserControl = CType(LoadControl("ascx/ctl1.ascx"), UserControl)
                phUno.Controls.Add(ctlrigheord)
                lbRighe.Text = "- Righe: <font color=red>" & phUno.Controls.Count & "</font>"
                p.SetArrCont(ctlrigheord)
                ctlrigheord = Nothing
            Else
                For Each s As UserControl In p.GetArrCont()
                    If Not s Is Nothing Then phUno.Controls.Add(s)
                Next
            End If
    
    
        End Sub
    
        Private Sub btnUno_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUno.Click
            'Dim ctlrigheord As Control = LoadControl("ascx/ctl1.ascx")
            Dim ctlrigheord As UserControl = CType(LoadControl("ascx/ctl2.ascx"), UserControl)
            phUno.Controls.Add(ctlrigheord)
            lbRighe.Text = "- Righe: <font color=red>" & phUno.Controls.Count & "</font>"
            p.SetArrCont(ctlrigheord)
            ctlrigheord = Nothing
        End Sub
    NB cos' com'è la sequenza dei controlli è limitata a 10. A te espanderla.

    Ti allego la solution di VS.
    http://www.sndk.org/programma/provaloadcontrol.zip

    Sndk
    "La vendetta è un piatto che va gustato freddo"
    Antico proverbio Klingon.
    Lo chiamavano il 'Computer Umano'. Sapeva contare fino a 20 e nudo fino a 21!

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Non funziona perchè hai fatto un errore concettuale di base: I controlli aggiunti tramite il metodo LoadControl non vengono memorizzati automaticamente nella pagina durante i postback. Il che vuol dire che debbono essere sempre creati.
    Ho fatto una pagina di prova. Non ho mai usato gli UC in questo modo, ma sembra funzionare. In pratica, l'UC è semplicemente:
    codice:
    <tr>
    	<td>
    		<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
    	</td>
    </tr>
    ed ha una proprietà pubblica:
    codice:
        Public Property Testo$()
            Get
                Return Me.TextBox1.Text
            End Get
            Set(ByVal Value$)
                Me.TextBox1.Text = Value
            End Set
        End Property
    La pagina ospitante, ha tre pulsanti:
    1) refresh, per simulare il postback generico
    2) aggiungi controllo
    3) togli controllo

    codice:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="a.aspx.vb" Inherits="corso_apogeo.a"%>
    <%@ Register TagPrefix="uc1" TagName="UCriga" Src="UCriga.ascx" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    	<HEAD>
    		<title>a</title>
    		<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    		<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
    		<meta content="JavaScript" name="vs_defaultClientScript">
    		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    	</HEAD>
    	<body MS_POSITIONING="FlowLayout">
    		<form id="Form1" method="post" runat="server">
    			
    
    <asp:button id="Button1" runat="server" Text="Aggiungi riga"></asp:button>
    			<asp:button id="Button2" runat="server" Text="Togli riga"></asp:button></P>
    			
    
    <asp:linkbutton id="LinkButton1" runat="server">Refresh</asp:linkbutton></P>
    			<table border="1">
    				<asp:placeholder id="PlaceHolder1" runat="server"></asp:placeholder>
    			</table>
    		</form>
    	</body>
    </HTML>
    Il codice sottostante è:
    codice:
    Public Class a
        Inherits System.Web.UI.Page
    
    #Region " Codice generato da Progettazione Web Form "
    
        'Chiamata richiesta da Progettazione Web Form.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
        End Sub
        Protected WithEvents Button1 As System.Web.UI.WebControls.Button
        Protected WithEvents PlaceHolder1 As System.Web.UI.WebControls.PlaceHolder
        Protected WithEvents Button2 As System.Web.UI.WebControls.Button
        Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
    
        'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
        'Non spostarla o rimuoverla.
        Private designerPlaceholderDeclaration As System.Object
    
        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
            'Non modificarla nell'editor del codice.
            InitializeComponent()
        End Sub
    
    #End Region
    
        Private n_righe% = 0
        Private testo$(-1)
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
            Dim o As Object = Me.ViewState("n_righe")
    
            If o Is Nothing Then
                n_righe = 0
            Else
                n_righe = CInt(o)
                testo = DirectCast(ViewState("testo"), String())
            End If
    
            For i As Integer = 1 To n_righe
                Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
                uc.Testo = testo(i - 1)
                Me.PlaceHolder1.Controls.Add(uc)
            Next
    
    
    
    
        End Sub
    
        Private Sub AggiungiRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
            n_righe += 1
            Me.ViewState("n_righe") = n_righe
    
            ReDim Preserve testo(n_righe - 1)
            testo(n_righe - 1) = uc.Testo
            Me.ViewState("testo") = testo
    
            Me.PlaceHolder1.Controls.Add(uc)
    
        End Sub
    
    
        Private Sub TogliRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If n_righe = 0 Then Exit Sub
    
            n_righe -= 1
            Me.ViewState("n_righe") = n_righe
    
            ReDim Preserve testo(n_righe - 1)
            Me.ViewState("testo") = testo
    
            Me.PlaceHolder1.Controls.RemoveAt(n_righe)
    
        End Sub
    End Class
    Naturalmente ci saranno modi migliori per fare questo; il mio è solo un esercizio.

    Pietro

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Visto che mi sto divertendo a smanettare, ho trovato che per fare questo è necessario solamente conservare traccia del numero di controlli inseriti.
    Nell'UC, che ha un TextBox, voglio mantenere lo stato. Perciò aggiungo questa proprietà pubblica:

    codice:
        Public ReadOnly Property TextName$()
            Get
                Return Me.TextBox1.UniqueID
            End Get
        End Property
    La pagina ospitante ha il codice:
    codice:
        Private n_righe% = 0
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
            Dim o As Object = Me.ViewState("n_righe")
    
            If o Is Nothing Then
                n_righe = 0
            Else
                n_righe = CInt(o)
            End If
    
            For i As Integer = 1 To n_righe
                Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
                uc.Testo = Trim(Me.Request.Form(uc.TextName))
                Me.PlaceHolder1.Controls.Add(uc)
            Next
    
    
    
    
        End Sub
    
        Private Sub AggiungiRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
            n_righe += 1
            Me.ViewState("n_righe") = n_righe
    
            Me.PlaceHolder1.Controls.Add(uc)
    
        End Sub
    
    
        Private Sub TogliRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If n_righe = 0 Then Exit Sub
    
            n_righe -= 1
            Me.ViewState("n_righe") = n_righe
    
            Me.PlaceHolder1.Controls.RemoveAt(n_righe)
    
        End Sub
    Pietro

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Grazie 1000 ad entrambi, l'errore era appunto quello di pensare che i successivi controlli, dopo il primo, durante i successivi PostBacks, fossero "ricordati" dalla pagina. Ma non è così.

    (ma in realta' neanche il primo si ricorda, perche' e' aggiunto con loadcontrol come gli altri)

    ...

    Prendero' spunto da una delle due soluzioni e faccio sapere.

    La mia paura pero è : se prendo N controlli ascx creati con LoadControl sulla pagina con delle stringhe scritte in delle textboxes, li metto ad esempio in un hashtable e poi li ricreo, aggiungendone uno nuovo...le stringhe nelle textboxes sono preservate ?

    ancora grazie

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quando vuole lui, asp.net è anche intelligente. Ti mando un piccolo esempio di prova.

    UserControl:
    codice:
    <%@ Control Language="vb" AutoEventWireup="false" Codebehind="UCriga.ascx.vb" Inherits="corso_apogeo.UCriga" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
    <tr>
    	<td>
    		<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
    	</td>
    </tr>
    
    =========================================================================
    Public Class UCriga
        Inherits System.Web.UI.UserControl
    
    #Region " Codice generato da Progettazione Web Form "
    
        'Chiamata richiesta da Progettazione Web Form.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
        End Sub
        Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
    
        'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
        'Non spostarla o rimuoverla.
        Private designerPlaceholderDeclaration As System.Object
    
        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
            'Non modificarla nell'editor del codice.
            InitializeComponent()
        End Sub
    
    #End Region
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
        End Sub
    
        Public Property Testo$()
            Get
                Return Me.TextBox1.Text
            End Get
            Set(ByVal Value$)
                Me.TextBox1.Text = Value
            End Set
        End Property
    
    
    End Class

    pagina contenitore di prova
    codice:
    <%@ Register TagPrefix="uc1" TagName="UCriga" Src="UCriga.ascx" %>
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="a.aspx.vb" Inherits="corso_apogeo.a"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    	<HEAD>
    		<title>a</title>
    		<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    		<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
    		<meta content="JavaScript" name="vs_defaultClientScript">
    		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    	</HEAD>
    	<body MS_POSITIONING="FlowLayout">
    		<form id="Form1" method="post" runat="server">
    			
    
    <asp:button id="Button1" runat="server" Text="Aggiungi riga"></asp:button>
    				<asp:button id="Button2" runat="server" Text="Togli riga"></asp:button>
    				<asp:Button id="Button3" runat="server" Text="Recupero testo"></asp:Button></P>
    			
    
    <asp:linkbutton id="LinkButton1" runat="server">Refresh</asp:linkbutton></P>
    			<table border="1">
    				<asp:placeholder id="PlaceHolder1" runat="server"></asp:placeholder>
    			</table>
    		</form>
    	</body>
    </HTML>
     
    =======================================================================================
    
    Public Class a
        Inherits System.Web.UI.Page
    
    #Region " Codice generato da Progettazione Web Form "
    
        'Chiamata richiesta da Progettazione Web Form.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
        End Sub
        Protected WithEvents Button1 As System.Web.UI.WebControls.Button
        Protected WithEvents PlaceHolder1 As System.Web.UI.WebControls.PlaceHolder
        Protected WithEvents Button2 As System.Web.UI.WebControls.Button
        Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
        Protected WithEvents Button3 As System.Web.UI.WebControls.Button
    
        'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
        'Non spostarla o rimuoverla.
        Private designerPlaceholderDeclaration As System.Object
    
        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
            'Non modificarla nell'editor del codice.
            InitializeComponent()
        End Sub
    
    #End Region
    
        Private n_righe% = 0
    
        Protected WithEvents UC As UCriga
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
            Dim o As Object = Me.ViewState("n_righe")
    
            If o Is Nothing Then
                n_righe = 0
            Else
                n_righe = CInt(o)
            End If
    
            For i As Integer = 1 To n_righe
                UC = DirectCast(LoadControl("UCriga.ascx"), UCriga)
                UC.ID = "uc_" & i
    
                Me.PlaceHolder1.Controls.Add(UC)
            Next
    
        End Sub
    
        Private Sub AggiungiRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            UC = DirectCast(LoadControl("UCriga.ascx"), UCriga)
            n_righe += 1
            Me.ViewState("n_righe") = n_righe
            UC.ID = "uc_" & n_righe
            Me.PlaceHolder1.Controls.Add(uc)
    
        End Sub
    
    
        Private Sub TogliRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If n_righe = 0 Then Exit Sub
    
            n_righe -= 1
            Me.ViewState("n_righe") = n_righe
    
            Me.PlaceHolder1.Controls.RemoveAt(n_righe)
    
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            For i As Integer = 1 To n_righe
                PrintLn(DirectCast(Me.FindControl("uc_" & i), UCriga).Testo)
    
            Next
        End Sub
    End Class
    Pietro

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    accidenti, mi gira la testa

    meglio che vada a pranzo e poi riprendiamo...

    ci sono riuscito cmq grazie ai vs consigli...pero' ci sono ancora dei problemi.

    a dopo

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da djciko
    accidenti, mi gira la testa

    meglio che vada a pranzo e poi riprendiamo...

    ci sono riuscito cmq grazie ai vs consigli...pero' ci sono ancora dei problemi.

    a dopo
    Visto che TU hai mangiato ed io sono digiuno riprendo con un esempio un po' più interessante
    Ho un UC che ha un TextBox ed un pulsante. Ad ogni click voglio recuperare il valore del textbox

    UserControl:
    codice:
    <%@ Control Language="vb" AutoEventWireup="false" Codebehind="UCriga.ascx.vb" Inherits="corso_apogeo.UCriga" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
    <tr>
    	<td>
    		<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
    		<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
    	</td>
    </tr>
    
    ====================================================
    
    Public Class UCriga
        Inherits System.Web.UI.UserControl
    
    #Region " Codice generato da Progettazione Web Form "
    
        'Chiamata richiesta da Progettazione Web Form.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
        End Sub
        Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
        Protected WithEvents Button1 As System.Web.UI.WebControls.Button
    
        'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
        'Non spostarla o rimuoverla.
        Private designerPlaceholderDeclaration As System.Object
    
        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
            'Non modificarla nell'editor del codice.
            InitializeComponent()
        End Sub
    
    #End Region
    
        Public Event onClick(ByVal sender As Object, ByVal e As EventArgs)
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
        End Sub
    
        Public Property Testo$()
            Get
                Return Me.TextBox1.Text
            End Get
            Set(ByVal Value$)
                Me.TextBox1.Text = Value
            End Set
        End Property
    
    
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            RaiseEvent onClick(Me, e)
        End Sub
    End Class

    Pagina chiamante:
    codice:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="a.aspx.vb" Inherits="corso_apogeo.a"%>
    <%@ Register TagPrefix="uc1" TagName="UCriga" Src="UCriga.ascx" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    	<HEAD>
    		<title>a</title>
    		<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    		<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
    		<meta content="JavaScript" name="vs_defaultClientScript">
    		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    		<LINK href="../Styles.css" type="text/css" rel="stylesheet">
    	</HEAD>
    	<body MS_POSITIONING="FlowLayout">
    		<form id="Form1" method="post" runat="server">
    			
    
    <asp:button id="Button1" runat="server" Text="Aggiungi riga"></asp:button>
    				<asp:button id="Button2" runat="server" Text="Togli riga"></asp:button>
    				<asp:Button id="Button3" runat="server" Text="Recupero testo"></asp:Button></P>
    			
    
    <asp:linkbutton id="LinkButton1" runat="server">Refresh</asp:linkbutton></P>
    			<table border="1">
    				<asp:placeholder id="PlaceHolder1" runat="server"></asp:placeholder>
    			</table>
    		</form>
    	</body>
    </HTML>
    
    ========================================================
    
    Public Class a
        Inherits System.Web.UI.Page
    
    #Region " Codice generato da Progettazione Web Form "
    
        'Chiamata richiesta da Progettazione Web Form.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
        End Sub
        Protected WithEvents Button1 As System.Web.UI.WebControls.Button
        Protected WithEvents PlaceHolder1 As System.Web.UI.WebControls.PlaceHolder
        Protected WithEvents Button2 As System.Web.UI.WebControls.Button
        Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
        Protected WithEvents Button3 As System.Web.UI.WebControls.Button
    
        'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
        'Non spostarla o rimuoverla.
        Private designerPlaceholderDeclaration As System.Object
    
        Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
            'Non modificarla nell'editor del codice.
            InitializeComponent()
        End Sub
    
    #End Region
    
        Private n_righe% = 0
    
        Protected UC As UCriga
    
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina
            Dim o As Object = Me.ViewState("n_righe")
    
            If o Is Nothing Then
                n_righe = 0
            Else
                n_righe = CInt(o)
            End If
    
            For i As Integer = 1 To n_righe
                UC = DirectCast(LoadControl("UCriga.ascx"), UCriga)
                UC.ID = "uc_" & i
                AddHandler UC.onClick, AddressOf Me.UC_onClick
                Me.PlaceHolder1.Controls.Add(UC)
            Next
    
        End Sub
    
        Private Sub AggiungiRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            UC = DirectCast(LoadControl("UCriga.ascx"), UCriga)
            n_righe += 1
            Me.ViewState("n_righe") = n_righe
            UC.ID = "uc_" & n_righe
            AddHandler UC.onClick, AddressOf Me.UC_onClick
            Me.PlaceHolder1.Controls.Add(uc)
    
        End Sub
    
    
        Private Sub TogliRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If n_righe = 0 Then Exit Sub
    
            n_righe -= 1
            Me.ViewState("n_righe") = n_righe
    
            Me.PlaceHolder1.Controls.RemoveAt(n_righe)
    
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            For i As Integer = 1 To n_righe
                PrintLn(DirectCast(Me.FindControl("uc_" & i), UCriga).Testo)
    
            Next
        End Sub
    
        Private Sub UC_onClick(ByVal sender As Object, ByVal e As System.EventArgs)
            PrintLn(DirectCast(sender, UCriga).Testo)
        End Sub
    
    End Class
    Pietro

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Allora, visto che HO mangiato posso scrivere un po' di codice :

    Il controllo è questo (non ha una classe da cui eredita, quindi niente proprietà pubbliche, e non lo lo registro con TagPrefix...lo carico solo con LoadControl) :

    codice:
     
    <%@ Control Language="vb" AutoEventWireup="false" %>
    <tr>
     <td height=10px colspan=8></td>
    </tr>
    <tr>
    <td align="left" width=13%>
     <font class="labels_small">Cod.Art:</font>
    </td>
    <td align="left" width=13%>
     <asp:textbox id="tbcodart" runat="server" CssClass="boxdocumenti" />
    </td>
    </tr>
    .
    .
    .


    Questo è il pezzo di codice con il placeholder che viene riempito di controlli ascx :

    codice:
    						<TABLE cellSpacing="1" cellPadding="1" width="100%" align="center" border="0">
    						    <asp:placeholder id="phrigaordine" runat="server"></asp:placeholder>
    						</TABLE>

    Questo è il codice "a freddo" (nel Page_Load) che carica il primo ascx e lo piazza nel placeholder (e per ora mette il controllo in un hashtable con chiave il numero di riga):

    codice:
                ' ==============================
                ' CARICA LA PRIMA RIGA ORDINE...
                ' ==============================
                If Not IsPostBack Then
                    If phrigaordine.Controls.Count = 0 Then
                        Dim ctlrigheord As Control = LoadControl("controls/ctrRigaOrdine.ascx")
                        phrigaordine.Controls.Add(ctlrigheord)
                        lbrighe.Text = "- Righe: <font color=red>" & phrigaordine.Controls.Count & "</font>"
                        Session("numerorighe") = 0
                        ListaASCX.Add(Convert.ToString(Session("numerorighe")), ctlrigheord)
                        Session("hash") = ListaASCX
                    End If
                End If

    ed ecco le due Sub che Aggiungono e Tolgono le righe (la seconda le toglie tutte per ora):

    codice:
     
        Public Sub AddRow(ByVal Src As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
            ' Carica i vecchi...
            ListaASCX = DirectCast(Session("hash"), Hashtable)
            Dim Chiave As String = ""
            For Each Chiave In ListaASCX.Keys
                Response.Write(Chiave)
                phrigaordine.Controls.Add(CType(ListaASCX(Chiave), Control))
            Next
    
            ' Ne aggiunge uno
            Dim ctlrigheord As Control = LoadControl("controls/ctrRigaOrdine.ascx")
            phrigaordine.Controls.Add(CType(ListaASCX(Chiave), Control))
    
            Session("numerorighe") = CInt(Session("numerorighe")) + 1
            ListaASCX.Add(Convert.ToString(Session("numerorighe")), ctlrigheord)
            Session("hash") = ListaASCX
            lbrighe.Text = "- Righe: <font color=red>" & ListaASCX.Count & "</font>"
        End Sub
    
    
    
        Public Sub ClearRows(ByVal Src As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
            Dim ht As Hashtable = CType(Session("hash"), Hashtable)
            Dim numerocontrolli As Integer = ht.Count
    
            If phrigaordine.HasControls Then
                phrigaordine.Controls.Clear()
            End If
            Tools.MessageBox(Me, "Rimosse " & numerocontrolli & " righe.")
            lbrighe.Text = "- Righe: <font color=red>0</font>"
        End Sub

    E funziona (quasi).
    Pero' ci sono due problemi :
    1 - Non mantiene i valori scritti nelle precedenti righe (problema grosso, che forse mi obbligherà ad optare per una soluzione completamente diversa..)
    2 - Se rimuovo TUTTE le righe (con phrigaordine.Controls.Clear)
    aggiungendone poi una le rimette tutte !!! VVoVe:

    ora provo ad implementare l'esempio che mi hai dato tu di Apogeo..

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    E funziona (quasi).
    Pero' ci sono due problemi :
    1 - Non mantiene i valori scritti nelle precedenti righe (problema grosso, che forse mi obbligherà ad optare per una soluzione completamente diversa..)
    2 - Se rimuovo TUTTE le righe (con phrigaordine.Controls.Clear)
    aggiungendone poi una le rimette tutte !!!

    ora provo ad implementare l'esempio che mi hai dato tu di Apogeo..
    Quando ho cominciato ad interessarmi di asp.net ho comprato il libro di Apogeo e, con Visual Studio ho fatto un progetto per eseguire gli esempi, chiamato Corso_Apogeo. Adesso, ci archivio tutti gli esempi che faccio che credo interessanti, per uso futuro. NON HO MAI CAPITO COME FARE, CON VISUAL STUDIO A CAMBIARE IL NOME DEL PROGETTO, O A CREARNE UNO NUOVO E TRAVASARE LE PAGINE (TUTTE O PARTE) DA UN PROGETTO ALL'ALTRO.

    Comunque, l'esempio che ti ho spedito, funziona. Ossia, basta memorizzare il numero delle righe e mettere l'intestazione, Protected UC As UCriga, perchè tutto funzioni. Prima ho tentato di memorizzare un vettore con i valori dei TextBox contenuti, poi altre soluzioni: ma è tutto superfluo, perchè di tutto questo, cioè conservare lo stato dei textbox, se ne occupa il Framework in automatico. Nell'ultimo esempio fatto (non l'ho spedito però) ho pure aggiunto una istruzione javascript che mi dà il focus sul textbox quando inserisco una riga nuova

    Insomma, è molto interessante e va sperimentato. Ciao
    Pietro

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.