Avatar billede trumf Nybegynder
24. januar 2006 - 20:44 Der er 10 kommentarer og
2 løsninger

problem med delegate

Hejsa E

Jeg sidder og roder med en delegate så jeg kan finde ud af hvordan sådan en virker.
Jeg har fundet følgende eksempel, som jeg også kunne bruge i noget kode, men jeg kan ikke få det til at spille.
http://www.codeproject.com/aspnet/paginguc.asp

ovenstående ex. har 5 delegates, men jeg har kun brug for den ene (tror jeg) og har derfor lavet om i koden, ellers var der vel heller ikke nogen udfordring vel :)

min kode:
------------------------UserControl----------------------------------
public partial class userControls_selectPage : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        populateShowPage(this.TotalPages);
        EnableDisableButtons(this.CurrentPage, this.TotalPages);
        setDropDownPageNumber(this.CurrentPage);
    }

    public delegate void PageChangedEventHandler(object sender, ucSelectEventArgs e);

    public class ucSelectEventArgs : EventArgs
    {
        private int m_iCurrentPage;

        public ucSelectEventArgs()
        {

        }

        public int arCurrentPage
        {
            get { return m_iCurrentPage; }
            set { m_iCurrentPage = value; }
        }
    }

    private void populateShowPage(int totalNumPages)...

    private void setDropDownPageNumber(int currentPage)...

    private void EnableDisableButtons(int currentPage, int totalPages)...

    public event PageChangedEventHandler PageChanged;

    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.Page_Load);
        this.ddShowPage.SelectedIndexChanged += new EventHandler(this.ddShowPage_SelectedIndexChanged);
    }

    public int CurrentPage
    {
        get {return Convert.ToInt32(ViewState["currentPage"]);}
        set {ViewState["currentPage"] = value;}
    }

    public int TotalPages
    {
        get {return Convert.ToInt32(ViewState["totalPages"]);}
        set {ViewState["totalPages"] = value;}
    }

    protected virtual void OnPageChanged(ucSelectEventArgs args)
    {
        if (PageChanged != null)
        {
            // Invoke the delegates.
            PageChanged(this, args);
        }
    }

    protected void imgNext_Click(object sender, ImageClickEventArgs e)
    {
        ucSelectEventArgs args = new ucSelectEventArgs();
        CurrentPage += 1;
        args.arCurrentPage = CurrentPage;       
        setDropDownPageNumber(CurrentPage);
        EnableDisableButtons(CurrentPage, TotalPages);
        OnPageChanged(args);
    }

    protected void imgPrew_Click(object sender, ImageClickEventArgs e)...

    protected void imgFirst_Click(object sender, ImageClickEventArgs e)...
 
    protected void imgLast_Click(object sender, ImageClickEventArgs e)...
   
    protected void ddShowPage_SelectedIndexChanged(object sender, EventArgs e)
    {
        ucSelectEventArgs args = new ucSelectEventArgs();
        args.arCurrentPage = CurrentPage;
        EnableDisableButtons(CurrentPage, TotalPages);
        OnPageChanged(args);
    }
}

------------------------End UserControl----------------------------------

Og på hovedsiden har jeg bla:

    protected userControls_selectPage ucSelectPage2;

    private void InitializeComponent()
    {
        this.ucSelectPage2.PageChanged += new userControls_selectPage.PageChangedEventHandler(this.PageChanged);
        this.Load += new System.EventHandler(this.Page_Load);
        this.Init += new EventHandler(this.Page_Init);
    }

    private void Page_Init(object sender, System.EventArgs e)
    {
        this.ucSelectPage.CurrentPage = 1;
        this.tblVin.CssClass = "mainTable";
    }

    protected void PageChanged(object sender, userControls_selectPage.ucSelectEventArgs e)
    {
        int currentPage = e.arCurrentPage;
        fillData(currentPage);
        lblLink.Text = "[xxx]";
    }


PageChanged på hovedsiden bliver bare aldrig kaldt...

Hvad gør jeg galt ???
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 00:44 #1
din kode ser rigtig ud... så det tyder på at du ikke kommer ind i:
userControls_selectPage.imgNext_Click
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 00:46 #2
en simpel console app som demonstrerer delegate:
using System;

namespace ConsoleApplication1
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            Class1 c = new Class1();
            c.Run();
        }

        public void Run()
        {
            A a = new A();
            a.SovsekoderDelegate += new A.MyDelegate(SovsekoderHandler);
            a.FireDelegate();
        }

        public void SovsekoderHandler(int i)
        {
            Console.WriteLine("delegate called!! i = "+i);
           
        }
    }

    public class A
    {
        public delegate void MyDelegate(int i);
        public MyDelegate SovsekoderDelegate;   
        public void FireDelegate()
        {
            if(SovsekoderDelegate != null)
            {
                SovsekoderDelegate(10);
            }
        }   
    }
}
Avatar billede trumf Nybegynder
25. januar 2006 - 10:05 #3
i imgNext_Click bliver CurrentPage tilskrevet 1 og både setDropDownPageNumber(CurrentPage) og EnableDisableButtons(CurrentPage, TotalPages) bliver kaldt og fungerer i øvrigt fint nok, det er kun OnPageChanged(args) der ikke kaldes eller...

