03. oktober 2002 - 01:22Der er
67 kommentarer og 2 løsninger
Køre subs fra onClick
Jeg har en side, hvor når der klikkes på et billede, skal der køres en bestemt sub. Sub'en er tom for at være sikker på, at det ikke er indholdet af sub'en det er galt med:
sub Bestil_click(nr as integer) end sub
På siden har jeg så et antal billeder, der fungerer som knapper (ved onClick). f.eks:
Og ja, jeg er godt klar over at det er en dejlig blanding mellem vb.net, asp.net, asp og vb-script, men man kan ikke blive andet end forvirret og fortvivlet, når man normalt bruger almindelig asp og så frygtesløst kaster sig ud i asp.net :-)
Nå, men det kan være at I kan hjælpe mig med at løse det på en anden måde. Her er hvad jeg skal lave:
Jeg er ifærd med at lave en indkøbskurv. Jeg danner en produktliste i en tabel ved hjælp af asp:repeater, og i hver række skal der være mulighed for at skrive et antal i en tekstboks og trykke på "bestil" (enten billede eller knap). Når man trykker på "bestil" skal der køres en sub, der sørger for at tilføje produktet til indkøbskurven. Jeg skal derfor både bruge produktnummer samt antal for det valgte produkt. Hvordan gør jeg det ?
nå jo, men hvordan får jeg så i sub'en Bestil_clik fat i det antal der bliver skrevet i tekstboksen, samt produktnummeret på det produkt, der er i den række ?
hvis du kommer fra en ASP-baggrund, så kan du jo bare "misbruge" din viden derfra. Du kan stadig lave ASP'en som "i gamle dage".
så kunne du evt. skrive en form ud for hver "repeat" og så bare sætte dit produktID/Navn i et hidden felt, og badabing, så har du ligepludselig noget der ligner
For at bruge et billede som submit-knap, skal der vel på onclick være noget i retning af formX.submit(), men hvordan ved den hvilken for der skal submittes.
Cyberfessor -> Det lyder somom du ikke mener, at det er den rette måde at gøre det på. Hvordan skal jeg så gøre det ?
rbl>> hvis du nu satte dig lidt ind i tingene ville du hurtigt indse at du ikke bare kan kalde en sub der kører på serveren på den måde du gør det... For det første skal du køre dit link i en <form runat="server"> tag. For det andet skal du sørge for at dit link, billede eller hvad du nu vælger at bruge også er en server-control, altså også har runat="server" specificeret. Det kan enten være et <img> tag, eller måske et <asp:imagebutton> tag som også er blevet foreslået. For det tredie kan du ikke kalde din sub med parametre, altså bliver det en ren onclick=Bestil_Click For det fjerde er din sub skrevet forkert, det skal være sådan her
sub bestil_click(Src as Source, e as Eventargs) end sub
I .Net kan man sagtens lave det på samme måde, men ja, der findes så mange andre muligheder som er ret uoverskuelige uden at man har skabt et lille overblik over dem. Personligt synes jeg det er ret svært at holde styr på det hele uden at man sidder og fedter med sit Visual Studio .Net, men her er det dog også ret let.
(Jeg sidder ikke lige ved min Visual Studio nu ...)
skg -> Ja, jeg havde også selv tænkt på at gøre det på en lignende måde, men jeg vil gerne finde ud af den "rigtige" måde i asp.net
Cyberfessor -> Det er selvfølgelig godt nok, at du skriver at jeg har gjort det forkert, men jeg mangler stadig at finde ud af, hvordan jeg får fat i de to værdier fra min sub.
rbl>> der er en grund til at det hedder webforms, og det er at det hele kører på postback, og derfor er der ikke nogen der forhindrer en i at lade ens form dække over HELE siden, altid, altså
<html> <body> <form runat="server"> ... din side... </form> </body> </html>
ang. din tekstbox og bestilknap i hver række i tabellen kan du bruge en repeater eller datagrid til at få vist alle de poster du nu engang skal have vist på din side
skg>> har jeg sagt at han skal? jeg skrev at der er ikke noget der forhindrer ham i det, og hvis man programmeringsmessigt kan finde ud af at styre sine viewstates, så er det problem også ude af verden. Hans problem var åbenbart at han havde brugt to forms på en side... jeg pointere så at løsningen til det var at lave den ene form man må have på en side favne over lidt mere.
Lad os sige at du i starten har en <asp:linkbutton> og i bunden af siden har en <asp:button> i forbindelse med noget input. I sådan en tilfælde må man strække sin form fra starten af siden til slutningen for at kunne bruge postback.
Man du har stadig ikke svaret på, hvordan jeg fortæller sub'en hvilken knap der blev trykket på og hvilket textfelt, der hører til knappen. Hvis der f.eks. er 20 rækker med varer, og man så skriver et antal i tekstfeltet og trykker på Bestilknappen ud for varen med produktnummer X. Alle de 20 knapper aktiverer den samme sub ved onClick, så jeg skal på en eller anden måde i sub'en finde ud af hvad produktnummeret er, og hvilket tal der er skrevet i tekstfeltet.
nej, den leder bare efter alle checkbokse, der er checket. Og dog...
-> Jeg kiggede lige på det -psycho- foreslog. Hvis det virker, så er jeg godt på vej. Hvis jeg sætter id på imagebutton'en lig med produktnummeret, så har jeg produktnummeret på det produkt, der er trykket ud for.
Kan jeg så løbe alle tekstbokse igennem og checke på deres id, for at se om det passer til knappens id, på den måde som du foreslår cyberfessor ?
det er det substring gør.. hvis din id er "ID0001" og du bruger substring(2) så henter den kun "0001", hvis det var substring(1) så ville den hente "D0001" eller hvis substring(3) "001"
Hmm, prøv bare for en test at smide en label på og så databind dens tekst til '<%# "ID" & DataBinder.Eval (Container.DataItem, "varenr") %>' bare for at se hvad det er den prøver at skrive i id.
rbl> problemet er at du ikke kan tildele id'er dynamisk på den måde. Jeg vil anbefale dig at kigge en ekstra gang, da det er den rigtige måde at gøre det på !!
det kræver selvfølgelig at du skriver alle dine produkter ud i et datalist, hvilket også er den rigtige måde at gøre det på... i det her tilfælde hedder dataliste't så MyDataList
Nå, nu har jeg ændret det til en datalist. Nu får jeg en fejlmeddelelse, når jeg forsøger at få fat på tekstboksen: System.NullReferenceException: Object reference not set to an instance of an object.
i linien: thebox = ctrlrepeater.Items(datalist1.SelectedItem.ItemIndex).FindControl("antalField")
sub bestil_Click(Obj As Object, e As System.Web.UI.ImageClickEventArgs) Dim antal as integer Dim varenr as String dim i as integer dim index as integer
For i=0 To datalist1.Items.Count -1 if obj is datalist1.Items(i).FindControl("knap") then index = i end if Next
dim varebox as textbox = datalist1.Items(index).FindControl("varenrField") dim antalbox as textbox = datalist1.Items(index).FindControl("antalField")
varenr = varebox.text antal = antalbox.text end sub
Men efter at jeg har ændret min repeater til en datalist, så er alle borders på min tabel forsvundet. hvordan får jeg dem frem igen ?
det var dejligt du fik det til at virke.. jeg har ikke haft tid til at checke min eksperten.dk før nu, men har da rodet lidt med det datalist selv (må ærligt indrømme at det jeg fortalte dig inat var ren teori), men som du kan se her http://www.burningice.dk/datalist.aspx (tryk på et navn), virker det skam også i praksis.
Ang. så ved jeg ikke om det er nogen i den retning som jeg har lavet du søger??
I så fald er det SeparatorStyle og SeparatorTemplate du skal kigge lidt på
gridlines kan også gøre det.. det er måske lidt mere hensigtsmæssigt i din sammenhæng?? Sæt den til both for at få border både vertikalt og horisontalt
Nu virker det hele. Tak for hjælpen begge to. Hvis I vil have point, skal I oprette et svar. 30 point til deling er ikke meget, så jeg vil afsætte nogle flere, hvis I er interesseret
public void MyDataList_Select(Object sender, EventArgs e) { int index = MyDataList.SelectedItem.ItemIndex;
MyLabel.Text += index.ToString() +" og i den tilhørende textbox stod der <b>"+ ((TextBox) MyDataList.Items[index].FindControl("txtText")).Text +"</b>";
hehe... ja, det er rigtigt... eller... ikke strengere regler for hvad man kan, men mere hvordan det skal gøres. Det er fordi at asp er et script sprog, hvor .net er et object orienteret programmeringssprog, i stil med JAVA. Dog er der uanede muligheder med asp.net i forhold til asp når man først får sat sig rigtig ind i tingene.
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.