Archief - Ajax PreRender

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Cedric

Legacy Member
Ik moet dynamisch belstellijnen toevogen aan een bestelform MET een ajax CalenderExtender wanneer ik op een knop (addrow) duw.

Mijn oplossing hiervoor was een Web user control aanmaken waar ik elke rij + die CalenenderExtender aan toevoeg.
Ik benoem alle controls met hun originele id's en de UC's noem ik UCBestellijn + i -> waardoor ik de controls kan aanspreken met UCBestellijn1.txtNaam.text

ik pak dat aan door een panel aan te maken, UC aan toe te voegen en panel op te slaan in een Session. Bij het laden van die Pagina overschreef ik dat panel door die Session.

Toen kreeg ik de foutmelding Extender controls may not be registered after PreRender.

Na wat opzoeken las ik dat ik de PreRender Method moest overriden met de volgende code

protected override void OnPreRender(EventArgs e)
{
// add base.OnPreRender(e); at the beginning of the method.
base.OnPreRender(e);
// codes to handle with your controls.
...
}

op de plaats van die ... zet ik dan het panel gelijk aan de session.
Voorlopig leek dit te werken totdat ik besefte dat, wanneer die OnPreRender afgelopen is, die controls niet meer op het panel staan, waardoor ik steeds maar 1 bestellijn zie op mijn pagina.
Ik heb het internet al platgezocht naar een oplossing

Hieronder de volledige code: Ik heb aanduidingen gemaakt in het rood

MVG

Cedric




Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TraceringAntibiotica.Service;
using System.Drawing;
using TraceringAntibiotica.Domain;
using TraceringAntibiotica.Domain.Enumerations;
using System.Web.UI.HtmlControls;
namespace Antibiotica.Web
{
    public partial class Opzoeken_Patient : System.Web.UI.Page
    {
        HtmlTable table;
        int i;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Session[SessionEnum.Key.i.ToString()] = 1;
                table = new HtmlTable();
                table.Border = 1;
                Session[SessionEnum.Key.tabel.ToString()] = table;
                Session[SessionEnum.Key.panel.ToString()] = pnlBestelLijnen;
            }
            
            table = (HtmlTable)Session[SessionEnum.Key.tabel.ToString()];
            Gebruiker gebruiker = (Gebruiker)Session["user"];
            PnlMenu1.BackColor = Color.White;
            //fill Verpleekundige gegevens
            txtVerpleegkundigePersoneelsNr.Text = gebruiker.PersoneelsNummer;
            txtVerpleegkundigeVoornaam.Text = gebruiker.Voornaam;
            txtVerpleegkundigeNaam.Text = gebruiker.Naam;
            txtVerpleegkundigeEenheid.Text = gebruiker.VerpleegEenheid.ToString();
            //fill arts gegevens
            if (Session[SessionEnum.Key.GeselecteerdeArts.ToString()] != null)
            {
                Arts arts = (Arts)Session[SessionEnum.Key.GeselecteerdeArts.ToString()];
                txtNaamVoorschrijvendeArts.Text = arts.Naam;
                txtVoorNaamVoorschrijvendeArts.Text = arts.Voornaam;
            }

            //test.Controls.Add(table);
        }
        protected void btnOpzoekenPatient_Click(object sender, EventArgs e)
        {
        }
        protected void btnSelecteerAndereArts_Click(object sender, EventArgs e)
        {
            Response.Redirect("opzoeken_arts.aspx");
            Session[SessionEnum.Key.GeselecteerdeArts.ToString()] = null;
        }
        protected override void OnPreRender(EventArgs e)
        {
            // add base.OnPreRender(e); at the beginning of the method.
            int i = pnlBestelLijnen.Controls.Count;
            base.OnPreRender(e);
            i = pnlBestelLijnen.Controls.Count;
            
            // codes to handle with your controls.
            pnlBestelLijnen = (Panel)Session[SessionEnum.Key.panel.ToString()];
            i = pnlBestelLijnen.Controls.Count; [COLOR="Red"][B]-> Hier zit nog een control, dus wordt afgebeeld op de pagina[/B][/COLOR]        }
 
 
        protected void btnToevoegenBestellijn_Click(object sender, EventArgs e)
        {
            int oi = pnlBestelLijnen.Controls.Count; [B][COLOR="Red"]-> Hier is de control weg[/COLOR][/B]            int i = (int)Session[SessionEnum.Key.i.ToString()];
            Control uc = LoadControl("UCBestellijn.ascx");
            uc.ID = "uc" + i;
            pnlBestelLijnen.Controls.Add(uc);
            oi = pnlBestelLijnen.Controls.Count;
            Session[SessionEnum.Key.panel.ToString()] = pnlBestelLijnen;
            i++;
            Session[SessionEnum.Key.i.ToString()] = i;

        }
    }
}

Obliv`

Legacy Member
Dynamisch toegevoegde user controls moet je bij elke postback terug allemaal toevoegen aan je pagina.

Dus, bij het klikken op de addrow knop steek je de nieuwe usercontrol in de viewstate.
Vervolgens roep je een procedure op die de collectie usercontrols uit de viewstate haalt en ze in je panel rendered.
In de page load roep je ook die procedure op zodat bij elke postback de controls terug toegevoegd worden aan je pagina.

Als je eventhandlers gaat binden aan bepaalde events van je usercontrol moet je dat natuurlijk ook bij elke postback opnieuw doen.

Cedric

Legacy Member
heb gevonden wat het probleem was. Blijkbaar na voor het laden van de onclick event vliegt hij naar de page load, wat normaal is dacht ik. Maar na het verlaten van de methode vliegt hij er opnieuw naartoe en negeert hij de Page.IsPostBack waardoor het hernieuw aangemaakt is. Ik controleer nu of de sessie leeg is
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan