sawMedlem sedan mars 20011 880 inlägg 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?
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 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).
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 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 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?
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 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
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 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