Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP.NET/C#] Dynamische usercontrols en events

Pagina: 1
Acties:
  • 1.040 views sinds 30-01-2008
  • Reageer

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hallo,

wij zijn aan het proberen een asp.net website te maken die dynamisch usercontrols ophalen. Dat lukt prima. We willen graag de controls laden via een ascx file. Het is de bedoeling dat we dynamisch de properties gaan manipuleren.

We komen er echter niet uit hoe we nu (en wanneer) we events kunnen hangen aan de betreffende user control.

code:

login.ascx file
code:
1
2
3
4
5
6
<%@Control%>
<form runat="server">
<asp:TextBox id="TextBox1" runat="server" class="loginbox"></asp:TextBox>
<asp:TextBox id="TextBox2" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
</form>


test.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
33
34
35
36
37
38
39
40
41
namespace ow3
{
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    public class Login : baseClass
    {
        protected System.Web.UI.WebControls.TextBox TextBox1;
        protected System.Web.UI.WebControls.TextBox TextBox2;
        protected System.Web.UI.WebControls.Button Button1;



        public Login(int pagelibraryitemid) : base(pagelibraryitemid)
        {
            content = null;
        }
        
        public override void Generate(HtmlTextWriter output)
        {
            
            Control test = LoadControl("login.ascx");
            output.Write(content);
            test.RenderControl(output);

        }

        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here
        }
        
        private string content;

    }
}


Het dynamisch laden gaat prima en alle usercontrols zijn afgeleid van een baseclass die standaard een divje renderd met een aantal properties. Dit werkt allemaal super alleen willen we nu bijv. een button_click event gaan gebruiken om de data via een postback in te lezen en daar het een en ander mee te doen.

We komen er alleen echt niet uit hoe en wanneer we events aan de ascx kunnen hangen. Ik ben echt al heel de dag aan het proberen en uitzoeken, ik hoop dat jullie me een beetje opweg kunnen helpen, het is namelijk erg verwarrend.

thx alvast

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je doet op dit moment in je code
C#:
1
test.RenderControl(output);

Op deze manier zijn je controls helemaal niet in je Control Collection opgenomen.
Waarom voeg je je controls niet op de volgende manier toe?
C#:
1
Controls.Add( myCustomControl );

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Dat doe ik in de index pagina.

Daar word een switch statement uitgevoerd die selecteerd welke control geladen moet worden. de control word dan ook gewoon geladen en weer gegeven.

Ik wil alleen events toevoegen en afhandelen maar weet niet hoe. Heb ook al verschillende methoden geprobeerd wat over het algemeen resulteerd in een error.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Oke de events toevoegen is gelukt door de contols dynamisch te laden in het OnInit event.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void Click(object sender, EventArgs e)
        {
            
        }
protected override void OnInit(EventArgs e)
        {
            //laad usercontrol template
            Control test = LoadControl("login.ascx");
            //maak form aan
            form1 = new HtmlForm();
            //geef form naam
            //form1.ID = "loginform";
            Page.Controls.Add(form1);
            // voeg toe aan form
            form1.Controls.Add(test);

            Button button = (Button)test.FindControl("submit");
            //Controls.Add(button);
            button.Click += new System.EventHandler(this.Click);

        
        }


Omdat wij met een index.aspx werken word dus de data die door de control gepost word terug naar de index.aspx gestuurd en moet weer heel het proces van dynamisch opbouwen weer doorlopen, en dus ook het opbouwen van de control word weer doorlopen.

Mijn vraag:

is dit de juiste manier om dit aan te pakken? (wij hebben gekeken naar de community starterkit en die doet het ook zo)

Of is er een manier om de control de data meteen te laten verwerken? zonder eerst weer langs de index.aspx te lopen etc?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Verwijderd

Dit probleem heb ik dus ook. Ik weet ook hoe het in mekaar zit, en dat je tegen vervelende dingen aan kan lopen. Het heeft te maken met de page lifecycle.

Eerst worden ALLE (die van je aspx pagina, PLUS die van je controls) OnInits uitgevoerd, daarna ALLE onloads, daarna worden de events afgehandeld, en daarna de onPrerender en Render (d'r zitten nog een paar stappen tussen maar dit zijn de belangrijkste)
Dat betekend dus dat alle events die je ergens aan vastknoopt NA onload genegeerd worden.

Het probleem wat ik niet kan oplossen is dus als je events wil hangen aan dynamisch gegenereerde controls. Die controls die worden gegenereerd naar aanleiding van het drukken op een knop. Als je dan in je event-handler een dynamische lijst met knoppen wil maken, zit je in de problemen. Weet iemand hier al wat op?

Ik heb een test gemaakt die dit aantoont. Het is een formulier met een knop en een textbox. Als je op de knop drukt, genereert hij een lijstje nummertjes. Als je op het nummertje klikt zou de textbox gevuld moeten worden met het nummertje... Maar nee! Je moet de events dus voordat "onload" is afgelopen eraan vast geknoopt hebben, maar dit kan niet altijd...

Wat voorbeeldcode voor de liefhebber:
//----------------------De .cs file:-------------------------------------
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
for (int i=0; i<10; i++)
{
LinkButton link = new LinkButton();
link.Text = i.ToString();
link.Click += new System.EventHandler(this.link_Click);
PlaceHolder1.Controls.Add(link);
}
}

public void link_Click(object sender, System.EventArgs e)
{
LinkButton link = (LinkButton)sender;
TextBox1.Text = link.Text;
}
}

//---------------De aspx file------------------------------------------------------------
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="tst.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<body>
<form id="Form1" method="post" runat="server">
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
<asp:PlaceHolder id="PlaceHolder1" runat="server"></asp:PlaceHolder>
</form>
</body>
</HTML>

Verwijderd

Ik heb inderdaad hetzelfde probleem wat is hier de oplossing voor? Iemand.. :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:00

gorgi_19

Kruimeltjes zijn weer op :9

Zorgen dat de events gekoppeld zijn voordat een click handler aangeroepen wordt. Makkelijkste is om met een repeater te werken in bovenstaand geval.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1