Måske jeg lige skulle prøve at se om PageChanged != null

    protected virtual void OnPageChanged(ucSelectEventArgs args)
    {
        if (PageChanged != null)
        {
            // Invoke the delegates.
            PageChanged(this, args);
        }
        else
            lblTest.Text = "PageChanged er null!!!"
    }

Jeg prøver det efter arbit, men hvis det måske er noget andet så skriv bare inden :)
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 10:28 #4
jeg ved ikke hvordan dit flow er, men det er vigtigt at denne linie:
this.ucSelectPage2.PageChanged += new userControls_selectPage.PageChangedEventHandler(this.PageChanged);

køres før din imgNext_click metode. Ovenstående linie tilføjer PageChanged metoden til listen af metoder der kaldes. Så som du selv siger hvis this.ucSelectPage2.PageChanged er null, så har du ikke fået tilføjet din metode til delegaten endnu!
Avatar billede trumf Nybegynder
25. januar 2006 - 10:46 #5
Super, det giver god mening selv for mig ;-)

Jeg prøver det når jeg kommer hjem.
Avatar billede trumf Nybegynder
25. januar 2006 - 18:12 #6
PageChanged er null...

her er klassen på hovedsiden, men jeg kan ikke lige gennemskue hvad der køres først af de to. Den anden klasse er den du har set tidligere.

public partial class Vin_vin : System.Web.UI.Page
{
    protected userControls_selectPage ucSelectPage2;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            fillData(1);
            lblLink.Text = "[vin currentPage 1]";
        }
    }

    private void fillData(int currentPage)
    {
    .....
        this.ucSelectPage.TotalPages = totalNumPages;
    .....
    }

    protected void PageChanged(object sender, userControls_selectPage.ucSelectEventArgs e)
    {
        int currentPage = e.arCurrentPage;
        fillData(currentPage);
        lblLink.Text = "[vin currentPage " + currentPage.ToString() + " xxx]";
    }

    private void InitializeComponent()
    {
        this.ucSelectPage2.PageChanged += new userControls_selectPage.PageChangedEventHandler(this.PageChanged);
        this.Load += new System.EventHandler(this.Page_Load);
        this.Init += new EventHandler(this.Page_Init);
    }

    private void Page_Init(object sender, System.EventArgs e)
    {
        this.ucSelectPage.CurrentPage = 1;
        this.tblVin.CssClass = "mainTable";
    }
}
Avatar billede dj Nybegynder
25. januar 2006 - 23:50 #7
VS plejer normaltvis automatisk at generere noget kode der overrider OnInit og kalder InitializeComponent() metoden, men i dit eksempel kan jeg ikke se denne stump kode, så bare lige for at få det på plads, har du så sikret at InitializeComponent() faktisk bliver kaldt ?
Avatar billede trumf Nybegynder
26. januar 2006 - 07:37 #8
Nej det har jeg ikke. Jeg troede at det var en af dem der bliver kaldt automatisk ligesom page_load....  typisk mig!!!

Hvordan laver jeg noget der overrider og skal det så ligge i page_load ?
Avatar billede dj Nybegynder
26. januar 2006 - 10:31 #9
protected override void OnInit() {
  InitializeComponent();
}

Page_Load bliver iøvrigt ikke kaldt "automatisk", årsagen til at det ser sådan ud skyldes formentlig at du har enabled det der kaldes "AutoEventWireUp" på din page som sørger for at override OnLoad og indsætte et kald til Page_Load.

Personligt foretrækker jeg at droppe denne løsning og manuelt override de aktuelle metoder - ikke nok med at man så har 100% styr på forløbet, så er det også hurtigere end at benytte AutoEventWireUp.

Måden du gør det på er ved at erstatte:

protected void Page_Load(object sender, EventArgs e) {
  if (!Page.IsPostBack) {
    fillData(1);
    lblLink.Text = "[vin currentPage 1]";
  }
}

med:

protected override void OnLoad(EventArgs e) {
  if (!Page.IsPostBack) {
    fillData(1);
    lblLink.Text = "[vin currentPage 1]";
  }
  base.OnLoad(e);
}
Avatar billede dj Nybegynder
26. januar 2006 - 10:33 #10
ok, første del burde så være:

protected override void OnInit(EventArgs e) {
  InitializeComponent();
  base.OnInit(e);
}

ikke sådan når det går lidt stærkt :)
Avatar billede trumf Nybegynder
26. januar 2006 - 10:47 #11
OK det er bare super, det virker som en drøm, eller næsten, men det er en hel anden historie, som jeg nok selv skal finde ud af :)
Får jeg lige et svar fra sovsekoder også, for der skal lidt til for indsatsen.

Tak for hjælpen til jer begge :)
Avatar billede sovsekoder Nybegynder
26. januar 2006 - 23:37 #12
et svar.

>Tak for hjælpen til jer begge :)
...det varså lidt :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester