webForumDet fria alternativet

Komma åt klasser...

.NET

5 svar · 243 visningar · startad av mmmMange

Medlem sedan jan. 2005110 inlägg
Frågan#1

Alltså det här är säkert riktigt simpelt, men jag hittar inget när jag söker på google... hittar mest en massa artiklar som man måste betala för att få läsa hela...

Jo, jag har en sida, showpage.aspx. Den innehåller själva sidlayouten med sidhuvud, meny och sidfot.

Sen vill jag då ladda in olika sidor "inuti" denna sida, beroende på vilken sida (bestäms av en GET-parameter) som skall visas. Använder mig av en Placeholder för detta ändamål, och laddar in sidorna som UserControls med LoadControl().

    select case Request.QueryString("page")
        case "showquestion"
            ctlPageCtrl = LoadControl("showquestion.ascx")
        case "showresults"
            ctlPageCtrl = LoadControl("showresults.ascx")
        case "addquestion"
            ctlPageCtrl = LoadControl("addquestion.ascx")
        case else
            ctlPageCtrl = LoadControl("startpage.ascx")
    end select

    plhPageCtrl.Controls.Add( ctlPageCtrl )

Men om jag vill kunna komunicera med ctlPageCtrl (anropa funktioner, ändra attribut, etc) så måste ju deras klasser finnas tillgängliga för showpage.aspx. Hur gör jag detta??? För som det är nu så vet ju showpage.aspx ingenting om usercontrol'en som laddas in, och därför kan jag ju inte kommunicera med den...

Om nån fattar vad jag menar, så skriv gärna ett enkelt kodexempel.

Tackar på förhand!

Medlem sedan juli 2004206 inlägg
#2

Ett bra sätt att kolla vilka klasser, propertys och values som är tillgängliga är att du debuggar koden. Sätt en breakpoint ungefär där du skulle vilja anropa dessa klasser. Tryck på Play ikonen. När sidan haltas vid idn breakpoint så leta upp ett fönster som heter Locals. Där ser du, i en trädstruktur, allt som du kommer åt och vilka värden de har vid just detta tillfälle.

Själv kör jag alltid med ett stort Local fönster när jag debuggar så blir det lättare att se vad som händer. Response.write debuggningens tid är förbi! =)

Medlem sedan jan. 2005110 inlägg
#3

Nej det är inte alls så jag menar. Jag menar att jag ju inte kan komma åt medlemsfunktioner och annat i mina usercontrols... Alltså om vi tar ett litet exempel, så kanske du kan förklara hur det ska se ut:

test.aspx

<%@ Page Language="VB" Debug="True" %>
<script runat="server">

    dim public str as string
    
    Sub Page_Load(sender As Object, e As EventArgs)
        dim ctrl1 as Control
    
        ctrl1 = LoadControl("testcontrol.ascx")
        ctrl1.str = "Foo"
        PlaceHolder1.Controls.Add( ctrl1 )

        Response.Write( str )
    End Sub

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:PlaceHolder id="PlaceHolder1" runat="server"></asp:PlaceHolder>
    </form>
</body>
</html>

testcontrol.ascx

<%@ Control Language="VB" Debug="True" %>
<script runat="server">

    public class testcontrol
    inherits System.Web.UI.UserControl
        dim public str as string

        private Sub Page_Load(sender As Object, e As EventArgs)
          Response.Write( str )

          Page.str = "Bar"
        End Sub

    end class

</script>

Vad jag vill att ovanstående kod ska göra är att skriva ut "FooBar".

Men det funkar ju inte för att test.aspx vet inte att ctrl1 är av klassen testcontrol, och den vet ju inte hur klassen ser ut heller... Och testcontrol vet ju inte heller att sidan har en variablel som heter str....

Går det ens att göra det som jag vill åstadkomma???

Medlem sedan juni 2004533 inlägg
#4

Om du cast:ar referensen till din kontroll-klass?

CType(ctrl1, textcontrol).str = "Foo"

Medlem sedan sep. 20011 914 inlägg
Medlem sedan juli 2004206 inlägg
#6

Vad jag menade med mitt svar är att du kan kolla upp hela "sökvägen" till din klass... och det var väl det du ville?

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)