[C#] usercontrols dynamisch inladen vanuit één method

Pagina: 1
Acties:

  • siroki
  • Registratie: Oktober 2006
  • Laatst online: 18-10-2025
Hallo,

Laat ik even uitleggen wat ik aan het proberen ben. Ik heb een default.aspx waarin ik template van m'n website heb gebouwd. In deze template staat een aantal contentplaceholders. Voor elke contentplaceholder wil ik één generieke methode aanroepen en middels 1 parameter (containernaam) wil ik bepalen welke usercontrol geladen moet worden.

Tot zover heb ik de volgende code:

default.aspx
code:
1
2
3
4
5
6
.... begin van een hoop standaard html code.....
                <td width="200" valign="top">
                    <asp:PlaceHolder ID="plcLeft" runat="server">
                    </asp:PlaceHolder>
                </td>
... en zo gaat het nog even verder....


default.aspx.cs
code:
1
2
3
4
5
6
7
8
9
10
..veel usings.....
using BusinessLogic;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Global.loadModule("left");
    }
}


global.cs
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace BusinessLogic
{
    public class Global {

        private DbConnection _dbconnection = null;

        public Global()
        {
            _dbconnection = new DbConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);

        }

        public static void loadModule(string _container) {
            Global global = new Global();
            DataTable rs = global.conn.GetDataTable("spCoreModuleLoad @project_id = '"+_project_id+"', @container = '"+_container+"'");

            Control control_page = null;
            int i = 1;            

            foreach (DataRow row in rs.Rows)
            {
                string _locatie = row["locatie"].ToString();
                control_page = LoadControl("~/controls/"+_locatie+".ascx");
                control_page.ID = i.ToString();
                Controls.Add(control_page);
                i++;
            }
        }

        public DbConnection conn { get { return _dbconnection; } }
    }
}


Hij geeft de volgende twee errors in global.cs:
Error 1 The name 'LoadControl' does not exist in the current context
Error 2 The name 'Controls' does not exist in the current context

Iemand die mij een stukje op weg wil helpen. Ben net een weekje bezig met C#.. Het gaat redelijk maar sommige dingen snap ik nog even niet.

Bedankt alvast..

Glen

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

LoadControl en Controls bevinden zich op de Page class (je ASPX pagina) dus je zult daar een referentie naartoe moeten hebben.
Zoiets bijvoorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Global {
    private Control container;

    public Global(Control container)
    {
        this.container = container;
    }

    public void LoadControl(string container)
    {
        // jouw code om de naam etc op te halen
        control_page = this.container.LoadControl("~/controls/"+_locatie+".ascx");
        this.container.Controls.Add(control_page);
    }
}


Maar ik denk eigenlijk dat je niet op de Page klasse moet werken (jouw controls worden dan aan de pagina gehangen ipv in de placeholder) maar met een placeholder zelf. Dus ipv Page mee te geven, doe je dat met de referentie naar je container (plcLeft)

[ Voor 75% gewijzigd door MTWZZ op 16-10-2006 12:22 ]

Nu met Land Rover Series 3 en Defender 90


  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 24-12-2025

CyBoB

.::BURB::.

Beide fouten zijn natuurlijk volkomen logisch. Jouw Global class heeft geen Controls property en/of een LoadControl method. Ik ben verder niet thuis in ASP(.NET) maar het lijkt me deze property en method uit de System.Web.UI.Page class komen. Hoewel ik op dit moment de opzet wat vreemd aan vind voelen kan ik je wel een snelle fix voorstellen door gewoon de instance van de System,Web.UI.Page (je _Default class dus) mee te geven aan de loadModule() class. Dus

C#:
1
Global.loadModule("left", this);


en dan in je Global class iets van

C#:
1
2
3
4
5
6
7
8
9
public static void loadModule(string _container, System.Web.UI.Page page)
{
   //knip...
control_page = page.LoadControl("~/controls/"+_locatie+".ascx");

  //knip...
page.Controls.Add(control_page);
  //knip...
}

[ Voor 0% gewijzigd door CyBoB op 16-10-2006 12:25 . Reden: damn, iets sneller leren typen :) ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:42

gorgi_19

Kruimeltjes zijn weer op :9

Verder ben je vrij laat als je tijdens je Load-event pas je control collection op orde wilt gaan brengen (lees: grote kans dat je je viewstate compleet om zeep helpt, je makkelijk vergeet je postback-controle vergeet af te vangen waardoor je click, sort, etc. events niet werken en je zelf verantwoordelijk bent op je controlcollection iedere request op orde te brengen.)

Je method zou trouwens sowieso niet werken; je voegt steeds dezelfde control toe (aangezien je steeds hetzelfde object gebruikt; weliswaar met verschillende waarden, maar het blijft hetzelfde object)

Buiten dit alles: Dynamische controls zijn een crime om mee te werken (zeker als je pas een week met C# bezig bent), waarom wil je het zo hebben en gebruik je geen Masterpages?

[ Voor 34% gewijzigd door gorgi_19 op 16-10-2006 13:41 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • siroki
  • Registratie: Oktober 2006
  • Laatst online: 18-10-2025
Ik hanteer deze method omdat ik 1 systeem wil bouwen waarin ik op basis van parameters de containers / placeholders dynamisch kan invullen.

Hebben jullie anders een URL ofzo waarin dit uitgelegd wordt, en wat hier een best-practise voor zou zijn?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:42

gorgi_19

Kruimeltjes zijn weer op :9

IBuySpy werkt volgens die methodiek, als ik het me goed herinner.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • siroki
  • Registratie: Oktober 2006
  • Laatst online: 18-10-2025
DotNetNuke is dat toch? Thanks.. zal die code eens doorploeteren .. Misschien dat het dan een beetje duidelijk wordt.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 22-12-2025

PhysicsRules

Dux: Linux voor Eenden

DotNetNuke is hier inderdaad handig voor. Die code is behoorlijk uitgebreid, dus succes met doorploeteren. Als je denkt dat DNN nuttig is, kun je je beter eerst eens verdiepen in het bouwen van modules voor DNN.

Verder zou je je ook eens kunnen verdiepen in de combinatie van Masterpages en Webparts, twee nieuwe zaken in ASP.Net 2.0 die handig zijn voor het dynamisch laden van Usercontrols.

[ Voor 41% gewijzigd door PhysicsRules op 16-10-2006 16:01 ]

Pagina: 1