Permalänk
Medlem

C# skapa HTML dynamiskt

Hej hopp,

Har fått som skoluppgift att programmera en enklare webbutik och har nu kommit till det steg då jag på något sätt ska lägga ut produkter på framsidan.

Dessa ligger lagrade i en databas.

Det jag tänkte göra var att skapa en div för varje produkt, och i denna div lägga en bild på produkten och en knapp för att lägga den i kundkorgen. Men istället för att skapa massa div-taggar från början, så tänkte jag att jag med C# dynamiskt kan skapa så många div-taggar som jag har produkter i databasen.

Jag är dock inte helt säker på hur man gör detta, jag började lite smått med att skapa en div dynamiskt i min Page_Load() och använde lite kod jag hittade på internet:

HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV"); div.ID = "div1"; div.Attributes["style"] = "background-color:red; height:200px; width:200px; position:absolute; top:500;"; div.InnerHtml = "I was created using Code Behind"; this.Controls.Add(div);

Det blir dock inte alls bra, dels lägger sig diven längst upp i vänstra hörnet, trots att jag specifierat top:500px och dels så lägger sig HTML-koden för diven allra längst ner i källkoden (om man klickar fram källkoden genom webbläsaren), vilket en validator säkerligen kommer klaga på.

Nybörjare som jag är så skulle jag uppskatta lite hjälp med detta.

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Hejs

Först en liten parentes...
Om du endast är i startgroparna med uppgiften och inte låst dig vid att använda C# kan jag starkt rekommendera Django för den här uppgiften. Väldigt smidigt och enkelt att skapa en databas driven webbsida, t.ex. en webshop. Du kan direkt i html-koden loopa genom de objekt i databasen du vill representera på sidan och därmed dynamiskt skapa nya html-objekt med innehållet från databasen. https://www.djangoproject.com/

Nu är jag inte så bekant med C# men du borde kanske leta efter ett sätt att appenda div-en till en annan (parent) div som kan vara t.ex. en container där alla dina produkt-divar visas. På det viset borde du få koden precis där du vill ha den. Detta görs i t.ex Javascript med följande kodrad:

parent_div.appendChild(div);

Sedan kan du också testa med att byta position till relative..

Permalänk
Medlem

Ah, felet med positioneringen berodde på att jag glömt px, såg nu att jag endast hade skrivit top:500;

Problemet med att diven i källkoden hamnar under slut-taggen </html> kvarstår dock fortfarande, vilket leder till fel i valideringen, W3C-validatorn säger följande:

document type does not allow element "div" here

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av jm87:

Hejs

Först en liten parentes...
Om du endast är i startgroparna med uppgiften och inte låst dig vid att använda C# kan jag starkt rekommendera Django för den här uppgiften. Väldigt smidigt och enkelt att skapa en databas driven webbsida, t.ex. en webshop. Du kan direkt i html-koden loopa genom de objekt i databasen du vill representera på sidan och därmed dynamiskt skapa nya html-objekt med innehållet från databasen. https://www.djangoproject.com/

Nu är jag inte så bekant med C# men du borde kanske leta efter ett sätt att appenda div-en till en annan (parent) div som kan vara t.ex. en container där alla dina produkt-divar visas. På det viset borde du få koden precis där du vill ha den. Detta görs i t.ex Javascript med följande kodrad:

parent_div.appendChild(div);

Sedan kan du också testa med att byta position till relative..

Kursen är i C#, så det är det språket vi måste köra på

Angånende metoden att appenda divarna så har jag också tänkt på det, vet att det var lätt att göra i javascript men jag har ingen aning om hur det görs i C#.

Positioneringen löste jag för övrigt, se ovanstående inlägg

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Newklear:

...men jag har ingen aning om hur det görs i C#.

Om jag inte minns fel borde det vara samma syntax som i JS. (jag kan ha fel dock)
Glöm inte at "getta" parent-elementet, annars har du ju ingen parent att appenda till

Lycka till!

Permalänk
Medlem

Jag hittade detta:

Control control = this.FindControl("container"); HtmlControl div = new HtmlGenericControl("div"); div.Attributes.Add("id", "myid"); div.Attributes.Add("class", "myclass"); control.Controls.Add(div);

"container" som jag använde till inargument till FindControl() är en div som redan finns.

Det fungerar dock inte, får felet: "Objektreferensen har inte angetts till en instans av ett objekt."

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Newklear:

Hej hopp,

Har fått som skoluppgift att programmera en enklare webbutik och har nu kommit till det steg då jag på något sätt ska lägga ut produkter på framsidan.

Dessa ligger lagrade i en databas.

Det jag tänkte göra var att skapa en div för varje produkt, och i denna div lägga en bild på produkten och en knapp för att lägga den i kundkorgen. Men istället för att skapa massa div-taggar från början, så tänkte jag att jag med C# dynamiskt kan skapa så många div-taggar som jag har produkter i databasen.

Jag är dock inte helt säker på hur man gör detta, jag började lite smått med att skapa en div dynamiskt i min Page_Load() och använde lite kod jag hittade på internet:

HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV"); div.ID = "div1"; div.Attributes["style"] = "background-color:red; height:200px; width:200px; position:absolute; top:500;"; div.InnerHtml = "I was created using Code Behind"; this.Controls.Add(div);

Det blir dock inte alls bra, dels lägger sig diven längst upp i vänstra hörnet, trots att jag specifierat top:500px och dels så lägger sig HTML-koden för diven allra längst ner i källkoden (om man klickar fram källkoden genom webbläsaren), vilket en validator säkerligen kommer klaga på.

Nybörjare som jag är så skulle jag uppskatta lite hjälp med detta.

Jag rekommenderar dig att istället använda grids för ändamålet.

Visa signatur

foto{5d/400d | canon 24-70 2.8L | canon 18-55 3.5-5.6 |sigma 70-300 4.0-5.6 | canon 50 1.4 | speedlite 430ex}
dator{Dell Optiplex 780 SFF}

Permalänk
Medlem
Skrivet av vanos:

Jag rekommenderar dig att istället använda grids för ändamålet.

Har aldrig stött på grids så om du har någon sida som visar hur man kan använda detta så vore det bra.

Jag sökte lite på google, men fick väl inga bra svar direkt.

EDIT: Tables har vi kollat lite på, det kanske är ungefär samma?

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Newklear:

Har aldrig stött på grids så om du har någon sida som visar hur man kan använda detta så vore det bra.

Jag sökte lite på google, men fick väl inga bra svar direkt.

Försökte hitta några med små enkla exempel:

http://www.dotnetperls.com/datagridview
http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c13537
http://www.dotnetperls.com/datagridview-tutorial

Visa signatur

foto{5d/400d | canon 24-70 2.8L | canon 18-55 3.5-5.6 |sigma 70-300 4.0-5.6 | canon 50 1.4 | speedlite 430ex}
dator{Dell Optiplex 780 SFF}

Permalänk
Medlem

Men det verkar vara mer för windowsapplikationer (windows forms application)?

Eller fungerar det på samma sätt med webbsidor?

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Newklear:

Men det verkar vara mer för windowsapplikationer (windows forms application)?

Eller fungerar det på samma sätt med webbsidor?

Fungerar på samma sätt för web

Visa signatur

foto{5d/400d | canon 24-70 2.8L | canon 18-55 3.5-5.6 |sigma 70-300 4.0-5.6 | canon 50 1.4 | speedlite 430ex}
dator{Dell Optiplex 780 SFF}

Permalänk
Medlem
Skrivet av vanos:

Fungerar på samma sätt för web

Körde på med tabeller som jag pysslat lite med förut, men du ska ändå ha tack för hjälpen

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

Nytt problem...

I tabellen lade jag sen in knappar dynamiskt:

Button btnBuy = new Button(); btnBuy.Text = "Add to cart"; btnBuy.Click += new EventHandler(buy); btnBuy.ID = product.id.ToString();

Som anropar funktionen

protected void buy(object sender, EventArgs e){ }

Men eftersom jag har dålig koll på att arbeta med funktioner så vet jag inte hur jag ska få knappens id till funktionen, detta behövs för att leta upp rätt produkt i databasen.
Jag prövade lite med "sender" som är ett inargument till funktionen, men fick inte fram något vettigt.

Visa signatur

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Avstängd

Men människa, du har ju dina aspx-sidor för en anledning (Själv har jag gått över till Razor som vymotor för länge sedan)...
Att designa sina sidor med kod såhär är så mycket anti pattern det kan bli

all layout ska ligga i en aspx sida, sedan har du enbart beteendet i kod. I ditt fall ska du flytta allt förutom knapptryckinngen till aspx-vyn

sedan att du sätter product idt på till id:t på din knapp är lite bakvänt, använt CommandArgument istället...
edit: sender är knappen så för att få ut klickad product id

var addToCartButton = sender as LinkButton; int id = int.Parse(addToCartButton .CommandArgument);

Jag skulle dock rekommendera dig att byta till MVC3 och Razor vymotorn..

Jag kanske uppfattas som dryg, men om du forsätter i denna bana kommer ditt system inte gå att använda.. sorry

Visa signatur
Permalänk
Medlem

Jag skulle använda en user control som definierar hur en produkt ser ut och sen använda en repeater som loopar igenom alla produkter och matar user controlen med data.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcont...