Avatar billede pnr Nybegynder
08. juni 2006 - 14:40 Der er 15 kommentarer og
2 løsninger

Indsætte usercontrol dynamisk

Jeg skal have lavet en side der replacer nogle bestemte tags i noget html med nogle usercontrols: eks

String html_fra_db = "<div>her er usercontrol1 [$usercontrol1$] <br/> her er usercontrol2 [$usercontrol2$]</div>"

disse tags ([$usercontrol1$]) skal udskiftes med nogle usercontrols, men hvordan gør jeg lige det?
Avatar billede pnr Nybegynder
08. juni 2006 - 14:41 #1
Koden må gerne være i c#
Avatar billede snepnet Nybegynder
08. juni 2006 - 15:42 #2
Hvordan sætter du teksten fra databasen ind nu?
Du kan altid loade en usercontrol med:
Control c = LoadControl("virtuel sti til kontrollen");
somePlaceholder.Controlls.Add(c);

Mvh
Avatar billede pnr Nybegynder
08. juni 2006 - 15:54 #3
Teksten fra databasen bliver indsat af brugeren i en Editor, han kan så indsætte nogle tags ([$$]) for at fortælle at der skal indsættes en bestemt funktion (en usercontrol) på det sted.
Avatar billede snepnet Nybegynder
08. juni 2006 - 16:33 #4
Det var mere hvordan du så sendte det den anden vej ... altså når slutbrugeren kigger på resultatet (går ud fra at det sådan en cms-agtig ting du bikser med).
Mvh
Avatar billede thrytter Nybegynder
08. juni 2006 - 17:01 #5
Måske noget i stil med følgende, hvor teksten opdeles i små bidder som behandles individuelt.

Dim sArray() As String
Dim i As Integer

Dim sText As String = "<div>her er usercontrol1 [$usercontrol1$] <br/> her er usercontrol2 [$usercontrol2$]</div>"

sText = sText.Replace("[$", "#[$")
sText = sText.Replace("$]", "$]#")

sArray = sText.Split("#")

For i = 0 To sArray.Length - 1
  If sArray(i).StartsWith("[$") And sArray(i).EndsWith("$]") Then
  ' Load og add den tilhørende UserControl
  Else
    Me.phTmp.Controls.Add(New LiteralControl(sArray(i)))
  End If
Next
Avatar billede pnr Nybegynder
09. juni 2006 - 08:58 #6
Så langt så godt. Med inspiration af forslaget fra thrytter fik jeg lavet følgende kode:

      // Der kontrolleres for om der er indsat usercontrols på siden
        if (indhold.Contains("[$"))
        {
            //Hvis der er usercontrols indsættes disse på de rette pladser
            indhold = indhold.Replace("[$", "#[$");
            indhold = indhold.Replace("$]", "$]#");
            string[] indhold_array = null;
            indhold_array = indhold.Split('#');

            for (int i = 0; i < indhold_array.Length; i++)
            {
                if (indhold_array[i].IndexOf("[$") != -1)
                {
                    string usercontrol_navn = indhold_array[i];
                    usercontrol_navn = usercontrol_navn.Replace("[$", "");
                    usercontrol_navn = usercontrol_navn.Replace("$]", "");

                    try
                    {
                        indhold_ph.Controls.Add(LoadControl(usercontrol_navn + ".ascx"));
                    }
                    catch
                    {
                        indhold_ph.Controls.Add(new LiteralControl("<strong>[Kontrollen kan ikke findes]</strong>"));
                    }
                }
                else
                    indhold_ph.Controls.Add(new LiteralControl(indhold_array[i]));
            }
        }
        else
            indhold_ph.Controls.Add(new LiteralControl(indhold));


MEN hvis jeg laver noget postback i min usercontrol virker det ikke. Sender jeg en querystring med i url kan jeg heller ikke fange den fra min usercontrol.
Avatar billede thrytter Nybegynder
09. juni 2006 - 09:29 #7
Du bliver desværre nødt til at kalde dit kodeeksempel ved hvert postback. Betyder også at teksten skal hentes fra basen hver gang, med mindre denne gemmes i ViewState.
Avatar billede pnr Nybegynder
09. juni 2006 - 09:34 #8
men det løser jo ikke mit problem?
Avatar billede thrytter Nybegynder
09. juni 2006 - 09:44 #9
Vil nu mene, at det skulle hjælpe på problemet "MEN hvis jeg laver noget postback i min usercontrol virker det ikke"

Dine usercontroller burde kunne fange querystring's
Avatar billede pnr Nybegynder
09. juni 2006 - 11:20 #10
Ja det fatter jeg heller ikke helt :-/

Hvis jeg gør følgende i min Usercontrol:

        Response.Write(Request.RawUrl.ToString());
        string navn = Request.QueryString["navn"];

så udsriver den url'en med quesrystring, men jeg får bare aldrig det navn når jeg spørg efter den i min næste handling.


Med hensyn til at lave et postback i min usercontrol forstår jeg godt det ikke virker for den event der bliver kastet blivder vel aldrig "grebt" for der bliver jo loadet en ny usercontrol. Men de må man da kunne løse på en eller anden måde?
Avatar billede thrytter Nybegynder
09. juni 2006 - 11:57 #11
Hvis du vil fange / gribe et event fra en kontrol kræver det, at kontrollen er en del af kontroltræet på siden.

Normalt kan .net parseren ?? se kontroltræet på .aspx siden, men når der postback'es efter (dynamisk) tilføjelse af kontroller mangler disse i kontroltræet. Og er grundet til at dynamisk tilføjede kontroller skal tilføjes ved hvert postback (hvis du vil fange events)

Ved ikke om man kan sige, at der loades en ny usercontrol - det er egentlig den samme. Tekstbokse og andre kontroller på den loadede usercontrol bevarer forøvrigt deres værdier.

Ved ikke om forklaringen rækker - måske har snepnet en bedre.
Avatar billede snepnet Nybegynder
09. juni 2006 - 16:18 #12
Der instantieres en ny kontrol i koden, men fordi det sker på samme måde som sidst siden blev loadet, ender kontrollen med at have samme id, hvorved dens tidligere tilstands kan slås op og hentes i viewstate.
Mvh
Avatar billede pnr Nybegynder
09. juni 2006 - 16:24 #13
Hvordan får jeg den til at reagere på eventen?
Avatar billede snepnet Nybegynder
10. juni 2006 - 13:03 #14
Hvilket event ... Er det et event du har internt i din kontrol, eller vil du gerne på din form, abbonnere på et event din usercontrol populerer?
Hvis det er events du gerne vil abbonere på udefra, må du abbonnere på dem ved indsættelsen:
indhold_ph.Controls.Add(LoadControl(usercontrol_navn + ".ascx"));
Vil derfor ikke være tilstrækkeligt:

Har du en kontrol der hedder SomeControl - der tilbyder et event (SomeEvent) - må du gøre sådan her istedet:

SomeControl c = LoadControl(usercontrol_navn + ".ascx") as SomeControl;
c.SomeEvent += new EventHander(SomeHandler);

Og det må du så have defineret:

protected void SomeHandler(object sender, EventArgs e)
{
  // .... et eller andet der skal gøre.
}

Hvis det er event internt i din usercontrol - f.eks. at du håndterer klikeventet på en knap der er indsat på kontrollen, skulle der ikke være nogle problemer med at de fungerer - sålænge kontrollen indsætter hver gang.

Mvh
Avatar billede pnr Nybegynder
04. juli 2006 - 09:08 #15
Jeg takker jer begge for jeres hjælp, smid et svar begge to så får i point!
Avatar billede thrytter Nybegynder
04. juli 2006 - 09:18 #16
svar
Avatar billede snepnet Nybegynder
04. juli 2006 - 14:18 #17
Kommer her :o)
Mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester