Toon posts:

[ASP.NET] Events in (Web)Controls

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel bezig met het schrijven van WebParts en (Web)Controls. Het aanmaken van child controls in webparts en bijbehorende events gaat prima.

Nu probeer ik een WebPartMenu te maken (Control) die bestaat uit een dropdownlist en een button.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        protected override void CreateChildControls()
        {
            // fetch the webpart manager
            GetCurrentWebPartManager();

            // instance our drop down list
            ddlModes = new DropDownList();

            // populate the list box
            PopulateListBox();

            // instance button
            submitButton = new Button();
            submitButton.Text = "Switch";
            submitButton.Click += new EventHandler(submitButton_Click);
    
        }


Maar de event van de submit knop word nooit gefired. Dezelfde code binnen de WebPart class werkt prima.

Ook als ik de autopostback property op true zet van de dropdown werkt het niet. Wat opvalt is dat binnen de render methode:

C#:
1
2
3
4
5
6
7
8
9
10
11
        protected override void Render(HtmlTextWriter writer)
        {
            // make sure child controls are created
            EnsureChildControls();

            // render the drop down list
            ddlModes.RenderControl(writer);

            // render button
            submitButton.RenderControl(writer);
        }



Doe ik wellicht iets fout? Ik had wel wat tutorials waar met writer.Write() wordt gewerkt om pure html uit te schrijven samen met UniqueIDs en dan de IPostBackHandler te implementeren maar ik vind dit persoonlijk een mooiere oplossing. Ook wil ik niet met ASCX bestanden werken.

Zover ik er nu achter ben worden er geen server controls aangemaakt? De controls worden gewoon gerenderd als <input> en als <select>, maar niet met id, of name attributes.

bvd.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:26

gorgi_19

Kruimeltjes zijn weer op :9

Gebruik eens het Init event ipv CreateChildcontrols te overriden. En Wat doet PopulateListbox daar? Die hoort toch in het Load-event?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
dit maakt aan het probleem niks uit:

C#:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    public class WebPartMenu : WebControl
    {
        private DropDownList ddlModes;
        private Button submitButton;
        private WebPartManager webPartManager;

        protected override void OnInit(EventArgs e)
        {
            // instance our drop down list
            ddlModes = new DropDownList();

            // instance button
            submitButton = new Button();
            submitButton.Text = "Switch";
            submitButton.Click += new EventHandler(submitButton_Click);
        }

        protected override void OnLoad(EventArgs e)
        {
            // fetch the webpart manager
            GetCurrentWebPartManager();


            // populate the list box
            PopulateListBox();

        }

        
        protected override void Render(HtmlTextWriter writer)
        {
            // make sure child controls are created
            EnsureChildControls();

            // render the drop down list
            ddlModes.RenderControl(writer);

            // render button
            submitButton.RenderControl(writer);
        }


        protected override void CreateChildControls()
        {

    
        }

        void submitButton_Click(object sender, EventArgs e)
        {
            throw new Exception("The method or operation is not implemented.");
        }




        private void PopulateListBox()
        {
            foreach (WebPartDisplayMode Mode in webPartManager.SupportedDisplayModes)
            {
                if (Mode.IsEnabled(webPartManager))
                {
                    ddlModes.Items.Add(new ListItem(Mode.Name, Mode.Name));
                }
            }
        }



        private void GetCurrentWebPartManager()
        {
            // get the current web part manager
            webPartManager = WebPartManager.GetCurrentWebPartManager(this.Page);
        }



}


Het probleem is dat de controls geen unique ID krijgen toegekent. Dezelfde code maar dan als WebPart i.p.v. WebControl werkt prima.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik kan het hier even niet ( makkelijk ) nakijken maar volgens mij moet je daarvoor de interface INamingContainer implementeren ( geen members volges mij ).

“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.”


Verwijderd

Topicstarter
Dit zorgt ervoor dat iedere control een unique ID krijgt, maar het probleem zit er in nu dat de twee controls als plain html wordne gerenderd, zoals je bijv. de HtmlControls.

Ik vind het gewoon raar dat het als webpart wel prima werkt, maar als WebControl niet. Is er een andere manier om events te implementeren? Ik probeer een simpele user control te maken (geen ascx) met twee controls daarin.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 01:04
Verwijderd schreef op woensdag 03 augustus 2005 @ 18:48:
dit maakt aan het probleem niks uit:

C#:
1
knip


Het probleem is dat de controls geen unique ID krijgen toegekent. Dezelfde code maar dan als WebPart i.p.v. WebControl werkt prima.
Maarre, zou je dan niet die unieke ID gaan toekennen?

C#:
1
submitButton.ID = "een_uniek_id";


:?.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 01:04
Verwijderd schreef op woensdag 03 augustus 2005 @ 20:56:
Is er een andere manier om events te implementeren? Ik probeer een simpele user control te maken (geen ascx) met twee controls daarin.
Ja, in de html-output van je bestand (dus het .aspx bestand) kan je bij <asp:button.... gewoon onXXX="functienaam()" doen.

Verwijderd

Topicstarter
zoals je ziet is dit geen aspx pagina, maar een webcontrol, ik heb maak een instance van een button en render deze. Zover ik weet moet .net zelf id's toe kennen.

Bij een webpart gaat dit prima, maar een webcontrol geeft wat problemen, wellicht zal ik gewoon met writer.write() moeten gaan werken.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 01:04
Verwijderd schreef op woensdag 03 augustus 2005 @ 21:25:
Zover ik weet moet .net zelf id's toe kennen.
Dat doet het ook, maar het kan geen kwaad deze handmatig op te geven. Het wordt alleen maar beter voor je code. Trouwens, als je controls aan wilt gaan spreken op latere momenten (buiten events) en je moet findcontrol gebruiken, dan moet je wel weten wat het ID is.

Verwijderd

Topicstarter
momenteel worden er helemaal geen ids toegekent. Als ik zelf een id toeken weet .net nog niet waar de controls zich bevinden als de postback gedaan wordt en kunnen de events niet juist gebubbeld worden.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 03 augustus 2005 @ 20:56:
Dit zorgt ervoor dat iedere control een unique ID krijgt, maar het probleem zit er in nu dat de twee controls als plain html wordne gerenderd, zoals je bijv. de HtmlControls.

Ik vind het gewoon raar dat het als webpart wel prima werkt, maar als WebControl niet. Is er een andere manier om events te implementeren? Ik probeer een simpele user control te maken (geen ascx) met twee controls daarin.
Ok ik dacht juist dat het probleem was dat de Unique ID's niet goed waren.

Je hebt het over WebParts. Dit is zeker iets uit ASP.NET 2.0? Daar weet ik dan helaas nog niet zoveel over te vertellen.

“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.”


Verwijderd

Topicstarter
het geldt voor allebei. Bij een WebPart gaat het wel goed, maar bij een WebControl niet.
Pagina: 1