webForumDet fria alternativet

Problem med att registrera clickhändelse.

9 svar · 531 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

I en panel så lägger jag in en del controller via codebehind. Det mesta fungerar bra, men när jag skall lägga till imagebutton så snubblar jag på att
kunna registrera en click händelse.
Så här gör jag.

//I loppen
Panel2.Controls.Add(makeImageButton("Ta bort",iId.ToString(),"delete.gif",14,13));
//
private static ImageButton makeImageButton(string sText, string sId, 
string simage, int iWidth, int iHeight)
    {
        ImageButton imageButt = new ImageButton();
        imageButt.ID = "imageButton" + sId;
        imageButt.ToolTip = sText;
        imageButt.ImageUrl = "~/Bild/" + simage;
        imageButt.ImageAlign = ImageAlign.AbsBottom;
        imageButt.Width = iWidth;
        imageButt.Height = iHeight;
        //imageButt.Click += new ImageClickEventHandler(imageButt_Click);
//här får jag problem
        return imageButt;
    }

Felet jag får är

object reference is required for the non-static field, method, or 
property 'WebbShop_index.imageButt_Click(object, 
System.Web.UI.ImageClickEventArgs)'

Hur löser jag detta?

fredriknMedlem sedan okt. 200850 inlägg
#2

Står ju i felmeddelandet ;)

Om du har en statisk metod, så kan den bara komma åt statiska members. Så om du pekar på en eventhandler så ska den vara statisk eller så skapar du en instans av den klass som har din eventhandler.

sawMedlem sedan mars 20011 880 inlägg
#3

Jo Fredrik jag misstänkte nog det, men jag begriper inte hur jag skall göra.
(jag tycker att jag var 'duktig' som kommit så här långt).

fredriknMedlem sedan okt. 200850 inlägg
#4

Om din imageButt_Click ligger i samma klass som din makeImageButton, så sätt imageButton till att vara static:

protected static imageButt_Click

sawMedlem sedan mars 20011 880 inlägg
#5

Jag är ledsen Fredrik, men jag förstår inte var jag skall lägga detta.
Jag får bara fel.

sawMedlem sedan mars 20011 880 inlägg
#6

Nu har jag byggt om och ändrat en del.

makeImageButton("Ta bort",i.ToString() +"_"+ iId.ToString(), "delete.gif", 14, 13);
//i classen
private void makeImageButton(string sText, string sId, string simage, int 
iWidth, int iHeight)
    {
        ImageButton imageButt = new ImageButton();
        imageButt.ID =  sId;
        imageButt.ToolTip = sText;
        imageButt.ImageUrl = "~/Bild/" + simage;
        imageButt.ImageAlign = ImageAlign.AbsBottom;
        imageButt.Width = iWidth;
        imageButt.Height = iHeight;
        imageButt.Click += imageButton_Click;
        Panel2.Controls.Add(imageButt);
    }
//sen har jag fått tag i clicken
private void imageButton_Click(object sender, EventArgs e)
    {
        foreach (Control control in Panel2.Controls)
        {
            if (control.GetType() == typeof(ImageButton))
            {
                string sId = control.ID.ToString();
                sId = sId.Substring(2);
                sql = "DELETE FROM Korg Where KorgId =" + Convert.ToInt32(sId);
                Webbutill.executeSQL(sql, DBConn);
            }
        }
    }

I princip så fungerar nu allt utom en irriterarande sak, jag måste klicka två
gånger innan jag kan deleta någonting (klicka på gifbilden).
Går det att göra någonting år det?

doggelitoMedlem sedan juni 20003 076 inlägg
#7

Hmm, ser ut som du bygger en varukorg eller liknande?
Om du gör det så varför inte använda en gridview t.ex.?

Jag har själv precis tagit över ett projekt där allt är kodat codebehind utan hjälp av färdiga kontroller som repeaters, gridview osv., skitdrygt att gå in och försöka ändra saker då! :l

sawMedlem sedan mars 20011 880 inlägg
#8

Ja det är tikkigt, och jag har allting fungerande på ett tillfredställande sätt, utom det
sista. Om man av någon anledning vill ta port en post i varukorgen då måste man
klicka två gånger, och jag är inte f-n till och hitta varför..

GladhMedlem sedan maj 20012 812 inlägg
#9

saw skrev:

man av någon anledning vill ta port en post i varukorgen då måste man
klicka två gånger

Det brukara ha och gör med att man inte kontrollerar om sidan gör en Postback eller ej.

Oftas är det så här:
1. Man hämtar sina värden från databasen och skriver ut allt till sidan.
2. Man trycker på sin delete button och gör en postback.
3. Man hämtar sina värden från databasen och skriver ut allt till sidan.
4. Delete_eventet körs och posten tas bort från databasen.

Vilket betyder att det ser ut som om posten inte har försvunnit från databasen men det har den egentligen gjort. Så det är väldigt enkelt att kontrollera. Kör din kod och ta bort en sak, sidan visar nu att saken fortfarande finns kvar, men den skall vara borttagen från din databasen.

Så för att lösa problemt så får man inte hämta sina värden vid en Postback förren efter man har tagit bort posten från databasen, och därefter så skriver man ut allt till sidan igen...

- M

sawMedlem sedan mars 20011 880 inlägg
#10

Tack Gladh, jag trodde att jag hadde kollat allt det där...

if(!IsPostBack)
            showBasket();

.. men nu har jag hittat felet tack vare dig. Tack för hjälpen

133 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)