[asp.net c#] Dynamisch event wordt niet getriggered

Pagina: 1
Acties:

  • VAnTurenhout
  • Registratie: September 2004
  • Laatst online: 09-02-2024
Ik ga eens een poging doen mijn probleem voor te leggen:

Ik heb een web-app, die een zoekfunctionaliteit in zich heeft. Deze zoek-functionaliteit heb ik in een UserControl gebouwd, en deze wordt 4 keer onder elkaar geladen op de pagina.
Afbeeldingslocatie: http://www.horlepiepske.nl/img/menu_dicht.png

De gebruiker selecteert een knop, deze opent zich, en daar wordt de zoekfunctionaliteit getoond.
Afbeeldingslocatie: http://www.horlepiepske.nl/img/menu_open.png

Als de gebruiker gezocht heeft, en er wordt wat gevonden, dan worden de resultaten getoond in een geneste repeater. Deze wordt dan in de usercontrol getoond.
Afbeeldingslocatie: http://www.horlepiepske.nl/img/menu_resultaten.png

Zoals je ziet heb ik een paging-functionaliteit gebouwd. In eerste instantie gebruikte ik de PagedDataSource class, maar deze eist dat ik ineens de hele set met resultaten overhaal, en dat kunnen er misschien wel 1000 of zo zijn, en dat met een nog onbekend (lees:veel) aantal gebruikers is niet wenselijk.
De back-end is nu zo geschreven dat ik per keer dat ik een zoek-actie doe, ik het aantal resultaten dat ik wil zien kan opgeven, en de pagina uit het aantal zoekresultaten (dus pagin 10 van de zoekresultaten, als mijn pagin 5 resultaten groot is)
Die back-end functionaliteit werkt ook prima.
De paging wordt onder de zoekresultaten gezet wanneer de zoek-actie klaar is, dus wanneer de gebruiker op de Zoek-knop geklikt heeft:

code:
1
2
3
4
5
6
protected void zoekLink_Click(object sender, EventArgs e)
        {
             //Doe de zoekactie
             //Plaats resultaten en paginanummer in property
             HandlePaging(zoekresultaten.hitcount, paginanummer);
         }


De zoekresultaten plaats ik even in de view-state, en ook het paginanummer (om te kunnen tonen wat de actieve pagina is) zet ik in de viewstate.
(Ik realiseer me dat de zoekresultaten in de viewstate misschien niet zo'n nette oplossing is overigens)

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
public int PaginaNummer
        {
            get
            {
                return (int)this.ViewState["PaginaNummer"];
            }
            set
            {
                this.ViewState["PaginaNummer"] = value;
            }
        }

public ZoekResultaatDTO ZoekResultaat
        {
            get 
            {
                ZoekResultaatDTO zr = (ZoekResultaatDTO)this.ViewState["_ZoekResultaat"];
                if (zr == null)
                    return null;
                else
                    return zr;
            }
            set
            {
                this.ViewState["_ZoekResultaat"] = value;
            }
        }


In de OnInit heb ik ook een call naar de HandlePaging methode:

code:
1
2
3
4
5
6
7
8
protected override void OnInit(EventArgs e)
        {
            if (ZoekResultaat != null)
            {
                HandlePager(ZoekResultaat.HitCount, this.PaginaNummer);
                base.OnInit(e);
            }
        }


Dit heb ik ook in de Page_Load geprobeerd overigens

Wat is nu mijn probleem?

In de HandlePaging methode maak ik dynamisch een rits met linkbuttons aan, die de paging moeten verzorgen;
(even een snipje van de code:)

code:
1
2
3
4
5
6
7
8
9
Panel pan = (Panel)this.FindControl("Panel1");

LinkButton hl = new LinkButton();
hl.Click += new EventHandler(zoekLink_Click);
hl.Text = i.ToString();
hl.CssClass = cls;
hl.ID = "lb_" + i + Guid.NewGuid().ToString();

pan.Controls.Add(hl);


Maar.....de click doet het gewoon niet! Er vindt wel een postback plaats (partial, alles staat in een UpdatePanel) maar de methode zoekLink die ik in de Click-event gekoppeld heb wordt niet graakt.

Als ik de Guid weghaal bij het opbouwen van de ID, dan krijg ik de melding dat lb1 al bestaat. Dat snap ik misschien wel, omdat e.e.a in een usercontrol plaatsvindt, waar 4 instanties van op de pagina staan. Vandaar de Guid-toevoeging, maar ik denk dat het daar wel mee te maken heeft.

Ik weet het echt niet meer, iemand wel???

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
De labels krijgen nu bij iedere postback een ander ID. Dat gaat niet werken omdat ASP.NET dan het event niet kan terugkoppelen aan de juiste control want dat gaat op id.

Bouw het ID op aan de hand van het ZoekControl (ofzo) waarop die labels staan. Bijv:

C#:
1
hl.ID =  this.ID + "_lbl" + i.ToString();

[ Voor 4% gewijzigd door Face_-_LeSS op 19-05-2008 11:24 ]


  • VAnTurenhout
  • Registratie: September 2004
  • Laatst online: 09-02-2024
Ik gebruik parent.ClientID:

code:
1
hl.ID = Parent.ClientID + "lb_" + i.ToString();


Maar dat geeft geen beter resultaat. Ook hier een postback, maar geen trigger van het click-event.

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Ik heb mijn post hierboven net even aangepast. Probeer eens Parent.ID ipv Parent.ClientID...

  • VAnTurenhout
  • Registratie: September 2004
  • Laatst online: 09-02-2024
Ik zie dat ie in ieder geval met Parent.ClientID wel de event in duikt. Dat gaat dus de goeie kant op. Het werkt nu nog niet zoals ik wil, maar dat heeft (nog) niets met bovenstaande verhaal te maken.
Vooralsnog bedankt !