Avatar billede bongo20 Nybegynder
28. september 2004 - 17:20 Der er 12 kommentarer og
1 løsning

problemer med ascx filer

Jeg forsøger at bruge en usercontrol i stedet for include filer.

Jeg får lavet min ascx fil og registrere den sådan øverst på siden:

<%@ Register TagPrefix="TopPage" TagName="Top" Src="Include/incTopPage.ascx" %>

jeg sætter den ind sådan:
<TopPage:Top runat="server" />

Mit problem er at jeg har haft min top til alle filerne på sitet i den tidligere include fil og vil have det i denne ascx fil.

Den forstår bare ikke at jeg starter på en tabel som jeg først slutter i en ascx fil som er sat ind i slutningen af en side.

Jeg får denne fejl:

Unexpected end of file looking for </asp:TableCell> tag.

Nogen der ved om  det overhovedet kan lade sig gøre på denne måde?
Avatar billede snepnet Nybegynder
28. september 2004 - 17:30 #1
Du kan f.eks. gøre det sådan her :

// toppen :
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="TopBar.ascx.cs" Inherits="EXP.UserControls.TopBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<table>
<tr>
<td>
TOP
<hr>


// bunden
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SubBar.ascx.cs" Inherits="EXP.UserControls.SubBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<hr>
SUB
<td>
</tr>
</table>

// og en baseform der sørger for at loade dem :
public class KABaseForm : Page
{
    protected override void OnInit(EventArgs e)
    {
        TopBar tb = (TopBar)LoadControl("~/UserControls/TopBar.ascx");
        this.Controls[1].Controls.AddAt(0,tb);
        base.OnInit (e);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        SubBar sb = (SubBar)LoadControl("~/UserControls/SubBar.ascx");
        this.Controls[1].Controls.Add(sb);
        base.Render (writer);
    }
}
Avatar billede snepnet Nybegynder
28. september 2004 - 17:33 #2
Så kan du bare sørge for at dine page-klasse arver fra din baseform, og der skulle ikke være noget problem i at åbne den i designeren.

(hvis du bare ønsker at sætte begyndelsen på en tabel ind... er det nok ikke det mest effektive med usercontrols... du kan lige sige til hvis du vil have et andet eksempel).

mvh
Avatar billede bongo20 Nybegynder
28. september 2004 - 17:37 #3
Det er kun for at få den samme top og bund på alle sider jeg bruger det her,.. det virkede lidt dumt at skulle ændre det på 15 forskellige sider hele tiden
Avatar billede snepnet Nybegynder
28. september 2004 - 17:48 #4
det kan du gøre med ovenstående, men jeg tror jeg ville droppe de der usercontrols, og bare lave en baseform der indsatte det... f.eks. sådan her :

// og en baseform der sørger for at loade dem :
public class HeaderFooterPage: Page
{
    protected override void OnInit(EventArgs e)
    {
        this.Controls[1].Controls.AddAt(0,new LiteralControl("<table><tr><td>"));
        base.OnInit (e);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        this.Controls[1].Controls.Add(new LiteralControl("</td></tr></table>"));
        base.Render (writer);
    }
}

Du kan godt lave en sikrere rutine til at finder den eksisterende serverform, men som standard ligger den på Controls[1] som jeg har skrevet.

Når du så laver en ny form - sørger du bare for at din pageclass arver fra den viste istedet for bare Page.

mvh
Avatar billede bongo20 Nybegynder
28. september 2004 - 17:50 #5
det der fattede jeg ikke en skid af

i hvilken type fil er det gemt og hvordan indsættes det?
Avatar billede bongo20 Nybegynder
28. september 2004 - 17:54 #6
narrr,. den allermest simple måde at indsætte en top og en bund på,.. hvad er det?
Avatar billede snepnet Nybegynder
28. september 2004 - 18:06 #7
jeg vil jo sådan set mene, at den enkleste måde er den jeg har skrevet til dig... men det kan der jo være delte meninger om :o)

bruger du visual studio ?
så vil du få oprettet en code-behind fil når du laver en ny webform... og i den fil vil der stå noget i denne stil :

public class SomePage: System.Web.UI.Page

den kan du så bare skifte ud med :

public class SomePage: HeaderFooterPage

Og så sørge for at du har denne klasse :

// og en baseform der sørger for at loade dem :
public class HeaderFooterPage: Page
{
    protected override void OnInit(EventArgs e)
    {
        this.Controls[1].Controls.AddAt(0,new LiteralControl("<table><tr><td>"));
        base.OnInit (e);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        this.Controls[1].Controls.Add(new LiteralControl("</td></tr></table>"));
        base.Render (writer);
    }
}

liggende i dit projekt.
Avatar billede bongo20 Nybegynder
28. september 2004 - 18:19 #8
jeg bruger webmatrix og alle mine filer har et script med runat="server" i stedet for codebehind.

derudover så er min top til siderne betydelig mere omfangsrig end starten på en tabel,. giver det problemer?

og vil din måde så ikke betyde at jeg skal have

protected override void Render(HtmlTextWriter writer)
{
      this.Controls[1].Controls.Add(new LiteralControl("</td></tr></table>"));
      base.Render (writer);
}

på alle sider ?
Avatar billede snepnet Nybegynder
28. september 2004 - 19:08 #9
du kan godt udnyttet code-behinds uden for visual studio, men jeg kan godt se at det gør det lidt vanskeligere, hvis miljøet modarbejder en....
jeg har ikke brugt webmatrix ret meget, så jeg ved ikke hvordan man lettest laver det i det på en måde så det ikke er for bikset at arbejde, men jeg kigger lige på det her lidt senere.

du skal nok få en melding.

mvh
Avatar billede snepnet Nybegynder
29. september 2004 - 00:43 #10
Jeg tror det nemmeste for dig vil være den med UserControls... Alternativt skal du kompilere en baseklasse for dine forms ind i en assembly - lægge den i dit bin-bibliotek, og sørge for at arve fra den.

Nedenstående eksempel virker fint hos mig... Det er stort set bare en tabel spredt over et par kontroller.

// usercontrol for topheader :
<%@ Control Language="C#" ClassName="TopControl" %>
<table border="1">
<tr>
    <td colspan="3"><hr></td>
</tr>
<tr>
    <td>*</td>
    <td>

// usercontrol fro subheader
<%@ Control Language="C#" ClassName="SubControl" %>
    </td>
    <td>*</td>
</tr>
<tr>
    <td colspan="3"><hr></td>
</tr>
</table>

// og en sider der bruger dem
<%@ Page Language="C#" ClassName="TestForm" Inherits="ExpTest.TestForm" Src="TestForm.cs" %>
<%@ Register TagPrefix="Top" TagName="Top" Src="TopControl.ascx" %>
<%@ Register TagPrefix="Sub" TagName="Sub" Src="SubControl.ascx" %>
<html>
<head>
</head>
<body>
    <form runat="server">
            <Top:Top id="Top1" runat="server"></Top:Top>
                <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
            <asp:Button id="Button1" runat="server" Text="Button"></asp:Button><Sub:Sub id="Sub1" runat="server"></Sub:Sub>
    </form>
</body>
</html>

hvis du er frisk på at bygge assemblies og den slags siger du bare til.

mvh
Avatar billede snepnet Nybegynder
29. september 2004 - 00:57 #11
(altså det med at bygge assemblies, er et alternativ til eksemplet)
du må sige til hvis der er noget.
mvh
Avatar billede snepnet Nybegynder
09. oktober 2004 - 15:35 #12
hej bongo.
jeg smider et svar hvis du kunne bruge det til noget - ellers sig til :o)
mvh
Avatar billede bongo20 Nybegynder
12. oktober 2004 - 11:07 #13
Jeg er sikker på jeg kan bruge det,.. har bare ikke lige haft tid,.men nu ved jeg hvor jeg kan finde det :o) tak
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