CRS Webbproduktion
Webbproduktion när den är som bäst

Att använda egna Collections

september 26, 2008 08:35 by Admin

På begäran ska jag skriva hur man går tillväga, hela vägen, för att använda egna Collections i sin applikation. För att göra det har vi lite förkunskapskrav.

Till grund för detta ligger vår Dataklass för SQL Server. Den är mycket enkel att bygga om till MySQL eller Access om man vill det.
Vi använder också egna Collections som ärver List<T>.

Jag tänker visa enklast möjliga lösning här, där jag listar länder med flaggor. Jag visar först koden för ~/App_Code/CRS.Flags.cs


using System;
using System.Data;

public namespace CRS
{
    public class Flag
    {
        private int _Id;
        private string _Image;
        private string _Country;
        public Flag()
        {
        }
        public Flag(int id, string image, string country)
        {
            this._Id = id;
            this._Image = image;
            this._Country = country;
        }

        public int Id
        {
            get {return this._Id;}
            set {this._Id = value;}
        }
        public string Image
        {
            get {return this._Image;}
            set {this._Image = value;}
        }
        public string Country
        {
            get {return this._Country;}
            set {this._Country = value;}
        }
    }

    public class FlagCollection : List<Flag>
    {
        public static void FillFromDataReader (System.Data.IDataReader reader)
        {
            while (reader.Read())
            {
                this.Add(new Flag(int.Parse(reader["id"].ToString()), reader["image"].ToString(), reader["country"].ToString()));
            }
            reader.Close();
        }
    }
} 

Där har vi hela klassen för flaggorna, inklusive FlagCollection, som alltså är samlingen med flaggor. Nästa steg är att skapa dessa collections. Jag brukar skapa en klass som jag kallar FlagFunctions, där jag lägger diverse metoder för att hämta dessa klasser. Jag visar den här:

public namespace CRS
{
    public static class FlagFunctions
    {
        public static FlagCollection GetAll()
        {
            using (CRS.Data data = new CRS.Data())
            {
                data.CommandText = "SELECT id, image, country FROM tblFlags";
                IDataReader reader = data.ExecuteReader();
                return new FlagCollection(reader);
            }
        }
    }
} 

 Fint så långt, och inga konstigheter hoppas jag. Nu är det bara det enkla kvar. Det är själva aspx-sidan. För att göra det enkelt har jag inte använt CodeBehind här, utan bakat in koden på sidan, men det gör du ju som du vill. I skarpt läge använder jag uteslutande CodeBehind. Att använda serverkod i aspx-sidan tycker jag är fult.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        rptFlags.DataSource = CRS.FlagFunctions.GetAll();
        rptFlags.DataBind();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater runat="server" ID="rptFlags">
            <ItemTemplate>
                <asp:Image runat="server" ImageUrl='<%#Eval("Image") %>' AlternateText='<%#Eval("Country") %>' />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>
  

Kommentarer

september 27. 2008 15:02

Peter

Tack för att du skrev detta, det hjälpte mig enormt!
Jag vill bara veta varför jag får ett meddelande på denna rad:

public static FillFromDataReader (System.Data.IDataReader reader)

Den säger att FillFromDataReader must have a return type.

Peter

september 28. 2008 17:20

Admin

Hej!

Det stämmer, klart den ska ha en return type. I detta fall void.
Jag har uppdaterat koden.

Admin

november 25. 2008 12:28

tomas, a.k.a. blackmustard

En liten kommentar bara: du har satt ID på din repeater till rptFlags i aspx-sidan, men använder rpt.DataSource... ;)

tomas, a.k.a. blackmustard

november 25. 2008 12:30

Stefan

Stämmer bra, tack för det!
Jag har nu uppdaterat koden

Stefan

Lägg till kommentar




  Country flag

biuquote
  • Kommentar
  • Live överblick
Loading