Avatar billede hansi67 Nybegynder
09. september 2005 - 14:13 Der er 19 kommentarer og
1 løsning

Delegate problem C#

Hey,
Jeg har lidt problemmer med nedenstående kode.
Konkret drejer det sig om at jeg modtager en fejl besked som lyder:
"C:\Inetpub\wwwroot\msa\b.aspx.cs(257): Method 'msa.b.btnDeleteItem_Click(object, System.Web.UI.ImageClickEventArgs)' does not match delegate 'void System.EventHandler(object, System.EventArgs)'"

Jeg fatter ikke helt Delegates og hvordan man benytter dem.

Hilfe hilfe.

-----
private void btnDeleteItem_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
    // Some code
}

private void displayBasket(bool boolEmptyOrNot)
{
    // create a new table
    Table tblNew = new Table();
    tblNew.BorderStyle = BorderStyle.Solid;
    tblNew.CellPadding = 0;
    tblNew.CellSpacing = 0;
    tblNew.BorderWidth = 0;

    TableRow trRow;
    TableCell tcCell;

    // Create a new row
    trRow = new TableRow();

    // create a cell in the current row
    tcCell = new TableCell();
    tcCell.Text =  "bla bla>";
    tcCell.Width = 100;
    tcCell.BackColor = Color.Gray;                   
    trRow.Cells.Add(tcCell);
               
    // create a cell in the current row
    tcCell = new TableCell();
    tcCell.Text =  "bla bla";
    tcCell.Width = 200;
    tcCell.BackColor = Color.Gray;                   
    trRow.Cells.Add(tcCell);

    // create a ImageButton
    ImageButton btnDeleteItem = new ImageButton();
    btnDeleteItem.Height = 17;
    btnDeleteItem.Width = 15;
    btnDeleteItem.ImageUrl = "grafik/gui/btnDeleteItem.gif";
    btnDeleteItem.Click  += new EventHandler(btnDeleteItem_Click); // PROBLEMMET ****

    // create a cell in the current row and use the ImageButton
    tcCell = new TableCell();
    tcCell.Controls.Add(btnDeleteItem);
    tcCell.Width = 30;    
    tcCell.HorizontalAlign = HorizontalAlign.Center;
    trRow.Cells.Add(tcCell);

    // Add Row to Table
    tblNew.Rows.Add(trRow);
   
    // Add the table to the PlaceHolder control   
    phTable.Controls.Add(tblNew);

}
----
Avatar billede erikjacobsen Ekspert
09. september 2005 - 14:22 #1
Umiddelbart skal du vel lave en new ImageClickEventHandler i stedet for bare en new EventHandler.
Avatar billede hansi67 Nybegynder
09. september 2005 - 14:46 #2
hejsa.. nu skrev jeg:
--
btnDeleteItem.Click  += new ImageClickEventHandler(btnDeleteItem_Click);
--
og så forsvandt fejlbeskeden. (så lang så godt :)

Men når jeg så trykker på knappen "btnDeleteItem" så kalder den ikke koden i
--
private void btnDeleteItem_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{

}
--

:(
Avatar billede erikjacobsen Ekspert
09. september 2005 - 14:52 #3
Det burde den jo gøre. Hvad skulle metoden gøre, og hvad får dig til at sige at den ikke bliver kaldt.
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:11 #4
Koden skal slette en record i en db (ikke lavet i nu).

Jeg bruger VS og benytter "Step into"(F11) til at følge hvad der sker i koden og der bliver "private void btnDeleteItem_Click(object sender, System.Web.UI.ImageClickEventArgs e)" ikke kaldt.
Avatar billede snepnet Nybegynder
09. september 2005 - 15:17 #5
kan du ikke vise os hvorfra og hvordan du kalder displayBasket?
hvis det er noget du gør i et andet event vil det ikke virke, men hvis det er en kode du kører ved hvert request, og ifm f.eks. page_load, så burde det gå godt.
mvh
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:27 #6
Hi mr snepnet .. som du kan se så skal jeg have det ind med grydeskeer :)
----
private void Page_Load(object sender, System.EventArgs e)
{
    lblEmptyBasket.Visible = false;
    if(!Page.IsPostBack)
    {
        if(Request.Browser.Cookies == true) // Users browser dont support cookies
        {
            if(Request.Cookies["cBasket"] == null) // User dont have a basket cookie (no basket)
                {
                    EmptyOrNot = true; // the basket is empty
                    displayBasket(EmptyOrNot);
                }
                else // the user already have a basket cookie (already a basket in DB for this user)
                {
                    this.BasketID = Convert.ToInt16(Request.Cookies["cBasket"].Values["basketID"]);  // Get the basketID from Cookie.
                    EmptyOrNot = false; // There is Items in the basket
                    displayBasket(EmptyOrNot);
                }                   
            }
            else
            {
                // some code - ikke lavet
            }
        }
    }
}
----
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:31 #7
Ups .. nu fik jeg det til at virke ved at fjerne coden fra "if(!Page.IsPostBack)
".

Det er fanme ikke at leve når man er lidt dum :))
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:32 #8
Det er fanme ikke nemt* at leve når man er lidt dum :))
Avatar billede snepnet Nybegynder
09. september 2005 - 15:33 #9
det ser skam fint ud det du har lavet, men vær opmærksom på, at når du har pakket genereringen af din tabel ind i

if(!IsPostBack)

