09. september 2005 - 14:13Der 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.
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);
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) {
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.
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
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 } } } } ----
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.
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:
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 ...).
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 :)
tag en kigger og se om du kan få noget ud af det - ellers skriver du bare igen :o) mvh
Synes godt om
Ny brugerNybegynder
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.