Toon posts:

[.NET] Eigen server site event maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Probleem

Ik maak een ASP .NET project. Hier heb ik bijvoorbeeld een eigen usercontrol gemaakt die met een propertie een x aantal knoppen genereerd.

Nu wil ik dat ik als ik op zo'n dynamisch aangemaakte knop klik, het event van de usercontrol af gaat met als event argument de knop ID. Dit lukt dus niet.

Wat heb ik al geprobeerd

Gezocht op internet, gevraagd aan iedereen, en deze code bedacht ( die niet werkt ):

Belangrijk deel van het usercontrol:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public delegate void KnopKlikHandler(string knopID);
        public event KnopKlikHandler KnopGelikt;

        protected override void Render(HtmlTextWriter output)
        {
            for( int knopTeller = 0; knopTeller<Aantal;knopTeller++)
            {
                output.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Input);
                output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Type, "button" );
                output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Id, ClientID + "Knop" + knopTeller.ToString());
                output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Name, ClientID + "Knop" + knopTeller.ToString());
                output.AddAttribute("onclick", "__doPostBack('" + ClientID + "', 'KnopGelikt')");
                output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Value, "Knop " + knopTeller.ToString() );
                output.RenderEndTag();

            }
        }


Dit maakt dus x knoppen aan, die als er op wordt geklikt volgens mij toch de control event KnopGeklikt uit moet voeren.

Ik heb op de ASPX een HTML button met event gemaakt + het control om er voor te zorgen dat ook de __doPostBack wordt aangemaakt.

Als ik nu op een knop klik krijg ik wel een postback, maar hij komt nooit in het KnopGeklikt event.

Ik heb ook nog:
code:
1
                output.AddAttribute("onclick", "__doPostBack('" + ClientID + "_KnopGeklikt', 'KnopID'" + knopTeller.ToString() + ")");


En wat andere dingen geprobeerd, maar het event gaat niet af. Als ik op internet zoek lijkt het wel alsof ik de enige ben die dit probeert te bereiken.

Hoop dat iemand wat weet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
De functie die je aan de eventhandler 'OnClick' hangt, moet voldoen aan de EventHandler delegate vermoed ik.
Dit wil zeggen, een method met een void return-type en 2 parameters: object en EventArgs.

Je code zal er volgens mij eerder zo moeten uitzien:

code:
1
2
3
4
5
Button b1 = new Button();
b1.Name = ...
b1.Text = ...
b1.OnClick += new EventHandler(myEventHandlerMethod);
blaat.Controls.Add(b1);

oid.
(Dit is dus een beetje pseudo-code. :P)

In je eventhandler kan je dan aan het ID van je knop komen, door gebruik te maken van de sender parameter:
code:
1
2
3
4
if( sender is Button )
{
   ((Button)sender).Name;
}

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Je kan toch Itemcommand event afvangen en, naar gelang de commandname, de een eigen event oproepen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
ItemCommand is toch enkel gedefinieerd in DataLists, DataGrids, etc... of heb ik het nu mis?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 15 September 2003 @ 16:31:
ItemCommand is toch enkel gedefinieerd in DataLists, DataGrids, etc... of heb ik het nu mis?
Nee, je hebt gelijk. Ik loop onzin uit te kramen... Ik loop dingen door elkaar te halen...

Dat met die commandname zou echter wel kunnen werken.. :P En anders commandargument. ff VS opstarten..

[ Voor 23% gewijzigd door gorgi_19 op 15-09-2003 16:32 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
whoami schreef op 15 september 2003 @ 16:04:
De functie die je aan de eventhandler...}[/code]
??? Dat zou wel heel cool 8) zijn. Ik heb het meteen getest maar heb nu weer een probleem... Ik maak de button nu inderdaad aan als een [i]System.Web.UI.WebControls.Button[i] object. Daar kan je ook de Click toekennen aan het event wat dan (hopelijk) gaat werken. Ik ben dan ook erg benieuwd wat het client-side javascript zal zijn wat hij dan gaat opmaken.

Dit is wat ik heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public delegate void myKnopHandler(object sender, EventArgs arguments);
public event myKnopHandler myKnopEvent;


  protected override void Render(HtmlTextWriter output)
  {

    System.Web.UI.WebControls.Button testKnop = new
    System.Web.UI.WebControls.Button();
    
    testKnop.Text = "Test knop";
    if ( this.myKnopEvent != null)
    {
      testKnop.Click += new EventHandler(this.myKnopEvent);
    }
          
    output.Write(testKnop);

  }


Maar het probleem is nu dat ik met een HtmlTextWriter zit (output) waarvan ik dacht het object gewoon te kunnen writen (hij heeft een overload voor Object). Dat werkt helaas niet. Ik heb verder ook geen andere manier gevonden om met de HtmlTextWriter een System.Web.Ui.WebControl weg te kunnen schrijven. Hopelijk kan je me hier ook weer mee helpen.

[ Voor 8% gewijzigd door Verwijderd op 15-09-2003 19:10 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet webcontrols ook niet zelf writen. Dat gebeurt automatisch in de Render methode( Als je die niet override natuurlijk :) ). Je moet dan ook gewoon bijvoorbeeld in je onLoad event
C#:
1
this.Controls.Add( myTestKnop );


doen ofzo. Dan wordt er tijdens het renderen automatisch naar de page geschreven.

Dit klopt trouwens ook niet
C#:
1
testKnop.Click += new EventHandler(this.myKnopEvent);


je moet hiervoor zelf een methode maken die het button event afhandeld zoals bijvoorbeeld
C#:
1
2
3
4
5
6
7
protected void Button_OnClick( object sender, EventArgs e )
{
    //Doe hier je ding
}

//en dan ergens anders
testKnop.Click += new EventeHandler( Button_OnClick );

en dan kan je in je event handler natuurlijk je eigen custom event vuren als je wilt.

[ Voor 43% gewijzigd door Woy op 15-09-2003 19:23 ]

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
rwb schreef op 15 September 2003 @ 19:18:

Dit klopt trouwens ook niet
C#:
1
testKnop.Click += new EventHandler(this.myKnopEvent);


je moet hiervoor zelf een methode maken die het button event afhandeld zoals bijvoorbeeld
C#:
1
2
3
4
5
6
7
protected void Button_OnClick( object sender, EventArgs e )
{
    //Doe hier je ding
}

//en dan ergens anders
testKnop.Click += new EventeHandler( Button_OnClick );

en dan kan je in je event handler natuurlijk je eigen custom event vuren als je wilt.
Als zijn method 'myKnopEvent' de signature heeft die voldoet aan de EventHandler delegate, dan gaat dat gewoon goed werken:
code:
1
2
3
4
protected void myKnopEvent(object sender, EventArgs e)
{
   // stuff
}


code:
1
aButton.Click += new EventHandler(myKnopEvent);

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 15 September 2003 @ 21:00:
[...]


Als zijn method 'myKnopEvent' de signature heeft die voldoet aan de EventHandler delegate, dan gaat dat gewoon goed werken:
code:
1
2
3
4
protected void myKnopEvent(object sender, EventArgs e)
{
   // stuff
}


code:
1
aButton.Click += new EventHandler(myKnopEvent);
ja dat dacht ik eerst ook maar myKnopEvent is bij hem geen methode maar een event. Hij heeft dit in zijn code staan
C#:
1
public event myKnopHandler myKnopEvent;


hij probeert dus een EventHandel te maken die naar zijn eigen event wijst. Dit kan je volgens mij alleen oplossen door een event handler te maken die daarna je eigen event vuurt.

“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
[quote]rwb schreef op 16 september 2003 @ 00:30:
[...]
...quote]

??? Maar ik wil graag dat het usercontrol een eigen event krijgt waarbij de gebruiker van het control de acties mag gaan bepalen. Ik wil niet zelf een procedure schrijven in het control die op de knop- clicks reageert. Als er op een door het usercontrol gegenereerde knop wordt geklikt was het dan ook m'n bedoeling dat het usercontrol een event afvuurt met als event argument bijvoorbeeld de knop-id.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
[quote]Verwijderd schreef op 16 September 2003 @ 10:57:
rwb schreef op 16 september 2003 @ 00:30:
[...]
...quote]

??? Maar ik wil graag dat het usercontrol een eigen event krijgt waarbij de gebruiker van het control de acties mag gaan bepalen. Ik wil niet zelf een procedure schrijven in het control die op de knop- clicks reageert. Als er op een door het usercontrol gegenereerde knop wordt geklikt was het dan ook m'n bedoeling dat het usercontrol een event afvuurt met als event argument bijvoorbeeld de knop-id.
Ja dat had ik ondertussen ook begrepen. Maar in je eigen event handler van je button kan je natuurlijk je eigen event afvuren. Zo kan je bijvoorbeeld een eigen OnChange event maken ofzo in je eigen handler kan je dan eerst controleren of er nog een waarde is veranderd en zo ja kan je je OnChange event vuren.

als je echt alleen de events door wil geven kan je ook nog zo doen
C#:
1
2
3
4
5
6
7
8
9
public event EventHandler KnopGeklikt
{
    add{
        myButton.Click += value;
    }
    remove{
        myButton.Click -= value;
    }
}

edit:
KnopGelikt = KnopGeklikt :)

[ Voor 15% gewijzigd door Woy op 16-09-2003 11:40 ]

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