vil du kun få indsat tabellen når brugeren rammer siden første gang. ved alle efterfølgende postbacks, vil du ikke få kaldt metoden der indsætter tabellen, og du vil derfor heller ikke får oprettet eventhandlers til din knaptryk.

så i dit scenarie vil du - når brugere ser siden første gang - få oprettet tabellen, og abboneret på click-events'ne, men når brugeren trykker på en knap ell. vil det ikke ske.

mvh
Avatar billede snepnet Nybegynder
09. september 2005 - 15:34 #10
nå - det var jeg lidt for lang tid om at skrive kan jeg se :oD
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:34 #11
I skulle vel ikke have et godt link der forklare Events og Delegates i "pædagoiske vendinger" :)

Jeg giver gerne points for hjælp.. til hvem ?
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:43 #12
Kom så snepnet din haj.. svar så du kan få points!

erikjacobsen..hvis du også gerne vil have nogle points så åbner jeg gerne en ny tråd så jeg også kan giver points til dig.

Tak for hjælpen til jer begge :)
Avatar billede snepnet Nybegynder
09. september 2005 - 15:47 #13
ro på - jeg sidder jo lige og skriver til dig :o)
mvh
(du får et svar her.... så kan jeg jo dele med erik)
Avatar billede hansi67 Nybegynder
09. september 2005 - 15:51 #14
:D det var som ikke for at stresse dig .. jeg vil meget gerne dele imellem jer. Hvordan gør jeg det ?
Avatar billede snepnet Nybegynder
09. september 2005 - 16:01 #15
begge lægger et svar - og så får du en mulighed for at dele pointene mellem os. default er nok bare halvt til hver.
mvh
Avatar billede hansi67 Nybegynder
09. september 2005 - 16:05 #16
Okey fint.. så har du fået point og karma .. så må vi se om Hr Jacobsen melder sig på banen.

God weekend og tak endnu en gang :)
Avatar billede snepnet Nybegynder
09. september 2005 - 16:14 #17
mmm.... prøv at se på det på den her måde:

en delegate er et objekt der kan holde en liste over metoder der overholder signaturen på delegaten.

så i klassebiblioteket er der defineret sådan en her:

public delegate void ImageClickEventHandler(object sender, ImageClickEventArgs e);

signaturen på delegaten (object sender, ImageClickEventArgs e) fortæller at der kun kan skrives metoder ind i listen der tager to parametre (et object og et ImageClickEventArgs).

det var selve delegaten... og læg så mærke til den måde eventet på ImageButton klassen ser ud:

// i ImageButton klassen
public event ImageClickEventHandler Click;

der står at det er et event, og at den delegate der skal bruges er en ImageClickEventHandler.

såh.... det du gør når du skriver sådan her:
someImageButton.Click += new ImageClickEventHandler(someHandler);

er altså at tilføje din metode (someHandler) til listen af metoder der kan kaldes.... det ser lidt besynderligt ud, men det er bare syntaks. nogle har på et tidspunkt tænkt at det var en intuitiv måde at skrive det på.

imagebutton klassen sørger så for at de bliver kaldt på følgende måde (det er ikke helt sådan det er lavet i klassen, men eksemplet her illustrerer hvad der sker):

// intert i klassen ImageButton
if(Click != null) // hvis eventet Click ikke er null, er det fordi der er lavet en .Click += new ImageClickEventHandler(someHandler) et sted.
{
  // nedenstående resulterer i at alle metoder i listen bliver kaldt en efter en.
  Click(this, someImageClickEventArgs); 
}

parametrene:
this :
i og med at det er internt i ImageButton klassen er this bare din ImageButton, hvilket også medfører at du i din eventhandler vil kunne gøre f.eks. sådan her:

private void btnDeleteItem_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
  ImageButton imbtn = sender as ImageButton;
  imbtn.Text = "Clicked";
}

someImageClickEventArgs:
er så bare argumentet - det er bare et alm. objekt som er oprettet et sted i klassen.

selve kaldet:
Click(this, someImageClickEventArgs)
medfører som skrevet at alle de metoder der er langt ind i listen ved
someImageButton.Click += new ImageClickEventHandler(someHandler);
bliver kaldt.
det er jo også en temmelig underlig syntakt, men forestil dig noget i denne stil:

Click(this, someImageClickEventArgs)
{
  foreach(Method method in this.MethodList)
  {
    // siden alle metoder i listen garanteres at tage to parametre (object og ImageClickEventArgs) kan man
    method(this, someImageClickEventArgs);
  }
}

såh..... en hurtig opsummering:

en delegate er et objekt der kan holde en liste over metoder der overholder signaturen på delegaten.

et event giver dig en enkel måde at tilskrive metoder til den liste delegaten holder (nemlig += new ...).

gav det mening?

mvh
Avatar billede snepnet Nybegynder
09. september 2005 - 16:14 #18
også god weekend til dig :o)
mvh
Avatar billede hansi67 Nybegynder
09. september 2005 - 16:21 #19
Hold da op.. hvad skal jeg sige :)))

Det ligner sørme noget der skal skrives ud og tages med på WC næste gang.
Om det giver mening skal jeg nok først kunne sige efter jeg har været trægende et par gange lol  ...nu er det jo snart ikke nok at kun give points :)
Avatar billede snepnet Nybegynder
09. september 2005 - 16:30 #20
tag en kigger og se om du kan få noget ud af det - ellers skriver du bare igen :o)
mvh
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