[C#.NET] ImageClickEventHandler

Pagina: 1
Acties:

  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
In de selectedindexchange van een DropDownList voeg ik dynamisch ImageButton webcontrols toe aan een severside tabel. De ImageClickEventHandler word echter niet aangeroepen als ik op zo'n imagebutton klik, hij doet alleen maar een postback.

Volgens mij ligt dit er aan dat ik te laat ben met het laden van de controls, waardoor ik mijn events mis, maar hoe kan ik dit oplossen?

Delen relevante code:

private void dropdown_SelectedIndexChanged(object sender, System.EventArgs e):
code:
1
2
3
4
5
6
7
8
while(rdrProdImages.Read())
  {
    ..
    tempImageControl.Click += new System.Web.UI.ImageClickEventHandler(tempImageControl_Click);
    ..
    DynImagesTable.Rows[iRowCounter].Cells.Add(objTempCellObj);
    ..
  {


Mijn private void tempImageControl_Click(object sender, System.Web.UI.ImageClickEventArgs e) word dus nooit aangeroepen ..

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

gorgi_19

Kruimeltjes zijn weer op :9

Inderdaad ben je te laat.

Bij de volgende postback is hij weer vergeten dat je uberhaupt een eventhandler of wat dan ook dynamisch had toegevoegd; bij iedere request zul je de eventhandler in je CreateChildcontrols of Init-handler moeten toevoegen.

Je zult dus eerder in de eventcyclus eea moeten afhandelen.

[ Voor 5% gewijzigd door gorgi_19 op 23-02-2004 13:11 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Hij lijkt na een postback (d.m.v. een klik op de imagebutton) alles te zijn vergeten, de imagebutton zelf is ook niet meer te zien, komt dit doordat ik die dynamisch aanmaak in de selectedindexchange event handler o.i.d...??

Hoe kan ik het dan zo maken dat na een selectedindexchange er een imagebutton word toegevoegd met een Click eventhandler? Na de postback bestaat de imagebutton op deze manier immers niet meer.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Je moet eens nagaan in welke volgorde de events gebeuren.

Als je het selected item veranderd in een dropdownlist, dan wordt die event-handler gecached.
Bij de eerstvolgende postback wordt ie dan uitgevoerd.
Echter, de page-load wordt eerst uitgevoerd, dan de selectedindexchanged, en dan je buttonclick event die de postback veroorzaakt heeft.

https://fgheysels.github.io/


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

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 23 februari 2004 @ 13:17:
Je moet eens nagaan in welke volgorde de events gebeuren.

Als je het selected item veranderd in een dropdownlist, dan wordt die event-handler gecached.
Bij de eerstvolgende postback wordt ie dan uitgevoerd.
Echter, de page-load wordt eerst uitgevoerd, dan de selectedindexchanged, en dan je buttonclick event die de postback veroorzaakt heeft.
Da's het probleem; je moet eerst zelf expliciet de handler toevoegen, daarna wordt hij aangeroepen. Hij cached niets; je zult zelf je controlcollection op orde moeten hebben.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Idd, je ImageButton is gewoon weg op dat moment.

Maar, hoe ga je het dan wel doen? Je maakt je controls dan aan in de CreateChildControls?

https://fgheysels.github.io/


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

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 23 februari 2004 @ 14:01:
Idd, je ImageButton is gewoon weg op dat moment.

Maar, hoe ga je het dan wel doen? Je maakt je controls dan aan in de CreateChildControls?
ben zelf meer van van Init-event handler, maar wel hetzelfde principe.. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Mjah, ik heb er zelf nog nooit mee gespeeld met die dynamische controls in ASP.NET, maar ik vraag me dan wel af hoe je het precies doet.

Voeg je die controls dan toe aan de control collection, en overloop je die collection dan in je CreateChild of Init method ?

https://fgheysels.github.io/


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

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 23 februari 2004 @ 14:13:
Mjah, ik heb er zelf nog nooit mee gespeeld met die dynamische controls in ASP.NET, maar ik vraag me dan wel af hoe je het precies doet.

Voeg je die controls dan toe aan de control collection, en overloop je die collection dan in je CreateChild of Init method ?
Wat bedoel je met overlopen? Je voegt je controls toch in principe toe aan de parent controlecollection? Je hoeft toch niets te overlopen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ik maak nu in de page_load een dynamische tabel, die ik bij de selectedindexchanged event van de dropdown in een placeholder plaats en de placeholder vervolgens op visible zet, is dit de correcte manier?

De click event word n.l. nog steeds niet aangeroepen.. Overigens moet ik er misschien we lbij vermelden dat zich dit allemaal afspeelt in een usercontrol die weer in een aspx pagina staat, kan dit er iets mee te maken hebben?

[ Voor 37% gewijzigd door UniCache2 op 23-02-2004 14:30 . Reden: extra info toegevoegd ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
gorgi_19:

In de CreateChildControls creeër je dan je controls, en voeg je ze toe aan de control-collection?

code:
1
2
3
4
5
6
protected override void CreateChildControls()
{
    base.CreateChildControls();

    this.Controls.Add( new TextBox());
}


:?

Heb je geen goeie link naar eeo tutorial ofzo? :P

https://fgheysels.github.io/


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

gorgi_19

Kruimeltjes zijn weer op :9

@whoami

Jups, dat is meer het principe. Alleen bij mij is het dan:
Visual Basic .NET:
1
2
3
4
5
6
7
Public Sub InitPage(sender as object, e as EventArgs) Handles MyBase.Init

    Dim txtText as Textbox = new Textbox
    txtText.ID = "CustomTextBox"
    Me.Controls.Add(txtText)

End sub


Ben zelf niet zo een fan van het overriden van parent controls, terwijl je ze nog nodig hebt; vind ik zelf veel te verwarrend.. :P Ook is het wel handig om een ID mee te geven, anders kan je hem nooit meer terugvinden.. :P

Een goeie link of tutorial? Hm... wordt lastig; dit is een onderwerp wat nogal vrij brak gedocumenteerd is, atm. 'k zal eens kijken of ik wat kan tikken... :P

[ Voor 54% gewijzigd door gorgi_19 op 23-02-2004 15:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Ik had het dus ff geprobeerd met die CreateChildControls, maar ik krijg altijd een error:

'Control of type must be contained within a form tag with a runat = server attribute' oid.

* whoami gaat na dit klein intermezzo ondertussen weer over naar Winforms. :+

https://fgheysels.github.io/


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

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 23 februari 2004 @ 15:29:
Ik had het dus ff geprobeerd met die CreateChildControls, maar ik krijg altijd een error:

'Control of type <typenaam> must be contained within a form tag with a runat = server attribute' oid.

* whoami gaat na dit klein intermezzo ondertussen weer over naar Winforms. :+
Erhm.. Dat klopt ja.. :p ff vergeten.. :P
De controls moeten altijd zitten tussen <form runat=server></form> tags. Ik heb meestal 1 .aspx pagina; in deze aspx pagina zet ik 1 placeholder neer. Vervolgens hang ik een control aan deze placeholder; meestal een usercontrol bestand.

En deze .ascx beschouw ik dan als een normale pagina waarmee ik met de controls aan de weer ga :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok ik heb nu de volgende code:

code:
1
2
3
4
public class RightSideImages2 : System.Web.UI.UserControl
  {     
    public System.Web.UI.WebControls.ImageButton SmallImageButton = new ImageButton();
    ..etc


en:

code:
1
2
3
4
5
private void InitializeComponent()
  {
    this.SmallImageButton.Click +=new System.Web.UI.ImageClickEventHandler(this.SmallImageButton_Click);
    this.Load += new System.EventHandler(this.Page_Load);
  }


en:

code:
1
2
3
4
5
private void InitPage(object sender, System.EventArgs e)
  {
    System.Web.UI.WebControls.ImageButton SmallImageButton = new ImageButton();
    this.Controls.Add(SmallImageButton);
  }


Maar nog steeds werkt de private void SmallImageButton_Click nog niet...??

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

gorgi_19

Kruimeltjes zijn weer op :9

Gokje: InitPage is niet gedefinieerd om het Init-Event af te handelen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Toegevoegd:

InitializeComponent():
code:
1
this.Init += new EventHandler(this.InitPage);


En:

code:
1
2
3
4
5
6
private void InitPage(object sender, System.EventArgs e)
        {
            System.Web.UI.WebControls.ImageButton SmallImageButton = new ImageButton();
            SmallImageButton.ID = "SmallImageButton";
            this.Controls.Add(SmallImageButton);
        }

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

gorgi_19

Kruimeltjes zijn weer op :9

En als je tussen regel 4 en 5 ook nog
SmallImageButton.Click +=new System.Web.UI.ImageClickEventHandler(this.SmallImageButton_Click);

zet heb je kans dat het gaat werken...

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok dat werkt prima idd, in mijn InitializeComponent(): hoeft ie dan niet meer te zitten.

Nu heb ik echter nog een klein vraagje. Deze imagebutton wil ik afhankelijk van een bepaalde waarde in de db een of meerdere keren tonen in mijn usercontrol, in een tabel, telkens met een ander plaatje, maar met daaraan dus dezelfde click action. Hoe pak je dit het beste aan?

Ik heb nu dynamisch een tabel gemaakt met bijvoorbeeld 3 rijen, 3 kolommen, dus 9 keer deze SmallImageButton met een andere Imagesrc maar met dezelfde click action (via de InitPage). Nu laat ie de imagebutton slechts een keer zien, dus rechtsonderin de tabel, de rest van de cellen zijn leeg. Het lijkt er op dat ie deze imagebutton dus maar 1 keer tegelijk op de pagina kan laten zien?

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

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
2
3
4
5
6
For I as Integer = 1 to 10
    Dim sb as ImageButton = New ImageButton
    sb.ID = "SmallImageButton" & I
    Addhandler sb.Click, AddressOf Me.HandleButtonClick
    Me.Controls.Add(sb)
Next

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Helaas kan ik geen methode vinden om dit op een gelijke wijze in C# te doen, met Addhandler AddressOff... Het lijkt er op dat ik dan weer met

code:
1
this.SmallImageButton.Click +=new System.Web.UI.ImageClickEventHandler(this.SmallImageButton_Click);


Moet gaan werken, en dit werkt niet in de page_load.... :? :'(

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

gorgi_19

Kruimeltjes zijn weer op :9

UniCache2 schreef op 30 maart 2004 @ 21:05:
Helaas kan ik geen methode vinden om dit op een gelijke wijze in C# te doen, met Addhandler AddressOff... Het lijkt er op dat ik dan weer met

code:
1
this.SmallImageButton.Click +=new System.Web.UI.ImageClickEventHandler(this.SmallImageButton_Click);


Moet gaan werken, en dit werkt niet in de page_load.... :? :'(
Het was ook de VB.Net syntax, aangezien ik niet zo thuis ben in C#. En je maakt een reference naar smallImageButton BUITEN de method. En daar heb je er dus maar eentje van, ook niet zo gek dat je er maar eentje ziet. OFtewel: Je zit gruwelijk te klooien met this

[ Voor 17% gewijzigd door gorgi_19 op 30-03-2004 21:11 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ja dat this heeft vs.net zelf toegevoegd, als ik het weghaal precies hetzelfde. Het gaat mee even over het feit dat ik in de pageload de tabel vul waarin ik meerdere smallimagebuttons wil met dezelfde click event. Ik heb nu eindelijk die click event kunnen toevoegen, maar nu kan ik niet meerdere van deze imagebuttons gebruiken.

Ik wil dus eigenlijk simpel gezegd in de pageload 1 of meerdere imagebuttons dynamisch aanmaken met een click event. Klinkt vrij simpel, maar zoals duidelijk is geworden in deze thread kan ik dit click event dus niet in de page load toevoegen, want dan is het te laat. Maar in mijn init weet ik nog niet hoeveel imagebuttons er gaan komen ;(

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

gorgi_19

Kruimeltjes zijn weer op :9

UniCache2 schreef op 30 maart 2004 @ 21:29:
Ja dat this heeft vs.net zelf toegevoegd, als ik het weghaal precies hetzelfde. Het gaat mee even over het feit dat ik in de pageload de tabel vul waarin ik meerdere smallimagebuttons wil met dezelfde click event. Ik heb nu eindelijk die click event kunnen toevoegen, maar nu kan ik niet meerdere van deze imagebuttons gebruiken.

Ik wil dus eigenlijk simpel gezegd in de pageload 1 of meerdere imagebuttons dynamisch aanmaken met een click event. Klinkt vrij simpel, maar zoals duidelijk is geworden in deze thread kan ik dit click event dus niet in de page load toevoegen, want dan is het te laat. Maar in mijn init weet ik nog niet hoeveel imagebuttons er gaan komen ;(
Waarom maak je dan geen eigen Template Column?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
wat voor voordel heb ik daaraan? Als ik dan in die template column een imagebutton toevoeg kan ik daar toch nog steeds niet zomaar een click event aanhangen, dit moet nog steeds in de page init gebeuren, en daar weet ik niet hoeveel imagebuttons ik ga krijgen..

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

gorgi_19

Kruimeltjes zijn weer op :9

UniCache2 schreef op 30 maart 2004 @ 21:40:
wat voor voordel heb ik daaraan? Als ik dan in die template column een imagebutton toevoeg kan ik daar toch nog steeds niet zomaar een click event aanhangen, dit moet nog steeds in de page init gebeuren, en daar weet ik niet hoeveel imagebuttons ik ga krijgen..
Een TemplateColumn kan, afhankelijk van wat je er in zet, een Click event doorsturen en via de datagrid een ItemCommand -event afvuren, welke je kan afvangen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Kan je hier een iets duidelijker voorbeeld van geven? Ik weet dat je imagebuttons eenvoudig in een datagrid templatecolumn kan zetten, maar hoe kan je hier dan een click event aanhangen zonder dat dit in de page init gedefinieerd word??

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 26-05 21:18

TeeDee

CQB 241

* TeeDee zat hier ook ernstig mee te kloten.

Voorbeeldje van hoe ik het gedaan heb:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
<asp:datalist id="dlimages" runat="server" 
ItemStyle-Width="90" ItemStyle-Height="90" ItemStyle-HorizontalAlign="Center" 
RepeatColumns="3" RepeatDirection="Horizontal">
<ItemTemplate>
<asp:ImageButton id="imagebutton" runat="server" 
ImageUrl='<%# string.Concat("thumb.aspx?typeofthumb=1&filename="
,DataBinder.Eval(Container.DataItem,"Name")) %> '
CssClass="p2image" OnCommand="show_preview" 
CommandName='<%# string.Concat(DataBinder.Eval(Container.DataItem,"Name")) %>'>
</asp:ImageButton>
</ItemTemplate>
</asp:datalist>


Codebehind:

C#:
1
2
3
4
5
6
protected void show_preview(object sender, CommandEventArgs e)
{
previewimg.Visible = true;
gaverder.Visible = true;
previewimg.ImageUrl = "thumb.aspx?typeofthumb=2&filename="+e.CommandName;
}

Let op het e.CommandName in de codebehind en op CommandName in de asp.Net kant. That should do the trick.

Ik heb in dit geval data en unique names uit een db. Maar je kan vast en zeker wel zoiets maken.

HTH

[ Voor 15% gewijzigd door TeeDee op 31-03-2004 06:52 ]

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1