Ik wordt indertussen half ziek van het proberen. Het lukt gewoon niet. Ik begin echt te twijfelen of dit zo gaat werken en of ik niet toch met javascript __DoPostback moet gaan prutsen.

Dit heb ik nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected override void Render(HtmlTextWriter output)
{
  System.Web.UI.WebControls.Button actieKnop = 
    new System.Web.UI.WebControls.Button();

  actieKnop.Text = "Lukt niet";
  actieKnop.ID = ClientID + "Bagger";
  actieKnop.Click += new EventHandler(SuperKlik);
  actieKnop.RenderControl(output);
}

private void SuperKlik(object sender, EventArgs e)
{
  System.Web.HttpContext.Current.Response.Write("Hier komt ie dus nooit...");
}


Dus ik maak in de render van m'n custom control een knop en write die als output. Er staat ook echt een schitterende knop op m'n pagina die wordt gerenderd als een input type="submit". Ik kan er op klikken wat ik wil. Er komt wel een postback, maar de event-code gaat nooit af.

Iemand nog enig idee? Of moet ik wachten tot .NET 2004?

[ Voor 12% gewijzigd door Verwijderd op 26-09-2003 19:22 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Da's logisch dat die het niet gaat doen.

Sowieso ben je al veel te laat als je controls gaat toevoegen op het moment van renderen. Bij het afhandelen van een event bestaat de control immers nog niet; die wordt pas later aangemaakt.

En wat niet bestaat, wordt niet afgehandeld. Je moet dan ook de controls maken en aan de controlcollection van een parent toevoegen, voordat je uberhaupt maar een event wil laten plaatsvinden.

Verder snap ik nog steeds niet wat je wilt, je hebt het over Javascript, maar deze zie ik niet terugkomen in je laatste post? :?

[ Voor 36% gewijzigd door gorgi_19 op 26-09-2003 19:30 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sds
  • Registratie: Juni 2002
  • Laatst online: 07-03 21:27

sds

Als je met die __DoPostback wilt rotzooien moet je GetPostBackEventHandler gebruiken (zie help)

output.AddAttribute("onclick", Page.GetPostBackEventHandler(this, "jouwknop"));

en dan de RaisePostBackEvent overriden, daar krijg je "jouwknop" dan als 2de argument mee. (en van daaruit dus een eigen event naar de subscribers sturen)

Zoiets was het, even uit m'n hoofd.

maar echt mooi .NET is dat nou ook weer niet.

[ Voor 14% gewijzigd door sds op 26-09-2003 19:51 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

sds schreef op 26 september 2003 @ 19:41:
maar echt mooi .NET is dat nou ook weer niet.
Sterker nog, ik vind het enorm ranzig.. :P

't is gewoon een kwestie van dynamische controls; toevoegen vindt .Net geen enkel probleem. :)
Verwijderen heeft het wat meer problemen mee. :( Maar daar is in dit geval geen sprake van.

[ Voor 15% gewijzigd door gorgi_19 op 26-09-2003 20:15 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 26 September 2003 @ 19:26:
Da's logisch dat die het niet gaat doen.

Sowieso ben je al veel te laat als je controls gaat toevoegen op het moment van renderen...
code:
1
2
3
4
5
6
7
8
9
  // Override CreateChildControls to create the control tree.
  [System.Security.Permissions.PermissionSet
  (System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
  protected override void CreateChildControls() 
  { 
    ... 
    this.Controls.add(mijnknop);
    ...
  }


Okee, klinkt logisch... op het renderen ben ik dus veel te laat. Even gezocht en nu de CreateChildControls gevonden. Alle code daar neergezet. Render override weggegooid. Weer een prachtige knop maar geen event die afgaat. Volgens mij zou ik nu toch wel op tijd moeten zijn.

Ik ging niet verder in op het javascript omdat ik dat inderdaad ook een beetje ranzig vind. Ik zou dit veel mooier vinden, maar dan moet het wel werken.

Ik heb het dus nog steeds niet voor elkaar kunnen krijgen. Wel weer bedankt voor de reacties.

[ Voor 34% gewijzigd door Verwijderd op 28-09-2003 18:17 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 13:54

mulder

ik spuug op het trottoir

heb je dan die eventhandler wel aan die knop gehangen?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
JOEPIE
Je moet System.Web.UI.INamingContainer implementeren en er voor zorgen dat alle controls een unieke ID hebben. Dan doet ie het echt!

Heel erg bedankt allemaal _/-\o_ _/-\o_ _/-\o_

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 28 September 2003 @ 18:23:
JOEPIE
Je moet System.Web.UI.INamingContainer implementeren en er voor zorgen dat alle controls een unieke ID hebben. Dan doet ie het echt!

Heel erg bedankt allemaal _/-\o_ _/-\o_ _/-\o_
Inamingcontainer implementeren? Usercontrol inheriten is toch veel makkelijker?

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1