107
Programmering med C# Side 1 af 107 sider Programmering med C#

Sonne Huse

Embed Size (px)

DESCRIPTION

Sonne Huse Color Catalog

Citation preview

Page 1: Sonne Huse

Programmering med C#

Side 1 af 107 sider

Programmering med C#

Page 2: Sonne Huse

Programmering med C#

Side 2 af 107 sider

Page 3: Sonne Huse

Programmering med C#

Side 3 af 107 sider

INDHOLDSFORTEGNELSE Introduktion af .NET Framework........................................................... 8

Hvad er .NET framework?...............................................................................................................8 Hvordan skriver jeg applikationer som udnytter .NET frameworket?.............................................8 MSIL og JIT.....................................................................................................................................8 Assemblies .......................................................................................................................................9 Managed Code .................................................................................................................................9 Garbage Collection ..........................................................................................................................9 Hvordan passer det sammen?.........................................................................................................10

Hvordan skriver du et C# program....................................................... 11 Opret nyt project – konsol..............................................................................................................11 Windows Form...............................................................................................................................12

Variables and Expressions ..................................................................... 13 Basic C# syntaks ............................................................................................................................13 Hvad er en variabel? ......................................................................................................................13 Declaration.....................................................................................................................................13 Data Types .....................................................................................................................................14

Value types.................................................................................................................................14 Reference types ..........................................................................................................................14

Numeric types ................................................................................................................................15 Integer ........................................................................................................................................15 Floating point .............................................................................................................................15

Character Data Types.....................................................................................................................15 string ..........................................................................................................................................15 char.............................................................................................................................................15 Escape Sequences ......................................................................................................................15

Boolean Type .................................................................................................................................16 Navngivning af variabler ...............................................................................................................16

Case Issues .................................................................................................................................16 Expressions ....................................................................................................................................16 Namespaces....................................................................................................................................17 Øvelse 1 – brug af simple variabler ...............................................................................................17 Øvelse 2..........................................................................................................................................18 Øvelse 3 Namespace ......................................................................................................................18

Question 1 ..................................................................................................................................19 Answer .......................................................................................................................................20 Question 2 ..................................................................................................................................20 Answer .......................................................................................................................................20 Question 3 ..................................................................................................................................20 Answer .......................................................................................................................................20 Question 4 ..................................................................................................................................20 Answer .......................................................................................................................................20 Question 4 ..................................................................................................................................20 Answer .......................................................................................................................................20

Flow Control............................................................................................ 21 Der findes 2 måder, som kode kan afvikles på, nemlig .................................................................21 Boolean ..........................................................................................................................................21

Page 4: Sonne Huse

Programmering med C#

Side 4 af 107 sider

Typer af statements ........................................................................................................................22 Ternary Operator............................................................................................................................22 Selection statements.......................................................................................................................22 Switch ............................................................................................................................................24

Eksekvering af switch statement................................................................................................24 Looping - Iteration statements .......................................................................................................26 While statement..............................................................................................................................27 Do statement ..................................................................................................................................27 For statement..................................................................................................................................27 Foreach statement ..........................................................................................................................28 Jump Statement ..............................................................................................................................28 Øvelse 1 – brug af Boolean............................................................................................................28 Øvelse 2 – brug af if.......................................................................................................................29 Øvelse 3 – brug af switch...............................................................................................................29 Øvelse 4 – brug af do Loops ..........................................................................................................30 Øvelse 5 – brug af while Loops .....................................................................................................30 Øvelse 6 – Foreach – og DirectoryInfo..........................................................................................31

Question .....................................................................................................................................31 Answer .......................................................................................................................................32 Question .....................................................................................................................................32 Answer .......................................................................................................................................32 Question .....................................................................................................................................32 Answer .......................................................................................................................................32

Converting Between Data Types ........................................................... 33 Implicit ...........................................................................................................................................33 Explicit Data Type Conversion......................................................................................................33 Constants........................................................................................................................................34 Complex Variable Types ...............................................................................................................34 Enumerations .................................................................................................................................35 Structures – structs .........................................................................................................................36 Arrays.............................................................................................................................................37

Mixed Arrays .............................................................................................................................38 String Manipulation .......................................................................................................................39 Øvelse 1 – Convertering ................................................................................................................40 Øvelse 2 – Enumeration.................................................................................................................41 Øvelse 3 - Struct.............................................................................................................................42 Øvelse 3 – Array ............................................................................................................................43

Question 1 ..................................................................................................................................43 Answer .......................................................................................................................................43 Question 2 ..................................................................................................................................44 Answer .......................................................................................................................................44 Question 3 ..................................................................................................................................44 Answer .......................................................................................................................................44 Question .....................................................................................................................................44 Answer .......................................................................................................................................44 Question 4 ..................................................................................................................................44 Answer .......................................................................................................................................44

Funktioner ............................................................................................... 45

Page 5: Sonne Huse

Programmering med C#

Side 5 af 107 sider

Return Values.................................................................................................................................45 Parameter Arrays............................................................................................................................46 Reference og Value parametere .....................................................................................................47 Variabel scope................................................................................................................................48 Main() Function .............................................................................................................................48 Struct Funktioner............................................................................................................................48 Overloading funktioner ..................................................................................................................49 Øvelse 1 – Functions......................................................................................................................49 Øvelse 2 – function med parameter ...............................................................................................50

Øvelse 3 – Overloading..............................................................................................................51 Dette er et eksempel på overloading functions, den eneste forskel på funktionerne er signaturen og afhængig af kaldet til funktionen finder .Net selv ud af hvilken funktion der skal bruges...52 Øvelse 4 – Simpelt loop.............................................................................................................52 Question .....................................................................................................................................53 Answer .......................................................................................................................................53 Question .....................................................................................................................................53 Answer .......................................................................................................................................53 Question .....................................................................................................................................53 Answer .......................................................................................................................................53 Question .....................................................................................................................................53 Answer .......................................................................................................................................54

Sikkerhed i ASP.NET ............................................................................. 55 Authentication................................................................................................................................55 Authorization. ................................................................................................................................55 Impersonation.................................................................................................................................55 Sikkerhedsmodel............................................................................................................................55 Sikkerhed step by step....................................................................................................................56

Forms Authentication i ASP.NET ......................................................... 57 Forms Authentication Baggrund....................................................................................................57 Standard Forms Authentication Setup ...........................................................................................57 Web.config Overview ....................................................................................................................57

Authentication settings i web-config .........................................................................................57 Web.config Detaljer .......................................................................................................................59

Login.aspx Overview.................................................................................................................59 Login.aspx Detaljer........................................................................................................................60

Default.aspx Overview...............................................................................................................60 Question 1 – authentication/Authorization ....................................................................................62 Question 2 – authentication/Authorization ....................................................................................62 Question 3 – authentication/Authorization ....................................................................................62

Site Design ............................................................................................... 63 Planlægning....................................................................................................................................63 Master- og Content pages ..............................................................................................................63 Opgave – oprette en MasterPage ..................................................................................................65

Navigations Kontroller ........................................................................... 70 Site Map .........................................................................................................................................70 SiteMapPath ...................................................................................................................................72

Opgave .......................................................................................................................................72

Page 6: Sonne Huse

Programmering med C#

Side 6 af 107 sider

SiteMapDataSource kontrol...........................................................................................................73 Menu ..............................................................................................................................................73

Opgave .......................................................................................................................................73 TreeView........................................................................................................................................74

Opgave .......................................................................................................................................74 Web.config og Global.asax ..................................................................... 75

Web.config.....................................................................................................................................75 <authentication> .............................................................................................................77 <authorization>................................................................................................................77 <compilation> ....................................................................................................................77 <customErrors> ..................................................................................................................77 <globalization>................................................................................................................77 <httpRuntime> ....................................................................................................................78 <sessionState> ..................................................................................................................78 <trace> ...................................................................................................................................78

AppSettings sektionsgruppen.........................................................................................................78 Global.asax.....................................................................................................................................78

Design af de enkelte sider på et web-site............................................... 79 Statiske sider ..................................................................................................................................79 Dynamiske sider.............................................................................................................................79

Themes ..................................................................................................... 81 Oprettelse af et theme ....................................................................................................................81

Du skal nu prøve at lave et theme for en side: ...........................................................................81 Membership, Roles & Identity............................................................... 83 Login ........................................................................................................ 86 Sql og databaser ...................................................................................... 87

Hvad er en database og hvad er en relationsdatabase? ..................................................................87 SQL Server miljøet. .......................................................................................................................87 SQL Server Security. .....................................................................................................................87 Datatyper........................................................................................................................................88

Præcise numeriske......................................................................................................................88 Hvordan vælger jeg den rigtige numeriske datatype?....................................................................88

Datetime og smalldatetime.........................................................................................................89 Character Strings........................................................................................................................89

Hvordan vælger jeg den rigtige character datatype?......................................................................90 Statements................................................................................................ 91

SELECT.........................................................................................................................................91 Databinding i ASP.NET ......................................................................... 94

Introduktion....................................................................................................................................94 DataSources ...............................................................................................................................94 DataBound kontroller.................................................................................................................94 Opgave 1 – Data Source Control ...............................................................................................96

Hvad betyder de forskellige ting i ConnectionString?.................................................................100 Data-Bound Kontroller ................................................................................................................101 GriedView....................................................................................................................................101

Page 7: Sonne Huse

Programmering med C#

Side 7 af 107 sider

Datalist & Repeater......................................................................................................................102 Opgave 2 ..................................................................................................................................102

Page 8: Sonne Huse

Programmering med C#

Side 8 af 107 sider

Introduktion af .NET Framework .NET er en udviklingsplatform som har revolutioneret hele udviklingsmiljøet. Det er Microsoft’s intention, at frameworket skal kunne køre på alle operativsystemer, såsom Linux, Macintosh mm. Det er en af hoved-idéerne bag frameworket, at det skal kunne integrere forskellige operativsystemer. I frameworket ligger der ikke nogen begrænsninger for hvilke applikationer du kan udvikle. Det kan være Windows applikationer, web-applikationer, web services eller hvad du har behov for. Det er designet til at kunne bruges med alle programmeringssprog, som eksempel kan nævnes C#, Visual Basic, C++, COBOL. Af andre sprog som har lavet en speciel .NET version kan nævnes Managed C++, Visual Basic.NET og Jscript.NET. Disse sprog kan ikke kun udnytte frameworkets muligheder, men de kan også kommunikere indbyrdes. Det vil sige, at en udvikler i C# kan bruge kode, som er skrevet af en anden udvikler i Visual Basic.NET og omvendt.

Hvad er .NET framework? Hovedparten af frameworket er et gigantisk bibliotek af kode, som du kan bruge i objektorienteret programmering i et sprog som fx. C#. Dette bibliotek er organiseret i moduler, så du kan benytte netop det modul, som passer til din kode. Der er bl.a. et modul for Windows Forms, et andet for Web Form o.s.v. De forskellige operativ systemer understøtter så nogle eller alle af disse moduler, alt efter hvilket operativ system der er tale om. Fx. Vil en PDA understøtte de basale moduler i frameworket, men ikke de mere eksotiske. I biblioteket findes også nogle basis Typer En type er en repræsentation af data og her findes de mest fundamentale typer som fx. En 32-bits integer. Dette gør at de forskellige sprog kan ”tale” sammen gennem frameworket. Dette kaldes Common Type System(CTS). Frameworket inkludere også en Common Language Runtime (CLR), som vedligeholder og sørger for eksekveringen af alle applikationer, der er udviklet ved hjælp af .NET biblioteket.

Hvordan skriver jeg applikationer som udnytter .NET frameworket? Når du skriver kode til frameworket, er alt hvad det kræver en tekst-editor. Det kan fx. være Notepad, men du kan også vælge at benytte et professionelt udviklingsværktøj som Visual Studio.NET. Nå du er færdig med at skrive din kode, skal den konverteres til et sprog, som target-computeren forstår, dette kaldes native kode. Denne konvertering kaldes også kompilering og udføres af en kompiler. Dette er en 2-trins proces i .NET.

MSIL og JIT. Når du kompiler kode, bliver koden ikke umiddelbart til system-specific(til operativ systemet) kode. I stedet bliver det til Microsoft Intermediate Language(MSIL). Denne kode er ikke specifik til

Page 9: Sonne Huse

Programmering med C#

Side 9 af 107 sider

noget operativ system, og heller ikke til fx. C#, hvis du har skrevet koden i C#. Alle .NET-sprog bliver kompileret til MSIL. Når der kommer en request for en applikation, træder en anden kompiler til. Just-In-Time(JIT) kompilerer MSIL til det sprog som “klient-maskinen” forstår. (Operativ-system mm). JIT kommer af koden først kompileres når og hvis der er behov for det. Fordelen ved dette for dig som udvikler er, at du kun skal bekymre dig om at udvikle applikationen. Du skal ikke bagefter kompilere den til flere operativ-systemer, det gør .NET automatisk for dig, når det kræves, og det har vist sig, at .Net-programmer afvikles hurtigere efterhånden som de bruges.

Assemblies Når du kompiler en applikation, bliver din MSIL-koden gemt i en assembly. I assembly’en vil både den eksekverbare fil(*.exe), og dll-filer, som bruges af andre applikationer blive gemt. Derudover vil den også indeholde meta-data(information om den information, der er gemt i assembly’en) og andre forskellige ressourcer, dette kan fx. være billeder. Meta-dataene gør, at assemblies er fuldstændig selvbeskrivende. For at køre applikationer behøver vi ikke anden information end den der står i assembly’en og dermed undgår vi at applikationerne ”chrasher” fordi den krævede information ikke er blevet tilføjet til registreringsdatabasen. Nu kan du mange gange nøjes med at kopiere applikationen til en computer, og køre exe-filen fra biblioteket (hvis .NET er installeret). Nogle gange skriver du også kode, som kan bruges af flere applikationer. Så kan du placere denne kode i Global Assembly Cache(GAC). Dette gøre meget nemt ved at placere assembly’en med koden i den mappe, som indeholder GAC’en

Managed Code Når din koden er kompileret til MSIL og en JIT-kompiler har kompilet den til native kode, er CLR’en rollen ikke udspillet. Koden bliver nemlig managed af CLR’en når den eksekveres (normalt kaldet runtime). Dvs. At CLR’en ”holder øje” med applikationen, styrer memory og sikkerheden, den tillader cross-language debugging osv. Koden som ikke kører under .Net kaldes unmanaged, det betyder at udvikleren selv at huske at frigive ressourcer, når de ikke længere er krævet at applikationen.

Garbage Collection Før .Net skulle udvikleren selv huske at frigive memory, når applikationen ikke længere skal bruge den. Dette gør Garbage Collection for dig i .NET. Garbage Collectionen inspicere din memory på computeren med mellemrum, og fjerner alt fra memoryen som ikke længere er i brug. Du bør dog stadig selv frigive hukommelsen, når du ikke længere skal bruge den.

Page 10: Sonne Huse

Programmering med C#

Side 10 af 107 sider

Hvordan passer det sammen? Her er en grafisk fremstilling af hvordan det hele passer sammen:

En applikation skrevet i C#

Koden er

kompileret til MSIL og gemmes i en assembly.

Når koden eksekveres bliver den først kompileret til klientens native kode via JIT kompileren

System Runtime

Den native kode bliver eksekveret indeni CLR (managed)

.NET CLR

C# kode

C# Applikation kode Kompilering

Assembly

Assembly

JIT Kompilering Native kode

Native kode

Native kode

Native kode

Page 11: Sonne Huse

Programmering med C#

Side 11 af 107 sider

Hvordan skriver du et C# program Konsol applikationer, Windows Forms og Web Forms applikationer er 3 typer af applikationer. Vi gemmer Web Forms til senere og kigger først på konsol applikationer.

Opret nyt project – konsol. Vælg Create Project

↓ Vælg Project types → Visual C# → Console Application

↓ Navngiv applicationen MyFirstApp

↓ Klik OK

1. Find linjen static void Main(string[] args)

2. Placer cursoren i næste linje efter { og lav et linjeskift

3. Skriv på den nye tomme line: Console.WriteLine("Dette er min første application – hvor er

jeg dygtig!");

4. Dobbeltklik i den grå margen i næste linje, således der kommer en rød cirkel i margen.

5. Tryk F5 for at køre applicationen.

6. Du ser nu et glimt af kommando-prompten og bagefter ligger den sig på statuslinjen. Klik på

kommando-prompten, så du kan se udbyttet af din programmering.

7. Den røde cirkel kaldes et Breakpoint, og når du indsætter dette, stopper din kode på det sted

hvor breakpointet er placeret og det giver dig mulighed for at kontrollere din kode løbende.

Page 12: Sonne Huse

Programmering med C#

Side 12 af 107 sider

Dette er din første kode, og som du kan se, afsluttes hvert Statement med et semikolon. Prøv at slette kolonet efter parentesen og kør applikationen igen. Nu får du en fejl i dit output-vindue, som henviser til nogle linjenumre Men der er ingen linjenumre i dit kodevindue. Det kan du dog få frem ved at

Nu har du fået linjenumre på dine linjer og det er nemmere at finde den rigtige linje. Sæt nu semikolonet tilbage og kør applikationen igen.

Windows Form Opret et nyt project, vælg Windows Form denne gang og placer det samme sted som før. Det skal hedde ”MyFirstWindow”. Du har nu en form fremme på skærmen istedet for kodevindue som du havde før. Du kan nu trække en Button ind på formen fra din Toolbox. Dobbeltklik på din button, og du kommer automatisk over i kodevinduet. Indtast mellem { } MessageBox.Show(”Yes – jeg kan også lave windows programmer”); Kør din applikation. Du får nu en formular med en knap med teksten button1. Test applikationen ved at klikke på knappen. Det ser ikke så smart ud med den tekst på knappen, så det skal vi ændre. Luk først din formular, så du kommer tilbage til VS. Vælg design View og marker knappen. I dit property-window kan du nu ændre egenskaberne for din knap. Find egenskal text og skriv ”Tryk på mig” i stedet for Button1. Kør applikationen igen. Prøv bagefter om du kan finde ”Tryk på mig” i Code View

Menuen Tools

Options

Text Editor

C#Under C# - General sæt flueben i

Line numbers

Page 13: Sonne Huse

Programmering med C#

Side 13 af 107 sider

Variables and Expressions En af de vigtigste ting i ethvert programmeringssprog er muligheden for at gemme information fra en kommando til den næste. For at kunne gøre det har vi behov for Variabler. Variabler giver mulighed for at få tilgang til et område i hukommelsen, hvor vi kan gemme information, og derefter bruge og genbruge denne information. C# er det vi kalder et ”strongly typed” programmeringssprog, d.v.s. at alle variabler vil have en tilhørende datatype. På denne måde holder C# styr på, hvordan det skal håndtere variablen.

Basic C# syntaks Når du skriver C# kode skal du ikke tage hensyn til White Space, som simpelthen bliver overset af kompileren. White Spaces er flere mellemrum, nye linjer, indrykninger mm. Dette gør at du kan skrive din kode, så det bliver lettere at læse. Hvert statement bliver nemlig afsluttet med et semikolon, så kompileren ved selv, hvor dit statement slutter. Desuden er C# struktureret i blokke, som er adskilt af { }, som dog ikke skal have semikolon. Indenfor disse tuborgklammer skriver du koden, og her kan du lave indrykninger m.m. for at lette læsbarheden. Når du skriver din kode, skal du også huske at kommentere den. Dette gør det nemmere for dig at vende tilbage til koden og hurtigt overskue hvad den specifikke kode gør. C# er case-sentive. Dvs. At den er følsom overfor store og små bogstaver.

Hvad er en variabel? En variabel er en reference til et område i hukommelsen. Dette område bliver sat af til vores variabel i det øjeblik, vi erklærer variablen. Variablen indeholder rent faktisk ikke informationen, den henviser blot til det sted, hvor informationen findes.

Declaration Før vi kan bruge en variabel, skal vi erklære den først. Samtidig med vi erklærer den, skal vi fortælle hvilken type variabel det er. Hvis du ikke erklærer variablen, vil programmet generere en fejl. Her er et eksempel på en erklæring af en variabel

string BilType;

Biltype = ”Mercedes”;

eller hvis du ønsker at holde det på 1 linje, kan du gøre det:

string Biltype = ”Mercedes”;

Du kan også erklære flere variabler af samme type på samme linje:

string Biltype, CykelType, KnallertType

BilType = ”Mercedes”;

CykelType = ”Winther”;

Page 14: Sonne Huse

Programmering med C#

Side 14 af 107 sider

KnallertType = ”Kreidler”;

Eller

string BilType= ”Mercedes”, CykelType = ”Winther”, KnallertType =

”Kreidler”;

Hvor du både erklærer og tildeler værdier til flere variabler på samme linje. Hver variabel med tilhørende værdi er adskilt af et komma. Prøv at lave en ny konsol applikation. Navngiv den MyVariable. Indtast mellem tuborgklammerne

{

int myAge;

string myName;

myAge = 17;

myName = "Mai-Britt";

Console.WriteLine("Mit navn er {0}, og jeg er {1} år

gammel.", myName, myAge);

}

Bemærk, at du her bruger {0} og {1}, dette er blot pladsholdere for dine variabler, som du skriver senere i parentesen. Bemærk også at tekst altid skrives i ” ”.

Data Types Der er 2 kategorier af data typer i C#. Den ene kaldes ”value-types”, og den anden ”reference-types”. Forskellen ligger i, hvordan de gemmes i hukommelsen. ”Value-types” gemmes på stack’en, som er mellemlager for et program eller et operativsystem; det er et særligt område i RAM, hvor parametre til procedurer og andre vitale data bliver registreret efter LIFO-princippet. På stack’en kan du gemmes variabler af en ”fixed” længde, og det er netop hvad value-types er (fx. tal eller boolean-værdier). Heap er det område, hvor dataområder kan allokeres. Heapmanageren er et memory booking system, hvor data kan reserveres, når det skal bruges og reservationen skal ligeledes fjernes, når hukommelsen ikke længere skal bruges. Her kan du gemme de variabler, som du ikke kender størrelsen på, som fx. en string, et array eller lign. Du kan her se et skema over de forskellige kategorier.

Value types Reference types Numeric String Character Arrays Boolean Classes Structures Interfaces

Page 15: Sonne Huse

Programmering med C#

Side 15 af 107 sider

Enumerations Objects

Numeric types Der findes 2 hovedgrupper af numeriske typer:

• Integer • Floating Points

Indenfor disse 2 kategorier findes der et utal af undertyper. Integer Her kan nævnes int, som er meget brugt. Hvis du erklærer en int, kan du definere et heltal mellem –2.147.483.648 og +2.147.483.647, og det kaldes også en ”32-bit signed integer” pga. det stykke af hukommelsen, som sættes af til denne variable. En anden type er byte, som er ”8-bit unsigned integer”, som kan have værdien fra 0 – 255. Floating point Der findes kun 3 typer af floating point; float, som er ”32-bit singleprecision floating point”, double som er ”64 double precision floating point” og tilsidst decimal, som er den mest præcise, nemlig ”128-bit high precision decimal notatation”. Decimal accepterer decimal-tal med op til 28 decimaler.

Character Data Types. Der er 2 hovedgrupper hvori du kan gemme karakter-data, char og string. string String kan indeholde alt som du ønsker gemt som tekst, d.v.s. bogstaver, tal, datoer mm. strings skal være i ”dobbelte gåseøjne”. Det er ikke muligt at udføre beregninger på strings, men du kan ”lægge” strings sammen, d.v.s du tilføjer en string til slutningen af en anden string. Dette kaldes også concatenation. char Denne type er lidt speciel, den gemmer et bogstav som et ”tal”. D.v.s at bogstavet gemmes med sin Unicode værdi eller hex-værdi. Til forskel fra string skal værdien i en char være i ’enkelte gåseøjne’. Escape Sequences Alle typer af character data kan gemmes i en string, også fx. et linjeskift mm. For at kunne bruge disse, skal du bruge escape sequences i din kode. Hvis du fx. vil have en ny linje skriver du

\n

dette medfører også at du er nødt til at bruge en speciel escape sequence for at skrive en backslash, så skal du nemlig skrive 2 backslashes

\\

Page 16: Sonne Huse

Programmering med C#

Side 16 af 107 sider

Det vil sige, at skal du skrive en sti til fil-systemet skal du faktisk skrive således: “C:\\CSharp\\minfil.aspx”

Hvis du ikke vælger at benytte et præfiks, @”C:\ CSharp\minfil.aspx”

Boolean Type Du kan også erklære en boolean type, det gør du på denne made:

bool kursist = true;

En boolean type kan antage værdien true eller false

Navngivning af variabler Husk at give dine variabler et sigende navn. Et variable navn skal starte med bogstav, og det må ikke indeholde mellemrum eller punktummer. Det anbefales ikke at benytte tegn/symboler i variabelnavne. Case Issues C# er case-sentive, det kan du udnytte når du navngiver dine variabler. Her er nogle retningslinjer:

1. Simple Variabler, som kun kan tilgåes fra C# bør benytte Camel case, som begynder med Lille begyndelsesbogstav, og “ordet i ordet” begynder med Stort.

timeStart, bogTitel

2. Mere komplekse variabler navngives med Pascal case. Dvs. de starter med Stort begyndelsesbogstav og “ordet i ordet” starter også med stort.

TimeStart, BogTitel

3. Det er tilladt at bruge underscore, men det anbefales ikke. Det er også dårlig programmeringskik kun at bruge STORE bogstaver.

4. Brug ikke keyword fra C# til variabel navne.

Expressions Variabler er mest sjove, når du kan manipulere med dem. Til det bruger vi operatorer og på denne måde skaber vi expressions. Der findes 3 typer af operatorer:

• Unary ,som har en operand. Fx o var1 = +var2 (var1 får værdien var2) o var1 = -var2 (var1 får værdien -var2) o var1 = ++var2 (var1 får værdien af var2 +1) o var1 = --var2 (var1 får værdien af var2 -1) o var1 = var2++ (var1 får værdien af var2 +1) o var1 = var2-- (var1 får værdien af var2 --1)

Bemærk de 2 sidste eksempler. De ligner de foregående, men operatorernes placering får betydning, når de bruges sammen med andre operatorer. I det sidste eksempel se her:

Int var1, var2=3, var3=7;

Page 17: Sonne Huse

Programmering med C#

Side 17 af 107 sider

Var1 = --var2 * ++var3

Her bliver resultatet 15, fordi de foranstående operatorer køres før du ganger, og de bagvedstående først køres efter udregningen er afsluttet.

• Binary har 2 operander o Var1 = var2 + var3 o Var1 = var2 - var3 o Var1 = var2 * var3 o Var1 = var2 / var3 o Var1 = var2 % var3

Den eneste Binary operand du kan bruge sammen med tekst er +.

Namespaces. Namespaces bruges til at opdele koden i kategorier. Der findes et utal af indbyggede namespaces i .Net. Når du skriver using System; øverst på dine kodesider, henviser du til det øverste namespace. Se flere i ClassBrowseren. C# koden ligger standard i det globale namespace, og derfor behøver du ikke henvise til dette namespace i din kode. Men vil du have fat i kode fra et andet namespace, kan du enten starte med et using statement øverst på siden, som med using system, eller du kan bruge et qualified Name. Et qualified navn indeholder alt den hierakiske information som kompileren behøver for at finde koden i .NET.

Øvelse 1 – brug af simple variabler Formålet med denne opgave er at oprette 2 variabler, en string og en int. Du skal give variablerne indhold og derefter udskrive variablerne på skærmen. String-variablen skal stå i parenteser på skærmen – til det skal du bruge en escape karakter. Du skal bruge pladsholdere i din Console.WriteLine. Prøv selv eller kig på koden: Opret en ny konsol-applikation, indskriv: using System; namespace DigitalMedie { class Class1 { static void Main() { int myInteger; string myString; myInteger = 17; myString = "\"myInteger\" is"; Console.WriteLine("{0} {1}.", myString, myInteger); } } }

Page 18: Sonne Huse

Programmering med C#

Side 18 af 107 sider

Her kan du se at \ bruges som en ”escape” karakter, hvilket her betyder at man kan bruge ” indeni en tekststreng.

Øvelse 2 Formål: afprøvning af regneoperatorer – Skriv 2 tal på skærmen og dit navn – afprøv addition, subtraktion, multiplikation og division og udskriv resultatet og navnet på skærm. Prøv selv eller brug nedenstående kode

Opret ny konsol applikation og afprøv hvor regnearterne kan bruge i programmeringen:

using System; namespace DigitalMedia { class Class1 { static void Main() { double firstNumber, secondNumber; string userName; Console.WriteLine("Enter your name:"); userName = Console.ReadLine(); Console.WriteLine("Welcome {0}!", userName); Console.WriteLine("Now give me a number:"); firstNumber = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Now give me another number:"); secondNumber = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("The sum of {0} and {1} is {2}.", firstNumber, secondNumber, firstNumber + secondNumber); Console.WriteLine("The result of subtracting {0} from {1} is {2}.", secondNumber, firstNumber, firstNumber - secondNumber); Console.WriteLine("The product of {0} and {1} is {2}.", firstNumber, secondNumber, firstNumber * secondNumber); Console.WriteLine("The result of dividing {0} by {1} is {2}.", firstNumber, secondNumber, firstNumber / secondNumber); Console.WriteLine("The remainder after dividing {0} by {1} is {2}.", firstNumber, secondNumber, firstNumber % secondNumber); } } }

Øvelse 3 Namespace Formål: brug af flere namespaces. Opret en konsolapplikation med 2 namespaces. I det første namespace skal du lave en funktion som skal udskrive en tekst på skærmen. I det andet namespace skal du kalde den første funktion og få teksten udskrevet. Prøv selv eller brug nedenstående kode.

namespace MitS { using System; namespace MySpace { // nested namespace

Page 19: Sonne Huse

Programmering med C#

Side 19 af 107 sider

namespace tutorial { class myExample1 { public static void myPrint1() { Console.WriteLine("First Example of calling another namespace member."); } } } // Program start class class NamespaceCalling { // Main begins program execution. public static void Main() { // Write to console tutorial.myExample1.myPrint1(); tutorial.myExample2.myPrint2(); Console.ReadLine(); } } } // same namespace as nested namespace above namespace MySpace.tutorial { class myExample2 { public static void myPrint2() { Console.WriteLine("Second Example of calling another namespace member."); } } }

}

Question 1 Hvordan kan vi referere til navnet great fra koden i namespacet fabulous?

namespace fabulous { // code in fabulous namespace } namespace super {

namespace smashing

{ // great name defined } }

Page 20: Sonne Huse

Programmering med C#

Side 20 af 107 sider

Answer

Question 2 Hvilket af følgende er ikke et legalt variable navn: a) myVariableIsGood b) 99Flake c) _floor d) time2GetJiggyWidIt Answer

Question 3 Er denne tekststreng for stor til at blive brugt I en string variable "supercalifragilisticexpialidocious” Begrund Answer

Question 4 Hvilke operatorer prioriteres højest?, Omskriv koden med den højeste prioritet først:

resultVar += var1 * var2 + var3 << var4 / var5;

Answer

Question 4 Skriv en konsol applikation der modtager 4 int værdier fra brugeren og derefter viser produktet af disse værdier. Answer

Page 21: Sonne Huse

Programmering med C#

Side 21 af 107 sider

Flow Control

Der findes 2 måder, som kode kan afvikles på, nemlig • Branching.

Koden afvikles løbende linje for linje afhængig af fx. if-sætninger. • Looping

Koden gentages et givent antal gange.

Boolean Bool-typen bruges til sammenligning og kan tage værdien ”true” eller ”false”. Til det bruger vi nogle operatorer, som disse: Først erklære vi nogle variabler

int sol = 6;

int storm = 9;

int regn =1;

== sol= storm =

= regn

”true” hvis storm og regn er ens

!= sol= storm !=

regn

”true” hvis storm er forskellig

fra regn

< sol= storm <

regn

”true” hvis storm er mindre end

regn

> sol= storm

>regn

”true” hvis storm er større end

regn

<= sol= storm <=

regn

”true” hvis storm er mindre end

eller lig med regn

>= sol= storm >=

regn

”true” hvis storm er større end

eller lig med regn

Vi kan også bruge disse operatorer sammen med tal:

storm > 10;

dette statement returnerer værdien ”true” hvis storm er større end 10. Vi kan også bruge andre typer som fx string

vejr = = ”dejligt”

Page 22: Sonne Huse

Programmering med C#

Side 22 af 107 sider

Vi kan også bruge disse operatorer ! sol =! storm returnerer værdien ”true” hvis storm er falsk – svarer til NOT & sol = storm & regn returnerer værdien ”true” hvis både storm og regn

har værdien sand | sol = storm | regn returnerer værdien ”true” hvis storm eller regn

eller begge er sande ^ sol = storm ^ regn returnerer værdien ”true” hvis enten storm eller

regn er sand – men ikke begge Og så har vi de 2 sidste: && sol = storm && regn returnerer værdien ”true” hvis både storm og regn

har værdien sand || sol = storm | regn returnerer værdien ”true” hvis storm eller regn

eller begge er sande. Disse 2 er umiddelbart magen til & og |, men bedømmes anderledes. Hvis den første værdi er falsk stopper testen, da der ikke er grund til at fortsætte. Dette giver en bedre performance.

& = sol &= storm returnerer værdien ”true” hvis sol = sol + storm

Typer af statements Vi vil nu se på 3 typer af statements, nemlig

• Selection statements fx. if og switch,

• Iteration statements fx. while, do, for og foreach

• Jump statements fx. goto, break og continue

Ternary Operator string oldCar = "Mercedes";

string myCar=(oldCar=="Mercedes" ? "God Bil" : "Sådan noget skrammel");

Console.WriteLine("{0}", myCar);

Her kommer du med et udsagn, hvis det returnerer true, vil det første udsagn skrives i prompten ellers skrives det andet udsagn. Men denne metode kan du kun bruge, hvis du har 2 muligheder. hvis der er flere muligheder, må du kigge dig om efter andre muligheder

Selection statements Laver valg ud fra værdien af udsagn og eksekverer statements baseret på disse valg. Syntaksen på if ser sådan ud:

Page 23: Sonne Huse

Programmering med C#

Side 23 af 107 sider

if (minut = = 60) {

minut = 0;

time ++;

}

Eller hvis vi har 2 kriterier:

if (minut = = 60) {

minut = 0;

time ++;

}

else

{

Console.WriteLine”Prøv igen, når klokken er hel”;

}

Vi kan også indlejre if-sætninger

if (procent >= 0 && procent <= 100

{

if (procent > 50)

{

Console.WriteLine(”Pas”);

}

else

{

Console.WriteLine(”Fejl skriv et tal over

50”);

}

}

Som det fremgår af min skrivemåde vil ”else” binde til det nærmeste if. Hvis du ønsker det skal binde til det første if, skal du bruge en blok, som denne

if (procent >= 0 && procent <= 100

{

if (procent > 50)

{

Console.WriteLine(”OK”);

Page 24: Sonne Huse

Programmering med C#

Side 24 af 107 sider

}

else

{

Console.WriteLine(”Fejl skriv et tal over

50”);

}

}

Switch I stedet for at bruge indlejrede if- sætninger kan du bruge switch statements. Et switch statement består af flere case-blokke som hver specificerer en enkelt konstant og en case label. Hver case label skal være unik.

switch (statement)

{

case mulighed1:

Kode;

break;

case mulighed2

Kode;

break;

default:

kode;

break;

}

Eksekvering af switch statement 1. Hvis en konstant på en case label er lig med værdien af switch udsagnet, overgår kontrollen til

det statement som er i den case label. 2. Hvis der ikke er en matchende case label, vil kontrollen gå til default label. 3. Hvis der heller ikke er en default label, går kontrollen til enden af switch-statementet. Se følgende eksempel:

string uddannelse;

Console.WriteLine("Indtast din uddannelse enten web-integrator,

multimedia-integrator eller multimedia-animator");

uddannelse=Console.ReadLine(); ;

switch (uddannelse)

{

Page 25: Sonne Huse

Programmering med C#

Side 25 af 107 sider

case "web-integrator":

Console.WriteLine("Du vil være web-

integrator");

break;

case "multimedia-integrator":

Console.WriteLine("Du vil være web-

integrator");

break;

case "multimedia-animator":

Console.WriteLine("Du vil være multimedia-

animator");

break;

default:

Console.WriteLine("ukendt uddannelse");

break;

Vi kan også bruge GOTO i et switch statement:

int grade;

Console.WriteLine("indtast din karakter");

try

{

grade = int.Parse(Console.ReadLine());

switch (grade)

{

case 0:

Console.WriteLine("Du skal læse noget mere -

ikke bestået");

break;

case 1:

goto default;

case 2:

Console.WriteLine("Du skal læse noget mere men

bestået");

break;

Page 26: Sonne Huse

Programmering med C#

Side 26 af 107 sider

case 3:

goto default;

case 4:

Console.WriteLine("Den jævne præstation");

break;

case 5:

goto default;

case 6:

goto default;

case 7:

Console.WriteLine("Den gode præstation");

break;

case 10:

Console.WriteLine("Den fortrindelige

præstation");

break;

case 12:

Console.WriteLine("Den fremragende

præstation");

break;

default:

Console.WriteLine("Prøv at køre applikationen

igen - denne gang med den korrekte karakter...");

break;

}

}

catch

{

Console.WriteLine("Du skal indtaste en karakter - et

tal...");

}

Console.ReadLine();

Looping - Iteration statements while, do/while, for og foreach.

Page 27: Sonne Huse

Programmering med C#

Side 27 af 107 sider

While statement Er den mest simple form for looping. Så længe et boolean udsagn er sandt, vil while-loopet køre. Udsagnet står altid i begyndelsen af while-statementet, og eksekveringen kører så længe udsagnet er ”true”, det kan derfor være at det indlejrede statement aldrig eksekveres. Her har vi et eksempel på et while statement

while (i < 10)

Console.WriteLine(”i++”);

Når jeg bruger indlejrede statements på denne måde, behøver jeg ikke tuborg-klammer. Men det anbefales at bruge dem alligevel, og så vil det se sådan ud:

int i=0;

while (i < 10) {

Console.WriteLine(i++);

}

Console.ReadLine();

Do statement Et do statement hører altid sammen med et while statement, og bruges på denne måde:

int i = 0

do {

Console.WriteLine( i );

i++;

} while (i < 10 );

Et do/while statement vil altid køre minimum 1 gang

For statement Når du bruger while statement, kan du nemt glemme at opdatere din variabel. For at undgå dette kan du bruge i stedet bruge et for statement. Og den følger denne syntaks

for ( initializer; kriterie, opdatering)

indlejret statement

Her ser vi et eksempel på det

for (int i = 0; i < 10; i++) {

Console.WriteLine(”{0}”, i);

Page 28: Sonne Huse

Programmering med C#

Side 28 af 107 sider

}

Foreach statement Det sker ofte at der er brug for at gennemløbe en liste af elementer. Der bruger du et foreach statement.

foreach (string s in minKollektion)

{

Console.WriteLine(“tekststrengen er {0}”, s);

}

Du laver en midlertidig variabel s i din kode, som indeholder hver element fra din kollektion på skift.

Jump Statement Der findes 2 jump statement. Den første er goto som flytter kontrollen til et navngivet element. Det anbefales kun til brug i switch-statement og hvis du har brug for at flytte kontrollen udenfor et indlejret loop Continue er det andet jump statement. Det findes sammen med switch, while, do, for eller foreach. Continue genoptager et loop.

int i = 0,

while (true){

Console.WriteLine( i );

i++;

if (i < 10)

continue;

else

break;

}

Øvelse 1 – brug af Boolean Formål: Afprøvning af Boolean. Du skal hente en int fra skærmen og teste om den er mindre end

10. Dette skal udskrives til skærmen. Dernæst skal du test om den er større end eller lig med 0 og mindre end eller lig med 5. Prøv selv eller se nedenstående kode.

Opret en ny konsol-applikation, indskriv i Main: Console.WriteLine("Enter an integer:");

int myInt = Convert.ToInt32 (Console.ReadLine()); Console.WriteLine("Integer less than 10? {0}", myInt < 10);

Page 29: Sonne Huse

Programmering med C#

Side 29 af 107 sider

Console.WriteLine("Integer between 0 and 5? {0}", (0 <= myInt) && (myInt <= 5)); Console.ReadLine();

Hvis den indtastede int er mindre end 10, vil bliver der returneret true i den første linie. Dernæst tester vi om tallet er større end eller lig med 0, hvis dette er sandt testes anden del af udsagnet også, altså om tallet er mindre end eller lig med 5

Øvelse 2 – brug af if I denne applikation skal du have en string variablen. Du skal sammenligne 2 int-variabler, som skal indtaste via skærmen og udskrive på skærmen om det første tal er mindre end, lig med eller større end det andet tal. Dette skal du gøre vha if- else statements. Prøv selv først. Opret ny konsol applikation og skriv i Main:

string comparison; Console.WriteLine("Enter a number:"); double var1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Enter another number:"); double var2 = Convert.ToDouble(Console.ReadLine()); if (var1 < var2) comparison = "less than"; else { if (var1 == var2) comparison = "equal to"; else comparison = "greater than"; } Console.WriteLine("The first number is {0} the second number.",

comparison); Console.ReadLine();

Øvelse 3 – brug af switch Opret 3 konstant string-variabler med 3 forskellige navne. Hent et navn fra brugeren og test det med et switch-statement. Opret ny konsol applikation og skriv i Main

const string myName = "lene";

const string sexyName = "gorm"; const string sillyName = "fuzzy"; string name; Console.WriteLine("What is your name?"); name = Console.ReadLine(); switch (name.ToLower ()) { case myName: Console.WriteLine("You have the same name as me!"); break; case sexyName: Console.WriteLine("My, what a sexy name you have!"); break;

Page 30: Sonne Huse

Programmering med C#

Side 30 af 107 sider

case sillyName: Console.WriteLine("That's a very silly name."); break; }

Console.WriteLine("Hello {0}!", name); Console.ReadLine();

Da vi erklærede vores string variabler, brugte vi et keyword const foran variabeltypen. Dette gør at værdien af variablen altid vil være den samme og den kan ikke ændres. Inden vi tester det indtastede navn, laver vi det om til små bogstaver med metoden ToLower, hvilket er en indbygget metode, som konverterer navnet til små bogstaver, hvilket gør at alle skrivemåder testes, fx Marianne, marianne og Marianne

Øvelse 4 – brug af do Loops Opret ny konsol applikation og skriv i Main

double balance, interestRate, targetBalance; Console.WriteLine("Hvor stor er saldoen på din opsparing?"); balance = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Hvad får du I rente på din opsparing (i %)?"); interestRate = 1 + Convert.ToDouble(Console.ReadLine()) / 100.0; Console.WriteLine("Hvor stor skal din opsparing være?"); targetBalance = Convert.ToDouble(Console.ReadLine()); int totalYears = 0; do { balance *= interestRate; ++totalYears; } while (balance < targetBalance); Console.WriteLine("Om {0} år{1} har du opnået dit mål med en saldo på {2}.", totalYears, totalYears == 1 ? "" : "s", balance); Console.ReadLine(); Test applikationen både med en større slutsaldo end startsaldo og omvendt. Hvis du indtaster en slutsaldo der er mindre en din startsaldo vil dit loop stadig køre minimum én gang, hvilket i dette tilfælde giver et forkert resultat

Øvelse 5 – brug af while Loops Opret ny konsol applikation og skriv i Main double balance, interestRate, targetBalance; Console.WriteLine("stor er saldoen på din opsparing?"); balance = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Hvad får du I rente på din opsparing (i %)?"); interestRate = 1 + Convert.ToDouble(Console.ReadLine()) / 100.0; Console.WriteLine("Hvor stor skal din opsparing være?"); do {

Page 31: Sonne Huse

Programmering med C#

Side 31 af 107 sider

targetBalance = Convert.ToDouble(Console.ReadLine()); if (targetBalance <= balance) Console.WriteLine("Du skal indtaste et tal større end " + "din nuværende saldo!\nVær venlig at indtaste et nyt tal."); } while (targetBalance <= balance); int totalYears = 0; while (balance < targetBalance) { balance *= interestRate; ++totalYears; } Console.WriteLine("Om {0} år{1} har du opnået en saldo på {2}.", totalYears, totalYears == 1 ? "" : "s", balance); Console.ReadLine(); Her tester du først værdierne og hvis slutsaldoen er mindre en startsaldoen, bliver du bedt om at indtaste en ny slutsaldo. Dette løser dit problem fra forrige øvelse

Øvelse 6 – Foreach – og DirectoryInfo Formål: I denne øvelse skal du prøve at udskriv filnavne fra et bestemt bibliotek. Allerførst skal du tilføje et using System.IO; i starten af din cs-fil (IO står for Input/Output). Indtast i Main():

DirectoryInfo mappe = new DirectoryInfo(@"c:\windows"); Console.WriteLine("Filnavn Størrelse\n__________________________"); foreach (FileInfo Fil in mappe.GetFiles("*.txt")) { Console.WriteLine("{0} {1}", Fil.Name.PadRight(10), Fil.Length.ToString("n0").PadLeft(12)); } Console.ReadLine();

Question If we have two integers stored in variables var1 and var2, what Boolean test can we perform to see if one or the other of them (but not both) is greater than 10?

Page 32: Sonne Huse

Programmering med C#

Side 32 af 107 sider

Answer

Question Write an application that includes the logic from Exercise 1, that obtains two numbers from the user and displays them, but rejects any input where both numbers are greater than 10 and asks for two new numbers. Answer Question What is wrong with the following code?

int i; for (i = 1; i <= 10; i++) { if ((i % 2) = 0) continue; Console.WriteLine(i); }

Answer

Page 33: Sonne Huse

Programmering med C#

Side 33 af 107 sider

Converting Between Data Types Når vi taler om variabler i C#, kan vi konvertere fra en datatype til en anden. Det findes der 2 muligheder for implicitte og eksplicitte konverteringer. De implicitte konverteringer er dem som altid kan lade sig gøre uden tab af data, som fx short kan konverteres til int. Det kan lade sig gøre fordi short’s værdi-område er en delmængde af int’s værdi-område.

Implicit Vil aldrig fejle – den kan miste lidt i præcision, men ikke i størrelse (dvs ingen tab af info) Her er et eksempel:

int intValue = 123;

long longValue = intValue;

Console.WriteLine(longValue);

Dette kan lade sig gøre uden problemer, fordi int ligger indenfor long’s værdiområde. Datatype Implicit konvertering til byte ushort, short, uint, int, ulong, float, double,

decimal ushort uint, int, ulong, long, float, double, decimal short int, long, float, double, decimal uint ulong, long, float, double, decimal int long, float, double decimal ulong float, double, decimal long float, double, decimal float double char ushort, uint, int, ulong, long, float, double,

decimal

Explicit Data Type Conversion Hvis vi ønsker at tvinge en konvertering igennem mellem 2 datatyper, som ikke umiddelbart er kompatible, er vi nødt til at bruge explicit konvertering. En eksplicit konvertering kan resultere i en værdi, som er forskellig fra den originale.

uint value1 = 312;

byte value2 = (byte)value1;

Console.WriteLine(value2);

Hvis den nye værdi er forskellig fra den gamle, kan vi få et problem. For at forhindre dette kan vi kontrollere resultatet af konverteringen med en check blok, som her:

uint value1 = 312;

Page 34: Sonne Huse

Programmering med C#

Side 34 af 107 sider

byte value2 = checked((byte) value1);

Console.WriteLine(value2);

Dette vil udløse en fejlmeddelse med ”System Overflow”. Du kan også få datatypen konverteret uden hensyntagen til om du mister data. Det gør du med unchecked.

uint value1 = 312;

byte value2 = unchecked((byte) value1);

Console.WriteLine(value2);

Vi kan også konverter ved hjælp af Convert kommandoen. Syntaksen er således

Convert.ToByte();

Convert.ToChar();

Convert.ToDateTime();

Convert.ToDecimal();

Convert.ToDouble( );

Convert.ToInt32();

Convert.ToSingle(); Konverterer til en float

Convert.ToString();

Her vil der altid, uanset hvad, blive checke for overflow. Bemærk at der er en lille forskel på Convert.To.datatyperne, og de datatyper, vi er vant til. Dette skyldes at de kommer fra Namespacet System i .Net-frameworket, istedet for at være c# kode.

Constants Hvis du ikke ønsker at din variabel kan ændre værdi, skal du erklære den som en constant, på denne måde

const int MinValue = 10;

int NyValue = 4;

MinValue = NyValue;

Console.WriteLine(MinValue);

Complex Variable Types Vi skal også kigge på 3 komplekse variabel typer, nemlig

• Enumerations • Structures • Arrays

Page 35: Sonne Huse

Programmering med C#

Side 35 af 107 sider

Enumerations Enumeratorer er nyttige, hvis en variabel kun kan antage et begrænset sæt værdier. Fx en kontrol som kun kan være én af 12 måneder, eller én ud af 4 kortfarver. Syntaksen er:

enum typenavn

{

værdi1,

værdi2,

værdi3

}

Disse værdier bliver automatisk tildelt ”value” som starter ved 0, dvs, du kan få fat i værdi1 ved at referere til 0. Men du kan overskrive disse standard values, ved at tildele dine egne på denne måde

enum kortfarver

{

spar = 1,

kloer = 2,

hjerter = 3,

ruder = 4

}

Enumerations gemmes automatisk som integers. Prøv at lave denne opgave:

using System;

namespace test

{

public class EnumTest

{

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu,

Fri};

public static void Main()

{

Page 36: Sonne Huse

Programmering med C#

Side 36 af 107 sider

int x = (int)Days.Sun;

int y = (int)Days.Fri;

Console.WriteLine("Sun = {0}",

x);

Console.WriteLine("Fri = {0}",

y);

}

}

}

Structures – structs Den næste form for variabler som vi kigger på er struct. Det er data-strukturer som er sammensat af flere data, som kan være forskellige typer. Ud fra denne struktur kan vi definere vores egne typer af variabler. Structs minder om klasser, men er værdibaseret (ligesom simple variabler), hvor klasser er referencebaseret. Du kan heller ikke nedarve fra struct.

using System;

struct MyStruct

{

public int x;

public int y;

}

class MyClient

{

public static void Main()

{

MyStruct ms = new MyStruct();

ms.x = 10;

ms.y = 20;

int sum = ms.x + ms.y;

Console.WriteLine("The sum is {0}",sum);

}

}

Bemærk du erklærer din struct udenfor din class, og indeni Main() initialiserer du den med KeyWordet new.

Page 37: Sonne Huse

Programmering med C#

Side 37 af 107 sider

Arrays Vi kan også bruge Arrays i C#. Arrays er en samling af variabler af samme type. og de erklæres med denne syntaks:

type [] arraynavn

eksempel

int [ ] mitArray = {2, 6, 9, 11};

C# arrays er objekter. Det betyder, at fordi du har erklæret et array, har du ikke lavet det. Efter det er erklæret, er du nødt til at initialisere det, dvs. bringe det til live. Det gøres med keywordet new

int [ ] mitArray = new int[5];

hvor vi fortæller der er 5 elementer i vore arrays. Vi kan også kombinere

int [ ] mitArray = new int[5] {2, 6, 9, 11, 22};

Arrays kan opdeles i 4 kategorier:

• single-dimensional arrays • multidimensional arrays or rectangular arrays • jagged arrays • mixed arrays

Single-dimensional arrays er den mest simple, som vi lige har set. Denne type er brugt til at gemme et antal data af en prædefineret type. Alle data i et single dimension array er gemt i en række, som starter ved 0. Arrays kan også være multidimensionelle, men det vil vi ikke kigge nærmere på her, da det kan være meget forvirrende på nuværende tidspunkt, før du er helt fortrolig med almindelige arrays. Men her ser du 2 eksempel på et multidimisionelt array

int[,] numbers = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };

string[,] names = new string[2, 2] { {"Rosy","Amy"},

{"Peter","Albert"} };

Jagged arrays kaldes ofte array of arrays.

int[][] numArray = new int[][] { new int[] {1,3,5}, new int[]

{2,4,6,8,10} };

Page 38: Sonne Huse

Programmering med C#

Side 38 af 107 sider

Mixed Arrays Mixed arrays er en kombination af multi-dimension arrays og jagged arrays. Lad os prøve at lave en opgave

using System;

namespace ArraysSamp

{

class Class1

{

static void Main(string[] args)

{

int[] intArray = new int[3];

intArray[0] = 3;

intArray[1] = 6;

intArray[2] = 9;

Console.WriteLine("================");

foreach (int i in intArray)

{

Console.WriteLine(i.ToString()

);

}

string[] strArray = new string[5]

{"Ronnie", "Jack", "Lori",

"Max", "Tricky"};

Console.WriteLine("================");

foreach( string str in strArray)

{

Console.WriteLine(str);

}

Console.WriteLine("================");

string[,] names = new string[,]

{

{"Rosy","Amy"},

Page 39: Sonne Huse

Programmering med C#

Side 39 af 107 sider

{"Peter","Albert"}

};

foreach( string str in names)

{

Console.WriteLine(str);

}

}

}

}

String Manipulation Du kan også manipulere med dine tekststrenge. Faktisk kan du betragt hver tekststreng som et array af char variabler. Det vil også sige, at du kan få tilgang til de enkelte karakterer på denne måde:

string myString ="en streng";

char myChar = myString[0];

Console.WriteLine(myChar);

Du kan også prøve med foreach

string myString ="en streng";

foreach (char karakter in myString)

{

Console.WriteLine("karakteren {0}\n", karakter);

}

eller hvis du ønsker at lave alle bogstaver til små bogstaver, kan du bruge myString.ToLower(). Som her

string myName ="Mai-Britt";

myName=myName.ToLower();

Console.WriteLine(myName);

Eller til store bogstaver med myName.ToUpper().

Page 40: Sonne Huse

Programmering med C#

Side 40 af 107 sider

Hvis du skal bruge et input fra en bruger, kan det forekommer at brugeren kommer til at lave et mellemrum før eller efter sin indtastning, og det kan lave koks i afviklingen af din kode. Fx. Ved validering af et password. For at fjerne overskydende mellemrum kan du bruge funktionen Trim()

string yourName;

Console.WriteLine("Indtast dit navn efterfulgt af mellemrum");

yourName=Console.ReadLine();

Console.WriteLine("t{0}t",yourName);

yourName = yourName.Trim();

Console.WriteLine("t{0}t",yourName);

Øvelse 1 – Convertering Formål: Afprøvning af forskellige konverteringer, skriv en forklaring på hver konvertering, så du får et overblik over hvad der sker. Opret en ny konsol-applikation, indskriv i Main: public static void Main() { short shortResult, shortVal = 4; int integerVal = 67; long longResult; float floatVal = 10.5F; double doubleResult, doubleVal = 99.999; string stringResult, stringVal = "17"; bool boolVal = true; Console.WriteLine("Eksempler på varibelkonversion\n"); doubleResult = floatVal * shortVal; Console.WriteLine("Implicit, -> double: {0} * {1} -> {2}", floatVal, shortVal, doubleResult); shortResult = (short)floatVal; Console.WriteLine("Explicit, -> short: {0} -> {1}", floatVal, shortResult); stringResult = Convert.ToString(boolVal) + Convert.ToString(doubleVal); Console.WriteLine("Explicit, -> string: \"{0}\" + \"{1}\" -> {2}", boolVal, doubleVal, stringResult); longResult = integerVal + Convert.ToInt64(stringVal); Console.WriteLine("Mixed, -> long: {0} + {1} -> {2}", integerVal, stringVal, longResult); Console.ReadLine(); }

Page 41: Sonne Huse

Programmering med C#

Side 41 af 107 sider

Det første du gør I denne kode er floatVal * shortVal. Der er ikke specificeret en explicit konvertering, så der vil blive brugt en implicit konvertering hvis det er muligt. I dette tilfælde vil der ske en konvertering fra short til float, da det modsatte vil kræve en explicit konvertering. Du kan lave en explicit konvertering med shortVal * (short)floatVal dette medfører dog ikke at resultatet kommer som en short – hvis resultatet overstiger 32767 vil resultatet sandsynligvis blive returneret som en int.

Øvelse 2 – Enumeration I denne øvelse skal du lave en enum, orientation, baseret på byte. Der skal være 4 værdier north, south, east og west. Dernæst skal du i Main lave en variabel baseret på din enum, der peger på north og dernæst udskrive den på skærmen. Indskriv koden using System; namespace TestEnum { enum orientation : byte { north = 1, south = 2, east = 3, west = 4 } class Class1 { public static void Main() { orientation myDirection = orientation.north; Console.WriteLine("myDirection = {0}", myDirection); Console.ReadLine(); } } } Test applikationen og forklar hvad den gør. Tilføj til koden og afprøv igen using System; namespace TestEnum { enum orientation : byte { north = 1, south = 2, east = 3, west = 4 } class Class1 {

Page 42: Sonne Huse

Programmering med C#

Side 42 af 107 sider

public static void Main() { byte directionByte; string directionString; orientation myDirection = orientation.north; Console.WriteLine("myDirection = {0}", myDirection); directionByte = (byte)myDirection; directionString = Convert.ToString(myDirection); Console.WriteLine("byte equivalent = {0}", directionByte); Console.WriteLine("string equivalent = {0}", directionString); Console.ReadLine(); } } }

Øvelse 3 - Struct Indskriv koden using System; namespace TestStruct { enum orientation : byte { north = 1, south = 2, east = 3, west = 4 } struct route { public orientation direction; public double distance; } class Class1 { static void Main() { route myRoute; int myDirection = -1; double myDistance; Console.WriteLine("1) North\n2) South\n3) East\n4) West"); do { Console.WriteLine("Select a direction:"); myDirection = Convert.ToInt32(Console.ReadLine()); } while ((myDirection < 1) || (myDirection > 4)); Console.WriteLine("Input a distance:"); myDistance = Convert.ToDouble(Console.ReadLine()); myRoute.direction = (orientation)myDirection; myRoute.distance = myDistance; Console.WriteLine("myRoute specifies a direction of {0} and a " + "distance of {1}", myRoute.direction, myRoute.distance); } }

Page 43: Sonne Huse

Programmering med C#

Side 43 af 107 sider

} Forklar koden

Øvelse 3 – Array Afprøv i Main() string[] friendNames = {"Robert Barwell", "Mike Parry", "Jeremy Beacock"}; int i; Console.WriteLine("Here are {0} of my friends:", friendNames.Length); for (i = 0; i < friendNames.Length; i++) { Console.WriteLine(friendNames[i]); } Console.ReadLine();

Her udskriver du hvert enkelt element i dit array – Dette kan dog nemt gå galt, prøv fx at ændre < til <= som nedenstående for (i = 0; i <= friendNames.Length; i++) { Console.WriteLine(friendNames[i]); } Dette giver følgende fejl: IndexOutOfRangeException betyder at du forsøger at få en værdi som ligger udenfor arrayets indhold. Der er 3 elementer i arrayet, og med <= forsøger vi at få element nr 4 i arrayet, og dette eksisterer ikke.

Question 1 Hvilke af følgende konvertering kan IKKE udføres implicit: a) int til short b) short til int c) bool til string d) byte til float

Answer

Page 44: Sonne Huse

Programmering med C#

Side 44 af 107 sider

Question 2 1. Will the following code compile? Why?

string[] blab = new string[5] string[5] = 5th string.

Answer

Question 3 Write a console application that accepts a string from the user and outputs a string with the characters in reverse order.

Answer

Question Write a console application that accepts a string and replaces all occurrences of the string "no" with "yes".

Answer static void Main(string[] args) { Console.WriteLine("Enter a string:"); string myString = Console.ReadLine(); myString = myString.Replace("no", "yes"); Console.WriteLine("Replaced \"no\" with \"yes\": {0}", myString); }

Question 4 Write a console application that places double quotes around each word in a string. Tip: Replace eller Split

Answer

Page 45: Sonne Huse

Programmering med C#

Side 45 af 107 sider

Funktioner Indtil nu har vi lavet kode-blokke, som blev kørt på det sted, hvor de er defineret. Men sommetider har vi brug for at køre den samme kodeblok flere steder i vores kode. Det har vi hidtil gjort ved at kopiere kodeblokken fra et sted til et andet, med det resultat at den samme kode optræder flere gange i samme fil. Det er ikke bare en besværlig måde, at gøre det på, det gør også din kode meget sværere at overskue. For at løse dette problem, kan du lave en funktion, som er en kodeblok, som du navngiver, og så kan du kalde den fra andre steder i din kode. Dvs. du kan pludselig genbruge kode... Funktions har også den fordel, at du kan bruge dem sammen med forskellige data. Du har også muligheden for at få en return-value tilbage fra din funktion, når du kører den. Nogle gange har du behov for at sende nogle værdier til din funktion, for at få den til at udføre en bestemt opgave. Hvis det er tilfældet, kan du sende parametere med, når du kalder din funktion. Sammen kaldes return-value og parametere for funktionens signature. En funktion defineres således

static void HelloWorld()

{

Console.WriteLine("Hello World - så fik du også

prøvet det...");

}

Bemærk brugen af keywords static, som vi kigger på senere og void. Void skal med, når du ikke ønsker at din function skal returnere en værdi. Det er tilfældet her, hvor vi kun ønsker at få udskrevet en tekst. Efter void navngiver du din function, her med HelloWorld, og afslutter med ( ). Hvis du ønsker værdier sendt til functionen skal der stå parametere inde i ( ). Det kommer vi til om lidt. Du skal også huske { }, det er her du definerer hvad din function skal gøre.

Return Values Den enkleste måde at udveksle data mellem 2 functions, er med return values. Hvis du ønsker din function skal have en return value, skal du udskifte Void, når du erklære functionen med datatypen på din return value. se eksempel:

static DateTime FindDueDate(DateTime CheckOutDate)

{

return CheckOutDate + TimeSpan.FromDays(14);

}

public static void Main()

{

DateTime DueDate;

Page 46: Sonne Huse

Programmering med C#

Side 46 af 107 sider

DateTime CheckOutDate;

CheckOutDate = DateTime.Now;

DueDate = FindDueDate(CheckOutDate);

Console.WriteLine("Du lånte bøgerne d. {0}", CheckOutDate);

Console.WriteLine("De skal afleveres senest d. {0}",

DueDate.ToString("d"));

}

Her kan du se at returntype skal være den samme i din funktion, som den function som kalder den. Her vil det sige at FindDueDate er af typen DateTime i både Main() og FindDueDate(). Hvis ikke det er samme datatype, skal det være type som kan klare en implicit konvertering. Hvis ikke vil kompileren generere en fejl. Bemærk, at du altid skal bruge keywordet return, når du ønsker en return value. Når du bruger en datatype i stedet for Void, skal funktionen returnere en værdi, ellers skal du bruge en void. I funktionen FindDueDate( ), er det også defineret at der skal medsendes en parameter, når functionen kaldes, nemlig CheckOutDate, som også er af typen DateTime. Hvis du har flere parametere, adskilles de af et komma.

Parameter Arrays I C# findes der også et speciel parameter for en funktion. Dette specielle parameter kaldes et parameter array, og det skal placeres til sidst i parameter-listen. Parameter Arrays lades os kalde en function med et variabelt antal parametre, og dette parameter erklæres med keywordet params.

static void MultiPrint(params string[] list)

{

for ( int i = 0 ; i < list.Length ; i++ )

Console.WriteLine(list[i]);

}

public static void Main()

{

MultiPrint("First", "Second", "Third");

Console.WriteLine("Kald af function 2. gang");

MultiPrint("Fourth");

Console.WriteLine("Kald af function 2. gang");

MultiPrint("Fifth", "Sixth");

}

Page 47: Sonne Huse

Programmering med C#

Side 47 af 107 sider

Reference og Value parametere Indtil nu har vi set funktion, som bruger value parametere. Dvs. at vi har kopieret værdien af en variabel ind i en funktion og brugt kopien i vores ”beregninger”. Derefter har vi sendt en return value tilbage til den kaldende funktion. Men i den kaldende funktion vil værdien i vores variabel ikke have ændret sig, fordi det kun var en kopi vi sendte

static void Increment(int Tal)

{

Tal++;

Console.WriteLine("tal fra Increment() = {0}", Tal);

}

static void Main()

{

int A = 1;

Increment(A);

Console.WriteLine("Tal fra Main() = {0}",

A.ToString());

}

Her kan du se at variablen i Main ikke ændre værdi. Prøv nu at lave den samme, men med en reference parameter, som vi definerer med keyword ref

static void Increment(ref int Tal)

{

Tal++;

Console.WriteLine("tal fra Increment() = {0}", Tal);

}

static void Main()

{

int A = 1;

Increment(ref A);

Console.WriteLine("Tal fra Main() = {0}",

A.ToString());

}

Nu kan du se at værdien i Main() ændrer sig, efter behandlingen i Increment(). Da en reference parameter kan ændre værdien i Main, må den parameter du sender til Increment ikke være en konstant. Desuden skal variablen være initialiseret. dvs. den skal indeholde en værdi.

Page 48: Sonne Huse

Programmering med C#

Side 48 af 107 sider

Variabel scope En variabel tilhører den blok, som den er erklæret i og kan kun bruges i denne blok. En sådan variabel siges at have local-scope. Hvis du har en variabel, som du skal bruge i flere funktioner, kan du erklære den, inden du begynder at skrive dine funktioner, så vil den have global-scope.

Main() Function Alle applikationer har et ”entry point” og i konsol- og windows applikationer, er Main() dette entry point. Den skal være der, og kan ikke udelades. Der er fire mulige signaturer for Main( ) functionen:

• static void Main( ) • static void Main(string [] args) • static int Main( ) • static int Main(string [] args)

Hvis du bruger VS vil den automatisk bruge mulighed nr. 2 med args. args gør at du kan bruge kommandoer fra prompten, når du kalder applikationen. Mulighed 3 og 4 returnerer en int, som fortæller hvordan applikationen afslutter. 0 fortæller at den afsluttede normalt og uden fejl. I web applikationer kan du sige at din default- eller indexside er et entry point, da din web-server bruger disse filer, som start-sider i browseren, hvis der skrive en web-adresse.

Struct Funktioner Vi har tidligere kigget på structs, men der kiggede vi kun på den kendsgerning at du kan gemme forskellige datatyper deri. Du kan også inkludere funktions indeni dine structs.

using System;

class StructFunc

{

struct BirthDay

{

public string Navn;

public string Born;

public string Birth()

{

return Navn +" "+ Born;

}

}

Page 49: Sonne Huse

Programmering med C#

Side 49 af 107 sider

static void Main()

{

BirthDay myBirthDay;

myBirthDay.Navn = "Mai-Britt";

myBirthDay.Born = "16/05/1965";

Console.WriteLine(myBirthDay.Birth());

}

}

Overloading funktioner Du kan også lave 2 funktioner med samme navn og indhold, men hvor signaturen er forskellig. Dvs. at du måske beder om en int return value i den ene og en long i den anden funktion. Når du så skal bruge en af funktionerne kaldes du bare funktionsnavnet og sender din parameter, så finder systemet selv ud af hvilken af dine funktioner den skal bruge

Øvelse 1 – Functions I denne øvelse skal du oprette en global variabel myString, dernæst skal du oprette en funktion ved navn Write, som ved navn myString og med indholdet ”String defineret i Write()”. I Main skal du ligeledes have en local variabel ved navn myString, som skal have indeholder ”String defineret i Main()”. Dit færdige resultat skal være således (du kan få hjælp efter dette skærmdump):

Page 50: Sonne Huse

Programmering med C#

Side 50 af 107 sider

Opret en ny konsol-applikation, indskriv i cs-filen using System; namespace Functions { class Class1 { static string myString; static void Write() { string myString = "String definered i Write()"; Console.WriteLine("Nu er du i Write()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Class1.myString); } static void Main(string[] args) { string myString = "String defineret i Main()"; Class1.myString = "Global string"; Write(); Console.WriteLine("\nNu i Main()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Class1.myString); } } } Dette er et eksempel hvor du kalder en funktion fra en anden. Du skal bemærke nøgleordet void, som fortæller at der ikke er en retur-værdi i denne funktion. Retur-værdier er den nemmeste måde at udveksle mellem funktioner.

Øvelse 2 – function med parameter Du skal lave en funktion MaxValue, som skal returnere en int. MaxValue skal have int Array som parameter, som den skal modtage fra den kaldende funktion. MaxValue returnere den største værdi i arrayet. Lav et array med 10 tal i Main (ikke i numerisk orden) og kald MaxValue og udskriv den største værdi.

Her er hjælp:

Page 51: Sonne Huse

Programmering med C#

Side 51 af 107 sider

static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for (int i = 1; i < intArray.Length; i++) { if (intArray[i] > maxVal) maxVal = intArray[i]; } return maxVal; } static void Main(string[] args) { int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2}; int maxVal = MaxValue(myArray); Console.WriteLine("The maximum value in myArray is {0}", maxVal); Console.ReadLine(); Test applikationen og prøv at forklare hvad den gør. I dette eksempel har funktionen MaxValue en parameter i form af et array, kaldet intArray. Der er også en returværdi, en int. I funktionen MaxValue finder vi den højeste værdi i et givet array. I Main har vi først et simpelt int array. Dernæst kalder vi MaxValue for at finde den største værdi i arrayet. Denne kode skal du arbejde vi videre på i næste øvelse.

Øvelse 3 – Overloading Lav en funktion mere med navnet MaxValue, denne gang skal parameteret være en double, men eller med samme funktion som før. Tilføj et double array i Main() og giv det 10 forskellige 3-cifrede tal som indhold. Tilføj et kald til denne funktion med et double-parameter:

Her er hjælp: static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for (int i = 1; i < intArray.Length; i++) { if (intArray[i] > maxVal) maxVal = intArray[i];

Page 52: Sonne Huse

Programmering med C#

Side 52 af 107 sider

} return maxVal; } static int MaxValue(double[] doubleArray) { double maxVal = doubleArray[0]; for (int i = 1; i < doubleArray.Length; i++) { if (doubleArray[i] > maxVal) maxVal = doubleArray[i]; } return Convert.ToInt32(maxVal); } static void Main(string[] args) { int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 }; double[] nyArray = {112, 333, 444,55, 49}; int maxVal = MaxValue(myArray); Console.WriteLine("The maximum value in myArray is {0}", maxVal); double nyVal = MaxValue(nyArray); Console.WriteLine("The maximum value in nyArray is {0}", nyVal); Console.ReadLine(); }

Dette er et eksempel på overloading functions, den eneste forskel på funktionerne er signaturen og afhængig af kaldet til funktionen finder .Net selv ud af hvilken funktion der skal bruges

Øvelse 4 – Simpelt loop Du skal lave en applikation, som bruger et loop til at udskrive line 1 til line 9 på skærmen og afslutte med at skrive ” Last text output in loop: line 9”

static void Main(string[] args) {

Page 53: Sonne Huse

Programmering med C#

Side 53 af 107 sider

int i; string text = ""; for (i = 0; i < 10; i++) { text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text); }

Question The following two functions have errors. What are they?

static bool Write() { Console.WriteLine("Text output from function."); }

static void myFunction(string label, params int[] args, bool showLabel) { if (showLabel) Console.WriteLine(label); foreach (int i in args) Console.WriteLine("{0}", i) }

Answer

Question Write an application that uses two command line arguments to place values into a string and an integer variable respectively, then display these values. Answer Question Modify the following struct to include a function that returns the total price of an order:

struct order { public string itemName; public int unitCount; public double unitCost; }

Answer

Question Add another function to the order struct that returns a formatted string as follows, where italic entries enclosed in angle brackets are replaced by appropriate values: Order Information: <unitCount> <itemName> items at $<unitCost> each, total cost $<totalCost>.

Page 54: Sonne Huse

Programmering med C#

Side 54 af 107 sider

Answer

Page 55: Sonne Huse

Programmering med C#

Side 55 af 107 sider

Sikkerhed i ASP.NET Der er tre kernebegreber du skal kende, når vi taler sikkerhed i .NET, nemlig:

• Authentication • Authorization • Impersonation

Authentication. Authentication betyder direkte oversat: ”Verfikation af identiteten på en person”: I .NET-miljøet betyder det, den proces, hvor brugerens identitet bestemmes og hvor brugeren beviser, at han vitterlig er den person, som han påstår han er. Dette sker typisk ved at brugeren logger på med brugernavn og password.

Authorization. Når brugeren er authenticeret, skal det undersøges hvilke rettigheder han besidder. Dette kaldes authorization. .NET undersøger om brugeren har ret til at tilgå den ressource, som han forsøger at tilgå.

Impersonation. I .Net kører al kode under en konto defineret i machine.config. IUSR_servernavn er typisk navnet på denne konto. Med impersonation kan noget af din kode kører under en anden identitet med andre Windows rettigheder

Sikkerhedsmodel Skematisk kan .Net sikkerhedsmodellen illustreres således:

Page 56: Sonne Huse

Programmering med C#

Side 56 af 107 sider

Når brugeren(web client) først sender en request til IIS-serveren (Internet Information Server), vil IIS først authenticere brugeren i forhold til Windows. Hvis ”Allow Anonymous” i IIS er sat til true, vil der ikke ske nogen authentication i IIS. Hvis brugeren afvises i IIS pga utilstrækkelig rettigheder i Windows sendes en fejlmeddelse til brugeren. Hvis brugeren ikke afvises i IIS, sendes brugerens request videre til ASP.NET applikationen. I applikationen sker authentication i henhold til den sikkerhed der der sat med hjælp fra .NET Frameworket.

Sikkerhed step by step 1. IIS Authentication sender videre med info om brugeren 2. ASP.Net checker web.config og aspx-siden 3. Aspx-siden spørger om evt. password 4. Ved kald til databaser bruges Windows sikkerhed

Page 57: Sonne Huse

Programmering med C#

Side 57 af 107 sider

Forms Authentication i ASP.NET Med Form Authentication i .NET kan du lagre information til authentication I web.config-filen. Dette kan være brugernavn og password eller du kan vælge at bruge en database, en xml-fil eller en simpel tekst-fil. Asp.Net gør det hårde arbejde med at styre informationer vedr state-tracking.

Forms Authentication Baggrund. Forms authentication benytter cookie at at holde styr på de brugerne under deres besøg på en web-site. Når en bruger logger ind med forms authentication bliver der oprettet til at huske brugeren fra side til side på web-sitet. Hvis brugeren forespørger på en restricted side og han ikke er logget på, vil han blive redirected til login-siden. Når han så er logget på, vil han sendes tilbage til den side han oprindeligt ville se.

Standard Forms Authentication Setup Sider: Default.aspx, Login.aspx, Web.config I standard opsætningen af Forms Authentication, bliver alt bruger information gem i Web.config.

Øvelse

1. Opret ny web-site –standardForms.

Web.config Overview Web.config indeholder alle configuration-settings for en ASP.NET application. Dette giver udvikleren control over web-applicationen istedet for than the system administratoren. Der er mange muligheder for at tilpasse efter udviklerens egne ønsker. Her vil vi kun kigge på Forms Authentication delen. Authentication settings i web-config

Attributter Beskrivelse

Name Navnet på den cookie, som bruges til authentication. Brug unikke navne.

Path Stien til cookien. Standardværdien "/" forhindrer ofte errors med ukorrekte store/små karakterer.

LoginUrl URL, som unauthenticated brugere bliver redirected til.

Protection Metode til beskyttelse af cookie data. Standardværdi er "All," som udfører både validation og encryption.

Timeout Antallet af minutter til authentication cookien udløber.

Page 58: Sonne Huse

Programmering med C#

Side 58 af 107 sider

Credentials

Attributter Beskrivelse

passwordFormat Format som password gemmes i. Valide værdier inkluderer Clear, SHA1, og MD5. SHA1 og MD5 er begge hashing algoritmer, hvilket gør det at gemme passwords i Web.config mere sikkert.

User Her gemmes brugernavn og password. Du kan bruge HashPasswordForStoringInConfigFile funktionen til at få et hashed password. (uddybes senere)

Authorization

Attributter Beskrivelse

Deny | Allow Her kan du give tilladelse eller afvise brugere til din web-site. ? = anonyme/unauthenticated brugere og * betyder alle brugere. Denne sektion lader dig specificere hvilke brugere som skal have tilladelser eller ej.

Øvelse

2. Tilret din web.config-fil som den ser ud som nedenstående: <configuration> <system.web> <customErrors mode="Off"/> <authentication mode="Forms"> <forms name="appNameAuth" path="/" loginUrl="login.aspx" protection="All" timeout="30"> <credentials passwordFormat="Clear"> <user name="jeff" password="test" /> <user name="mike" password="test" /> </credentials> </forms> </authentication> <authorization> <deny users="?" /> </authorization> </system.web> </configuration>

Page 59: Sonne Huse

Programmering med C#

Side 59 af 107 sider

Web.config Detaljer I ovenstående Web.config-fil har vi brugt flere muligheder.

Authentication Authentication mode er sat til Forms. Mulighederne er:

• Windows – afhænger af de sikkerheder som er i IIS • Forms - ASP.NET forms–baseret authentication • Passport – Bruger Microsoft Passport Network • None

I forms-sektionen får attributten name værdien AppNameAuth. Du kan evt. navngive denne cookie med samme navn som din web-site for at få et unikt navn i tilfælde af du har flere applikationer på samme maskine. loginUrl attributten sættes til en lokal side, loginUrl.aspx. Du kan også bruge en URL som https://aats.dk. Dette gør at din cookie bade bliver krypteret og valideret. Når cookien valideres bruges en algoritme fra machineKey i Machine.config(en slags webconfig, men for hele computeren – står over webconfig i de enkelte applikationer). Dette sikrer, at cookien ikke er modificeret I forhold til den originale cookie(sniffing traffic). Timeout attributten sætter antallet af minutter der skal gå uden aktivitet er på siden før brugeren skal logge på igen. I credentials-sektionen, er der tilføjet to brugere og deres password. Authorization Denne section bruges til at forhindre at ingen unauthenticated brugere kan få adgang til web-siten. "?" står for anonyme brugere, dette er brugt til at afvise alle anonyme brugere. Hvis vi havde brugt allow i stedet for deny, havde vi givet adgang til alle anonyme brugere. Login.aspx Overview Al bruger authentication logik udføres her. Hvis du ønsker at validere en brugere mod en web-config, en database eller andet, så sker det her. I dette eksempel er det mod Web.config

Øvelse

3. Tilret login.aspx, så den ser ud som nedenstående: <table width="400" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="80">Username : </td> <td width="10"> </td> <td><asp:TextBox Id="txtUser" width="150" runat="server"/></td> </tr> <tr> <td>Password : </td> <td width="10"> </td> <td><asp:TextBox Id="txtPassword" width="150" TextMode="Password" runat="server"/></td> </tr> <tr> <td></td>

Page 60: Sonne Huse

Programmering med C#

Side 60 af 107 sider

<td width="10"> </td> <td><asp:CheckBox id="chkPersistLogin" runat="server" />Remember my credentials<br/> </td> </tr> <tr> <td> </td> <td width="10"> </td> <td><asp:Button Id="cmdLogin" OnClick="ProcessLogin" Text="Login" runat="server" /></td> </tr> </table> <br /> <br /> <div id="ErrorMessage" runat="server" />

4. Tilret Login.aspx.cs på samme måde: protected void ProcessLogin(object sender, EventArgs e) { if (FormsAuthentication.Authenticate(txtUser.Text,

txtPassword.Text)) { FormsAuthentication.RedirectFromLoginPage(txtUser.Text,

chkPersistLogin.Checked); } else { ErrorMessage.InnerHtml = "<b>Noget gik galt...</b> prøv

igen..."; } }

Login.aspx Detaljer Alle metoder af authentication ligger I System.Web. FormsAuthentication er en klasse I System.Web.Security namespace. Her er en simple server-side form setup med en tekstboks til brugernavn og en anden tekstboks til password. Der er også en check boks, hvis brugeren ønsker en permanent cookie med logininformationer. Submit knappen har en event, som trickes med "onclick". Dette kalder en metode, ProcessLogin. ProcessLogin eksekveres Authenticate metoden fra FormsAuthentication klassen, hvortil vi sender brugernavn og password. Denne metode checker credentials i Web.config med brugernavn og password. Hvis de er OK – sendes brugeren videre med RedirectFromLoginPage med brugernavn og password I en cookie. Hvis brugernavn og password ikke stemmer, får brugeren en fejlmeddelse. Default.aspx Overview Dette er siden som brugeren først spurgte på. Her vil vi vise den aktuelle authenticated bruger og typen af authentication.

5. Skriv koden til Default.aspx.

<body >

Page 61: Sonne Huse

Programmering med C#

Side 61 af 107 sider

<span class="Header">Form Baseret Authentication med standard

metoder</span>

<br>

<br>

<div id="displayCredentials" runat="server" />

<br>

<br>

<form id="Form1" runat="server">

<asp:Button id="cmdSignOut" text="Sign Out" runat="server"

onClick="SignOut" />

</form>

</body></html>

6. Tilsvarende er koden til code-behind Default.aspx.cs. protected void Page_Load(object sender, EventArgs e) { //verify authentication if (User.Identity.IsAuthenticated) { //display Credential information displayCredentials.InnerHtml = "Current User : <b>" +

User.Identity.Name + "</b>" + "<br><br>Authentication Used : <b>" +

User.Identity.AuthenticationType + "</b>"; } else { //Display Error Message displayCredentials.InnerHtml = "Sorry, you have not been

authenticated."; } } protected void SignOut(object sender, EventArgs e) { //'delete the users auth cookie and sign out FormsAuthentication.SignOut(); //'redirect the user to their referring page Response.Redirect(Request.UrlReferrer.ToString()); } Her bruger vi igen System.Web.Security namespace og nogle af de metoder der ligger deri. Vi kan se de aktuelle credentials- og authentication typer, der er I spil. Der er også et a signout input element, som kalder en metode, som slutter brugerens cookie. Dernæst bliver brugeren redirected til login-siden. I Page_Load checker vi om brugeren er authenticated ved hjælp af User.Identity.IsAuthenticated. Dette returnere en Boolean værdi som fortæller om brugeren er authenticated eller ej. Hvis brugeren er authenticated, vises brugerens navn og den den authentication metode ere r benyttet. Vi kan tilgå den indlogged brugers navn med User.Identity.Name. User.Identity.AuthenticationType returnerer hvilken authentication der er brugt. Vi har også lavet en SignOut procedure, som tillader brugeren at logge ud og slette sin

Page 62: Sonne Huse

Programmering med C#

Side 62 af 107 sider

cookie fra brugerens pc. Selv en persistent cookie vil blive slettet på denne made(flueben i rememeber me på login-siden).

Question 1 – authentication/Authorization Forklar med egne ord forskellen mellem authentication og authorization

Question 2 – authentication/Authorization Hvordan laver du en cookie med Formsauthentication klassen?

Question 3 – authentication/Authorization Hvilken sætning er invalid og giver en fejl:

a. FormsAuthentication.SignOut(); b. FormsAuthentication.LogOut(); c. FormsAuthentication.SignIn();

Page 63: Sonne Huse

Programmering med C#

Side 63 af 107 sider

Site Design

Planlægning Når du skal udvikles web-sites for kunder, er der mange ting som skal tages i betragtning og en grundig planlægning er krævet. Typisk, vil dette inkludere:

1. En model over sitets funktionalitet. Dette skal være detaljeret, som f.eks. hvad sker der når brugeren logger ind, eller hvad skal de forskellige brugergrupper have adgang til.

2. Hvilke teknologier er til rådighed. F.eks. hvilke databasetyper. 3. En teknisk beskrivelse over hvordan funktionaliteten skal implementeres. 4. En beskrivelse af design. Du skal være opmærksom på, at design kan have 2 betydninger:

a. Det fysiske design, som farver og layout på siten. Her skal hver enkelt side beskrives i detaljer, helt ned til hvad der skal stå – hvor det skal placeres og hvilke billeder der skal vises.

b. Arkitekturen på sitet. Her tænkes både på de indbyrdes sider, hvordan de linkes sammen og på lagring af information – databaser.

Master- og Content pages Et web-site skal have et gennemgående look og navigation. Typisk vil der være en fælles header, navigationsbar og footer for alle sider. Dette kan nemt opnås med Master- og Content pages.

En Master Page er en skabelon for dine andre sider. Den tilføjes dit site med filtypen .master. Visual Studio foreslår den kommer til at hedde ” MasterPage.master”. På masterpagen opbygger du det gennemgående design for dit web-site. Du designer headeren, menuer, footer mm.. Du kan tilføje

Page 64: Sonne Huse

Programmering med C#

Side 64 af 107 sider

alle typer af kontroller til din Masterpage, og de vil automatisk blive vist på de sider, som bygger på din Masterpage. På masterpagen placerer du også contentplaceholders, som reserverer plads til indholdet på de contentpages, som bygger på din Masterpage. I source-view på din Masterpage kan du se allerøverst på siden er der følgende kode:

<@ master language=”c#”>

Og længere nede i din kode, i body-sektionen, er din

contentplaceholder med følgende kode:

<asp:contentplaceholder id=”Indhold” runat=”server” />

Når designet mm er fastlagt i din Masterpage, tilføjer du Content Pages, som bygger på din Masterpage, til dit web-site.

Page 65: Sonne Huse

Programmering med C#

Side 65 af 107 sider

En contentpage er baseret på en Masterpage. Den viser indholdet på masterpagen neddæmpet, og det eneste sted du kan arbejde, er hvor der er placeret contentplaceholders på din Masterpage. Hvis du skifter til source-view på din contentpage, kan du se den første linie fortæller hvilken Masterpage, contentsiden er baseret på:

<%@ Page Language=”C#” MasterPageFile=”MasterPage.master” %>

Bemærk, der er ingen head eller body-sektion, men i stedet et content-tag:

<asp:Content ID=”Content1” ContentPlaceHolderID=”Indhold”

Runat=”Server”>

… her kommer indholdet

</asp:Content>

Opgave – oprette en MasterPage

1. Opret en ny web-site – navngiv ”DitNavn”

Page 66: Sonne Huse

Programmering med C#

Side 66 af 107 sider

2. Tilføj en MasterPage – navngiv masterpage.master – se Figur 1

Figur 1

Din masterpage åbnes i sourceview og du kan se, at siden starter med at fortælle i Page Directivet, at dette er en masterpage: <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> Alle MaterPages starter med at fortælle, at dette er en master. Længere nede i koden; i bodyen kan du se, at der automatisk er indsat en ContentsPlaceHolder til brug for dine Contentspages. <body> <form id="form1" runat="server"> <div> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> Du er nu klar til at designe din side. Start med at tilføje et stylesheet til web-siten, således den kan bruges på din MasterPage. På den måde skal den kun tilføjes én gang.

3. Højreklik på web-sitens rod og Add New Item – vælg Stylesheet. Klik Ok

Page 67: Sonne Huse

Programmering med C#

Side 67 af 107 sider

4. Opbyg dit stylesheet efter egne ønsker. Højreklik i stylesheetet og vælg mellem Add Style

Rule, hvis du vil lave en regel for et nyt element, eller Build Style for at komme ind i StyleBuilder, se Figur 2. Du kan også skrive koden manuelt.

Figur 2

Page 68: Sonne Huse

Programmering med C#

Side 68 af 107 sider

5. Tilføj dit stylesheet til din MasterPage – enten i Source View ved at trække den ind i Head-sektionen – eller ved at trække den ind på siden i Design View.

Du skal nu lave et design på din master – Der skal være et område til navigation. Og nederst afsættes plads til en footer

6. Vælg menuen Layout Insert Table.

7. Nu fremkommer dialogboksen Insert Table og her vælger du radioknappen Template.

8. Vælg templaten(skabelonen) Header, footer and side.

9. Opbyg dit Masterpage med Header- og Footer-design. Husk, al formatering gemmes til et stylesheet

En Master Page kan indeholde alle de Content Placeholders, som du ønsker. Samtidig kan du have flere niveauer af Master Pages, hvor f.eks. en Masterpage med filnavnet Venner.master kan arve fra SiteMaster.master. Ulempen ved dette er, at der bliver mindre og mindre plads til indhold på de Content Pages, som er kædet til en underliggende Master Page

Page 69: Sonne Huse

Programmering med C#

Side 69 af 107 sider

10. Slet Default.aspx fra din web-site og tilføj ny webform – husk at afkrydse i ”Select Master Page. Se Figur 3

Figur 3

11. Der fremkommer en ny dialogboks, her vælger du din Master Page fra før.

Page 70: Sonne Huse

Programmering med C#

Side 70 af 107 sider

Navigations Kontroller Der er 3 forskellige navigationskontroller:

• SiteMapPath • TreeView • Menu

Alle 3 er simple kontroller, som sparer os for masser af programmering. Det eneste, de behøver for at fungere er et Site Map.

Site Map De fleste web-sites er opbygget efter en træ-struktur, hvor der er et Topniveau, flere Sub-niveauer som igen har subniveauer. Home Virksomheder CV Venner Admin Når dette hierarki fastlægges fra starten, kan du bruge disse informationer til at lave navigationskontroller. Det eneste det kræver, er at disse strukturer skrives i et XML-dokument, som navngives web.sitemap. Dokumentet skal hedde web-sitemap og det skal placeres i roden af din web-site.

Figur 4

Page 71: Sonne Huse

Programmering med C#

Side 71 af 107 sider

Du får et xml-dokument med den struktur som du skal bruge:

Figur 5

Som det fremgår, består dokumentet af siteMapNodes, som holder informationerne om de enkelte sider på web-sitet. Hver node skal udfyldes med en URL en titel og en beskrivelse(description). Når dokumentet åbnes er der 2 tomme nodes. Disse nodes kan du kopiere og tilføje så mange som du har behov for. Se Figur 6 ,

Page 72: Sonne Huse

Programmering med C#

Side 72 af 107 sider

Figur 6

Der er endnu en attribut, som kan tilføjes et sitemap, nemlig Roles I sjældne tilfælde ønsker du at alle kan se en side eksisterer, men hvis de klikker på linket, bliver de nægtet adgang til siden.

SiteMapPath Denne kontrol bruges til ”breadcrumb” funktionalitet. Altså konceptet, hvor du efterlader brødkrummer for at se hvor du er, og har muligheden for at finde tilbage ad den samme vej, som du kom. Opgave

1. Tilføj et siteMap til din web-site 2. Udfyld dokumentet som i Figur 6 3. Tilføj de nævnte webforms til web-sitet 4. Lav overskrifter på siderne 5. tilføj en SiteMapControl på din Master Page, find et passende autoformat til kontrollen. 6. Kig på de tilgængelige properties for kontrollen – specielt kan nævnes:

a. RenderCurrentNodeAsLink True eller False. Her specificeres om Noden skal vises som link eller som plain tekst.

b. PathDirection RootToCurrent eller CurrentToRoot. Rækkefølgen af vores breadcrumbs

c. PathSeparator Separator-tegnet som adskiller vores breadcrumbs. Som default vises : men alle ASCII karakterer kan bruges.

Page 73: Sonne Huse

Programmering med C#

Side 73 af 107 sider

SiteMapDataSource kontrol Dette er en ikke-visuel kontrol, som bruges til at vise informationerne fra et SiteMap i navigationskontrollerne Menu og TreeView. Kontrollen kan trækkes ind fra Toolboxen Data og i sourceview ser den således ud: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Menu Denne kontrol er et miks af dynamisk og statisk indhold. Du kan vælge at tilføje indholdet til den fuldstændig dynamisk med hele strukturen vises eller du kan selv vælge hvad den skal ville – og som en tredje mulighed kan du mikse de 2 første muligheder. Før du kan bruge en Menu kontrol på siden, skal du først tilføje en SiteMapDataSource. Opgave

1. Åbn siden Default.aspx og træk en SiteMapDataSource ind på siden. Giv den ID SiteData. 2. Træk en Menu kontrol ind på Default.aspx lige ved siden af SiteData. Du får følgende

billede, hvor du kan se Smart Task vinduet, som du skal til at arbejde i. Se Figur 7

Figur 7

3. I DataSource vælger du SiteData fra dropdown-listen 4. I properties for Menuen sætter du StaticDisplayLevel til 2 5. Test siden 6. Afprøv følgede properties:

a. Orientation Vertical/Horizontal

b. StaticSubMenuIndent c. Disappearafter

Her defineres hvor længe en fly-out vises 7. Lav menuen efter dine egne ønsker.

Page 74: Sonne Huse

Programmering med C#

Side 74 af 107 sider

TreeView Med TreeView kan du lave en navigation, som minder om Stifinderen i Windows. Den oprettes ligesom Menu Opgave

1. Træk en SiteMapDataSource ind på Venner.aspx 2. Træk en TreeView kontrol ind og vælg datasource 3. Test siden 4. Afprøv forskellige properties og lav kontrollen efter egne ønsker 5. Lav navigation på alle siderne – enten Menu eller TreeView, som du foretrækker.

Eksperimentér med de forskellige properties. Se evt. Figur 8 Property Værdi Resultat EnableViewState True/false Specificerer om

SiteMapDataSourcen husker data ved postback

ShowStartingNode True/false Bestemmer om rod-noden skal vises

SiteMapProvider Enhver valid provider Kan bruges til at angive en custom provider – f.eks. hvis sitemap-dataene er gemt i et andet filformat som en database

StartFromCurrentNode True/false Hvis den er sat til true, vises der kun underlink til den aktuelle side – ikke hele hierarkiet

StartingNodeOffset Integer værdi Bruges til at flytte start-link til næste niveau i hierarkiet. F.eks. hvis værdien sættes til 1, vil alle menupunkter på første niveau ignoreres

StartingNodeUrl Tekststreng, som repræsenterer en URL på en side, som er defineret i web.sitemap-filen

Bruges til at specificerer et andet sted, hvor hierarkiet skal starte fra.

Figur 8

Page 75: Sonne Huse

Programmering med C#

Side 75 af 107 sider

Web.config og Global.asax Web.config og global.asax er to standard-filer i alle ASP.NET web-sites. De indeholder konfiguration informationer og kode, som vedrører hele web-sitet. Begge filer er xml-filer, dvs at konfigurationsfilerne er simple tekst-filer

Web.config Da Web-config er en xml-fil, er det let læselig og nemt at forstå hvad filen indeholder. Det er settings som vedrører hele web-sitet og alle sider i sitet. Det kan f.eks. være connection strings til databaser, egne tilpassende fejlmeddelser og settings vedr. kultur, land, sprog.

Xml-formatet betyder også, at alle valide xml-tags kan bruges, men root elementet skal altid være <configuration>. Indlejret i root-elementet kan du inkludere andre tag til at beskrive dine settings. En typisk web.config, som er genereret fra Visual Studio vil se således ud:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<system.web>

<compilation

defaultLanguage="c#"

debug="true"

/>

<customErrors

mode="RemoteOnly"

/>

<authentication mode="Windows" />

<authorization>

<allow users="*" />

</authorization>

<trace

enabled="false"

requestLimit="10"

pageOutput="false"

traceMode="SortByTime"

localOnly="true"

/>

<sessionState

mode="InProc"

stateConnectionString="tcpip=127.0.0.1:42424"

Page 76: Sonne Huse

Programmering med C#

Side 76 af 107 sider

sqlConnectionString="data

source=127.0.0.1;Trusted_Connection=yes"

cookieless="false"

timeout="20"

/>

<globalization

requestEncoding="utf-8"

responseEncoding="utf-8"

/>

</system.web>

</configuration>

Fra dette eksempel er alle kommentarkoder udeladt. Når du kigger nærmere på koden kan du se, at <configuration> kun har et child tag, nemlig <system.web> tagget. Dette kaldes også en sektionsgruppe. Denne sektionsgruppe kan indeholde sektioner med forskellige settings, som f.eks:

• Compilation

• CustomErrors

• Authentication

• Authorization

Du kan også definere dine egne specifikke applikations setting. Det kan være en databasestring, som du kan sætte med <appSettings> tagget.

De mest brugte settings I web.config er:

<configuration>

<system.web>

<!— sections-->

</system.web>

<appSettings>

<!— sections -->

</appSettings >

</configuration>

Page 77: Sonne Huse

Programmering med C#

Side 77 af 107 sider

<authentication> Her fortæller du, hvilken type authentication, som bruges i applikationen. Du har tre muligheder:

• None – alle har adgang til dit site • Windows – sikkerheden er sat i windows-styresystemet. • Form – sikkerheden er sat i Internet Information Server. • Passport – benytter Microsoft Passport.

Eksempel:

<authentication mode="Form" />

<authorization> Med authorization kan du give tilladelse eller afvise bestemte brugere eller roller med <allow> eller <deny> child tags.

<authorization>

<allow roles="Administrators,Users" />

<deny users="*" />

</authorization>

ASP.NET gennemløber gennem alle sektioner, og vælger den første regel som passer på den aktuelle bruger. I dette eksempel vil brugere som er i rollen Adminstrator eller Users få adgang, mens alle andre vil blive afvist(* er et wildcard, som symbolisere alle). <compilation> Settings vedr. Kompileringen sættes her. Det kan være debug-settings eller defaultLanguage. Vær opmærksom på, at debug=”true” kræver mange ressourcer, så når sitet er klar til deployment, som ret det til false. <customErrors> Her kan du lave dine egne fejlmeddelser med attributten mode=On. Hvis du samtidig sætter til remoteOnly, vil disse fejlmeddelser kun blive vist til remote klienter, mens lokale brugere kan se .NET´s fejlmeddelser ved f.eks. debugging. Hvis mode sættes til Off, vil alle brugere se .NET´s fejlmeddelser. Med defaultRedirect kan du redirecte brugeren til en side efter dit valg.attribute. Husk, stein skal være den relative sti I forhold til web.config – ikke til den side hvor fejlen opstår. Andre muligheder er, at bruge <error> tags med statuskoder og redirecte:

<customErrors mode="RemoteOnly" defaultRedirect="/error.html">

<error statusCode="403" redirect="/accessdenied.html" />

<error statusCode="404" redirect="/pagenotfound.html" />

</customErrors>

<globalization> Denne sektion bruges til encoding eller kultur. Her kan du bestemme hvilket karaktersæt, der skal benyttes (UTF-8 er default), eller hvordan datoer og tal skal vises:

<globalization requestEncoding="utf-8" responseEncoding="utf-8"

culture="da-DK" />

Hvis du ikke definerer en kultur, bruges serverens regionale settings.

Page 78: Sonne Huse

Programmering med C#

Side 78 af 107 sider

<httpRuntime> Alt vedr. Runtime sættes her. F.eks. <httpRuntime appRequestQueueLimit="100" executionTimeout="600" /> Først sætter du her antallet af request, som serveren sætter I kø ved høj belastning. Når der står 100 request i kø, vil det udløse en 503-error (Server too busy). executionTimeout er tiden som går inden en request får time out

<sessionState> I denne sektion defineres, hvor session state gemmes. Standard er:

<sessionState mode="InProc" />

<trace> Trace log-fil er placeret i applikationens root under navnet trace.axd. Du kan ændre udseende af tracing informationen i denne sektion. Der er følgende attributter

• localOnly – værdier true/false. Med false kan trace loggen se fra alle klienter • pageOutput – værdier true/false. Med true vil tracing informationer blive tilføjet i bunden af

hver side.

<trace enabled="true" localOnly="true" pageOutput="false" />

AppSettings sektionsgruppen Her kan du gemme information over flere sider. Et eksempel er en connectionstring til en database. Du kan måske også selv finde på andre muligheder. Her er et eksempel:

<appSettings>

<add key="sqlConn" value="Server=myPc;Database=Northwind" />

<add key="smtpServer" value="smtp.mydomain.com" />

</appSettings>

Dette eksempel viser key og værdier, som kan tilgås fra dine web-sider, som her:

ConfigurationSettings.AppSettings("sqlConn")

En web application kan indeholde mere end en web.config-fil. De settings der er defineret i filen gælder for den mappe, hvor filen er placeret og alle child-mapper. Filerne er beskyttet af IIS(Internet Information Server), så de ikke kan tilgås fra browseren. De vil få ”Access denied”. IIS opdager også automatisk ændringer i web-config – serveren skal ikke genstartes.

Global.asax Denne fil indeholder kode for hele sitet. Der er tre tidspunkter hvor denne kode eksekveres:

• Når hele sitet starter eller stopper. • Når en bruger starter eller stopper med at bruge sitet • Som respons til en speciel event, som f.eks. en fejl.

Page 79: Sonne Huse

Programmering med C#

Side 79 af 107 sider

Design af de enkelte sider på et web-site

Statiske sider De enkelte sider i et web-site, kan enten være dynamiske eller statiske. De statiske sider består af ren HTML og billeder. I VS’s Toolbox er der en sektion med rene HTML-kontroller.

Kontroller som ses i Figur 9 er ganske almindelige tags, som du selv vil skrive dem. Med Toolboxen slipper du for at skrive dem selv, og du kan se de tilhørende egenskaber i property-vinduet. Hvis det ikke er synligt, kan du finde det i view-menuen eller ved at trykke F4.. Når du kan skrive HTML, er det der kun et lille spring til at skrive XHTML. I XHMTL kan du blot huske at lukke alle dine tags. F.eks. skal <br> skrives som <br />, desuden er XHTML case-sensitive ligesom C#. Hvis du vil kigge nærmere på XHTML, findes der en tutorial på http:www.html.dk.

Dynamiske sider Når en side er dynamisk, vil den side, som serveren sender til klienten være afhængig af hvad brugeren har indtastet på den side der requestet fra. Det kan f.eks. være et indlæg som brugeren skriver til et forum eller en forespørgsel på bestemte produkter. I VS er der også en toolbox med standard-kontrollerne med dynamiske server-kontroller. Se Figur 10. Der udover findes der toolboxe med datakontroller, validerings-, Login-, webparts- og navigationskontroller. Når du kigger på din aspx-side i source-view, kan du genkende server-kontrollerne ved de starter med <asp: og et sted i tagget står der runat=”server”, hvilket gør at koden afvikles på serveren og derefter sendes til klienten som ganske alm indelig HTML. Du kan også lave dine HTML-kontroller til ”serverkontroller” ved at tilføje runat=”server”.

Figur 9

Figur 10

Page 80: Sonne Huse

Programmering med C#

Side 80 af 107 sider

Du kan tilføje kontroller fra en toolbox ved at trække dem ind i design- eller source-view. En anden metode er, at placere cursoren på det sted, hvor kontrollen skal placeres, derefter dobbeltklikker du på den ønskede kontrol. Den sidste mulighed er, at skrive koden selv i sourceview.

Page 81: Sonne Huse

Programmering med C#

Side 81 af 107 sider

Themes Et web-site skal have et gennemgående udseende på alle sider, som brugeren kan genkende og føle sig tryg ved. Dette kan gøre med et almindeligt Cascading Style Sheet, som du kender det. Når du bruger server-kontroller, kan du ikke være sikker på hvordan den enkelte browser viser det. En panel-kontrol kan vises som et div-tag i en browser og som en tabel i en anden. Dette betyder, at du ikke kan bruge et almindeligt css til formatering af server-kontrollerne. For at imødegå uforudsete ændringer af udseende på dine sider, har du i .NET mulighed for at lave et theme. Du kan vælge at lave et Theme for hele dit web-site eller for en enkelt side. Når du laver et theme, vil det blive sendt som en style til det tag, som sendes til browseren. Med et theme får du muligheden for at specificere, hvordan f.eks. et Treeview eller kalenderkontroller skal vises på sitet. Et theme kan bruges på to forskellige måder. Du kan bruge det som et stylesheet theme, hvilket virker som et standard css. Eller du kan bruge det som et Customization theme, med hvilket du kan ændre præference for style regler. F.eks overskrive andre stylesheets eller inline style. Måden, du laver begge typer theme, er den sammen.

Oprettelse af et theme Når du skal lave et theme, skal du først oprette en fil af typen .skin. Denne fil skal ligge i en mappe med navnet App_Themes.. Hvis mappen ikke eksisterer, vil VS oprette den automatisk. Når du laver et theme, skriver du tagget på controllen, men kun med de properties som du ønsker at formattere. Se dette eksempel for en button-kontrol:

<asp:button runat="server" BackColor="lightblue" ForeColor="black" />

Der er 2 typer af skins – et default skin som gælder for alle controller, når et theme er tilknyttet en side. Der er ikke tilknyttet et SkinId i et default skin. Hvis du ønsker at lave et navngivet skin, skal du bruge et skinID og det vil kun gælde de kontroller som direkte refererer til dette skinID. På denne måde kan du varierer udseende på dine kontroller afhængig af skinID.

Du skal nu prøve at lave et theme for en side: Opgave:

1. I Solution Explorer, højreklik på solution root og vælg “Add ASP.NET Folder” - Vælg Theme.

2. Hvis App_Themes mappen ikke allerede eksisterer vil VS oprette den automatisk. Derefter

laver VS en ny mappe for det nye theme.

3. Skriv et navn til den nye mappe. Dette bliver også navnet på dit theme.

4. Tilføj de filer, som du behøver til dit theme, f.eks stylesheet og images, som udgør dit theme

Du skal nu prove at tilføje en skin fil og et skin til et side theme.

Page 82: Sonne Huse

Programmering med C#

Side 82 af 107 sider

1. I Solution Explorer, høreklik navnet på dit theme og vælg Add New Item Skin File.

2. Skriv et navn til skin-filen og klik Add.

Typisk, laver man en skin pr. kontrol, som f.eks. Button.skin eller Calendar.skin. Men du kan lave så mange eller få skins som du ønsker.

3. I skin-filen skriver du en normal kontrol definition med den normale syntaks, men du inkluderer kun de properties som du ønsker for dit theme. Kontrol definitionen skal have runat="server" attributten, og der må ikke være en ID="" attribut. Opret et button skin:

<asp:Button runat="server"

BackColor="Red"

ForeColor="White"

Font-Name="Arial"

Font-Size="9px" />

I dette skin er der ingen skinID attribut. Det betyder, at det vil gælde for alle button controller, som ikke har et skinID. Bemærk: En nem måde at lave skins til kontroller, er at tilføje kontrollerne til en side og konfigurer dem, således de har den ønskede formatering. Dernæst kopiere du kontrollerne til din skin-fil, hvor du blot skal huske at fjerne ID-attributten. Du kan kun definere en default skin pr kontrol. Ellers skal du bruge skinID til at skelne mellem kontrollerne.

Page 83: Sonne Huse

Programmering med C#

Side 83 af 107 sider

Membership, Roles & Identity Med ASP.NET er det blevet meget nemmere at lave restricted areas i en web-site. Til at håndtere sikkerhed på web-sites, har ASP.NET fået en håndfuld nye server-controls. Disse server-controls gør det muligt at håndtere sikkerhed, logins, oprette nye brugere og få tilsendt et glemt password uden at skrive en eneste linie kode selv. Dette sker ved hjælp af klassen Membership, som er ny i ASP.NET 2.0. Med Membership kan du lagre og modtage bruger specifik information i en database uden overhovedet at skrive database-koding. ASP.NET membership gives you a built-in way to validate and store user credentials. ASP.NET membership

therefore helps you manage user authentication in your Web sites. You can use ASP.NET membership with

ASP.NET Forms authentication or with the ASP.NET login controls to create a complete system for

authenticating users.

ASP.NET membership supports facilities for:

• Creating new users and passwords.

• Storing membership information (user names, passwords, and supporting data) in Microsoft SQL

Server, Active Directory, or an alternative data store.

• Authenticating users who visit your site. You can authenticate users programmatically, or you can use

the ASP.NET login controls to create a complete authentication system that requires little or no code.

• Managing passwords, which includes creating, changing, and resetting them . Depending on

membership options you choose, the membership system can also provide an automated password-

reset system that takes a user-supplied question and response.

• Exposing a unique identification for authenticated users that you can use in your own applications and

that also integrates with the ASP.NET personalization and role-management (authorization) systems.

• Specifying a custom membership provider, which allows you to substitute your own code to manage

membership and maintain membership data in a custom data store

Membership, Roles and the User Profile

Although membership is a self-standing feature in ASP.NET for authentication, it can be integrated with

ASP.NET role management to provide authorization services for your site. Membership can also be integrated

with the user profile to provide application-specific customization that can be tailored to individual users. For

details, see Managing Authorization Using Roles and ASP.NET Profile Properties Overview.

How Membership Works

To use membership, you must first configure it for your site. In outline, you follow these steps:

1. Specify membership options as part of your Web site configuration. By default, membership is enabled.

You can also specify what membership provider you want to use. (In practical terms, this means that you are

specifying what type of database you want to keep membership information in.) The default provider uses a

Microsoft SQL Server database. You can also choose to use Active Directory to store membership

information, or you can specify a custom provider. For information on membership configuration options that

can be specified in the Web.config file for your ASP.NET application, see Configuring an ASP.NET Application

to Use Membership.

Page 84: Sonne Huse

Programmering med C#

Side 84 af 107 sider

2. Configure your application to use Forms authentication (as distinct from Windows or Passport

authentication). You typically specify that some pages or folders in your application are protected and are

accessible only to authenticated users.

3. Define user accounts for membership. You can do this in a variety of ways. You can use the Web Site

Administration Tool, which provides a wizard-like interface for creating new users. Alternatively, you can

create a "new user" ASP.NET Web page where you collect a user name and password (and optionally an e-

mail address), and then use a membership function named CreateUser to create a new user in the

membership system.

I Visual Studio er der et værktøj til at administrere selve websitet, nemlig ASP.NET Configuration, som kan findes via menuen Project eller menuen Website. Her kan du via fanen Security oprette users og roles til din website.

Figur 11

Page 85: Sonne Huse

Programmering med C#

Side 85 af 107 sider

Som det fremgår af Figur 11er der mulighed for at sikkerheden ved hjælp af en guide (Wizard) eller du kan manuelt vælge om du vil arbejde med users, roles eller opsætte regler for dem.

Page 86: Sonne Huse

Programmering med C#

Side 86 af 107 sider

Login

1. Åbn din web-site – eller opret en ny med dit navn 2. opret ny webform – login.aspx 3. træk en login kontrol ind på siden – vælg et autoformat til kontrollen 4. vælg menuen website/project – ASP.NET configuration. 5. Vælg fanen Security – klik på wizarden og opsæt sikkerhed på dit web-site. Der skal

oprettes min. 2 brugere og 2 roles, samt access rules vedr. roles. 6. På default.aspx skal der være en LoginView, LoginStatus. Tilret kontrollerne 7. opret ny webform - SignIn og træk CreateUserWizard ind på siden – opret link hertil fra

default.aspx 8. opret ny side passwordrecovery.aspx. Træk en PasswordRecovery kontrol ind på siden.

Afprøv i browseren. Denne kontrol virker ikke med den defaulte sqlprovider, fordi denne har et hashed password, og dette kan ikke ”genskabes” og sende til brugeren. Endvidere skal pc’en være sat op til at sende mail.

Page 87: Sonne Huse

Programmering med C#

Side 87 af 107 sider

Sql og databaser

Hvad er en database og hvad er en relationsdatabase? En database er en samling af informationer. En relationsdatabase er en database, hvor data er organiseret i tabeller over systemets "ting" eller enheder, og hvor der imellem disse tabeller er relationer. Princippet i relationsdatabaser er, at de enkelte data i basen så vidt muligt kun optræder en gang, og det opnår man ved at oprette særskilte tabeller til alle systemets entiteter. Forestil dig f.eks. at du har en simpel adresse database. Post nummer og by vil forekomme mange gange, da du sikkert har mange kontakter fra samme by. Hvis denne database nu bliver stor, med mange tusinde adresser i, vil det bedre kunne betale sig at ligge en tabel med alle postnummre og byer i og så relatere disse data til adresserne, hermed står hvert postnummer og by kun en gang og skal kun rettes et sted. Når den samme information kun optræder én gang i databasen opstår færrest fejl på og samtidig gør det lettere at vedligeholde data.

SQL Server miljøet. SQL server er designet til at håndtere store datamængder og mange samtidige connections. Access databaser er brugt til mindre sites. Dvs. At har du mellem 100-5000 besøgende pr. Dag, vil Access fungerere fint. Men har du derover bør du nok overveje at skifte til en SQL Server database. Dertil kommer, at Access er meget følsom over netværk. Det kører ofte ustabilt over netværk, og der kan intet gøres ved det. Dette giver utilfredse brugere. Access sender store mængder data over netværket, hver gang den får en forespørgsel fra en bruger. I sammenligning med Access bruger SQL serveren kun 1/100 så meget plads over netværk som den samme slags data-manipulation. SQL Serveren yder også bedre sikkerhed.

SQL Server Security. Noget af det vigtigste, når du arbejder med databaser er sikkerheden. Du skal være sikker på at alle som skal have adgang til databasen har rettigheder til det og du skal forhindre uvedkommende i at få adgang. Når en SQL Server får en request til en connection, får den et login ID sammen requesten, som serveren bruger til at kontrollere adgangen til databaserne med. Dette kaldes også Authentication. Der findes 2 former for Authentication:

• Windows Authentication Hvis en bruger har rettigheder i Windows, overføres disse rettigheder til sql serveren via en trusted connection fra Windows til SQL Serveren. Microsoft anbefaler at man bruger Windows Authentication

• SQL Server Authentication SQL Serverens egen security. Her skal der medsendes både login og password, når der requestes for en connection.

Page 88: Sonne Huse

Programmering med C#

Side 88 af 107 sider

Datatyper Præcise numeriske

Integers Navn Størrelse(Byte) Beskrivelse bit 1 Integer data med enten 0 eller 1

i værdi. smallint 2 Heltal –32.000 til 32.000 -

præcis int 4 Integer (heltal) data fra -2^31 (-

2,147,483,648) til2^31 - 1 (2,147,483,647).

decimal Varierer Range, scale(antallet af decimaler), precision(antal af tal både før og efter komma) og byte-størrelse afhænger af programmøren. men fixed precision og scale fra -10^38 +1 til10^38 –1.

Numeric Varierer Funktion som decimal Float Varierer store decimaltal. Mindre præcis

en decimal. Hvis du bruger Float skal du være opmærksom på:

• Hvis du hæver antallet af decimaler, bruger der mere serverkraft

• Det kan være en fordel, hvis du skal flytte data fra en platform til en anden

tinyint Integer data fra 0 til 255 (speciel for SQL serveren).

money 8 Valuta data fra -2^63 (-922,337,203,685,477.5808) til2^63 - 1 (+922,337,203,685,477.5807), med præcision til en titusindedel af en valuta. (Kendes ikke i MySql, DB2 og Oracle)

Hvordan vælger jeg den rigtige numeriske datatype? Du skal have følgende i baghovedet, når du vælger datatype:

• Hvad er den største værdi(tal), som skal indtastes i feltet?

Page 89: Sonne Huse

Programmering med C#

Side 89 af 107 sider

• Hvor præcis behøver værdien at være – vil du miste information, hvis du bruger en mindre præcis datatype, som fx. Float?

• Har du brug for negative tal

• Husk, at det er bedre at gøre plads til lidt større værdier end der er, at sætte en for lille datatype på.

Datetime og smalldatetime

datetime 8 Date og time data fra 1. Januar 1753,

til 31. December 9999, med en

præcision på 3/100-dels sekund.

Repræsenteres af 8 tal yyyy-mm-dd

smalldatetime 4 Date og time data fra 1. Januar 1900 til

6. Juni 6, 2079 med en præcision på 1

minut yy-mm-dd

Character Strings

char Fixed length non Unicode character data med maksimum længde af

8,000 characters.(Ascii) Hvis den indtastede data fylder

mindre end den fastsatte størrelse, udfyldes den

overskydende plads med spaces

varchar Variable length Som char med maksimum characters på 8000, men

hvis den indtastede data fylder mindre end det

fastsatte, bruges kun det nødvendige plads

nchar Fixed-length Unicode data med maximum størrelse på 4,000

characters

nvarchar Variable-length Unicode data with a maximum length of 4,000

characters. sysname is a system-supplied user-defined

data type that is functionally equivalent to

nvarchar(128) og is used to reference database object

names.

Page 90: Sonne Huse

Programmering med C#

Side 90 af 107 sider

Text Store datamængder

Variable-length

Bruges som memo i Access. non-Unicode data med

maximum længde (2,147,483,647) characters

ntext Variable-length Unicode data med maximum længde på 1,073,741,823

characters.

Hvordan vælger jeg den rigtige character datatype?

. Du skal tage hensyn til:

• Forventet størrelse på feltet • Character sæt • Fylder det mere en 8 kb skal du bruge Text • Fylder det mindre end 8 kb skal du overveje om det skal være fixed eller variabel længde.

Page 91: Sonne Huse

Programmering med C#

Side 91 af 107 sider

Statements

SELECT Den mest almindelige SQL-kommando er SELECT, som til at lave en udvælgelseforespørgsel. Den mest simple form for SELECT, er denne:

SELECT * FROM medlem

her udvælges alle poster fra tabellen medlem. * er et jokertegn, som tager alle poster. Forespørgslen kan udbygges, således man kan spørge på specielle felter i tabellen.

SELECT efternavn, fornavn FROM medlem

Ønsker du at se de første 5 poster i tabellen kan du bruge

SELECT TOP 5 fornavn FROM medlem

Du kan sortere posterne på denne måde

SELECT efternavn, fornavn FROM medlem ORDER BY efternavn DESC

DESC sorterer i faldende orden, hvis du vil sorterer i stigende orden kan du nøjes med at skrive ORDER BY efternavn. Du kan kombinere på denne måde:

SELECT TOP 50 PERCENT efternavn FROM medlem ORDER BY efternavn DESC

Hvor du får 50% af tabellens poster fra bunden. Du kan stille et kriterie i din forespørgsel på denne måde:

SELECT efternavn, fornavn

FROM medlem

WHERE efternavn="Hansen"

Eller hvad med SELECT by

FROM postnr

WHERE postnr>=9500

Den kan udbygges til

SELECT by

FROM postnr

WHERE postnr >= 9500 AND postnr < 9850

Page 92: Sonne Huse

Programmering med C#

Side 92 af 107 sider

Eller måske SELECT postnr, by

FROM postnr

WHERE postnr >= 9500 AND postnr < 9850 OR by="Randers"

Når du skal sætte et kriterie på, har du følgende operatorer til din rådighed: = Lig med > Større end < Mindre end >= Større end eller lig med <= Mindre end eller lig med <> Forskellig fra Prøv at skrive

SELECT efternavn

FROM medlem

WHERE (LEFT(efternavn,1) = 'H')

i dette tilfælde vil dit output være de poster hvor det første bogstav er H. Du kan også prøve med SELECT efternavn

FROM medlem

WHERE (RIGHT(efternavn,1) = 'n')

Så skal det sidste bogstav være n. Der findes også nogle specielle operatorer _ Enhver character(enkelt tegn). LIKE ’a_’ accepterer ”at” og ”af”, men ikke ”alt”, da der

er mere en én character

% Enhver string bestående af 0 eller flere characterer. LIKE ’%t% accepterer ”at”, ”hat” og ”torsdag”, men ikke ”hockey”, da der ikke er et t i ordet. I Access skal % erstattes af *

[ ] Alle specifikke characterer i et forløb eller et sæt. LIKE ’[a-c]at’ accepterer ”cat” og ”bat”

men ikke ”mat”. Der er også denne mulighed: LIKE ’[ab]at’ accepterer ”bat” men ikke ”cat” [ ^ ] Alle characterer, som ikke er i et forløb eller sæt. LIKE ’[^c]’ accepterer ”bat” og ”kat” men

ikke ”cat” Du kan skrive

SELECT efternavn, fornavn

FROM medlem

WHERE (LEFT(efternavn,1) BETWEEN 'A' AND 'H')

Page 93: Sonne Huse

Programmering med C#

Side 93 af 107 sider

SELECT efternavn, fornavn

FROM medlem WHERE (efternavn= "Andersen" OR fornavn="Henning")

Page 94: Sonne Huse

Programmering med C#

Side 94 af 107 sider

Databinding i ASP.NET

Introduktion DataSources ASP.Net kommer med flere forskellige kontroller, som bruges i forbindelse med databinding og som henter data fra forskellige datasources. Disse kontroller er: SqlDataSource tillader connections til de fleste relationelle databaser. SQL refererer til

databaser, som understøtte SQL-sproget. Denne kontrol bruger data provider, som er lavet til Microsoft SQL Server. Der er også lave providere til andre databaser, fx Oracle, og en OLEDB-provider, som er en gammel standard, der arbejder sammen med flere andre databaser, som fx MySQL og SAP.

AccessDataSource En speciel udgave af SqlDataSource, som er skrevet specielt til Access-

databaser. XMLDataSource Tillader connections til XML datasourcer. SiteMapDataSource En speciel udgave af XMLDataSource, som er skrevet specielt til

SiteMaps i ASP:NET. ObjectDataSource Tillader connections til egne objekter. DataBound kontroller Databound kontroller er linket mellem brugeren og DataSourcekontrollerne. De bruges til at vise dataene med. Der er flere forskellige typer af DataBound kontroller, som hver især er optimeret til en bestemt type af DataSource. Dvs. de er optimeret til fx tabuler data, data i en træstruktur eller en brugerdefineret klasse. Som eksempel kan nævnes XML data som er organiseret i en træ-struktur og derfor er optimeret til XMLDataSources. Tabeller er perfekte til SQL-databaser. P.g.a dette er der 4 typer af DataBound kontroller:

1. Tabular Controls – Laver en klassisk HTML-tabel, hvor flere poster viser på rækker. a. GridView b. DataList

2. Single Record Display Controls – Som navnet siger, viser disse kontroller kun en enkelt post

af gangen, der kan så være navigationsmuligheder til at gå til næste/forrige/sidste eller første post i databasen.

a. DetailsView b. FormView

3. Selection List Controls – Disse kontroller er optimeret til, at accepteret et valg fra brugeren.

De viser typisk et felt fra databasen med mulighed for at vælge fra fx en dropdownliste a. ListBox b. DropDownList

Page 95: Sonne Huse

Programmering med C#

Side 95 af 107 sider

4. Tree Controls – Kontroller, som er optimeret til at vise data fra en træ-struktur. a. Menu b. TreeView c. SiteMapPath

I denne tabel kan du se forskellen mellem de forskellige typer:

Control Primær Data Struktur Kapacitet Beskrivelse GridView Tabel Læse – Redigere • Særskilte kolonner

for hvert felt • Værdier i felterne

står i hver deres celle

• Viser flere rækker i et gitter

• De eksisterende poster kan redigeres

DataList Tabel eller træ-struktur Læse – Redigere • Alle felter i samme celle

• Viser flere poster i et gitter

• Opretter nye poster for GriedView

Repeater Tabel eller træ-struktur Læse • Alle felter i samme celle

• Viser flere poster i et gitter

• Opretter nye poster for GriedView

DetailsView Tabel eller træ-struktur Læse – Redigere - skrive • Viser en post • Standard struktur

er påkrævet • Redigere

eksisterende poster • Opretter i nye

poster FormView Tabel eller træ-struktur Læse – Redigere - skrive • Viser en post

• Standard struktur er IKKE påkrævet

• Redigere eksisterende poster

• Opretter i nye poster

DropDownList Tabel eller træ-struktur Læse Liste med

Page 96: Sonne Huse

Programmering med C#

Side 96 af 107 sider

afgrænsede(få) poster Bruges til brugeren kan vælge en værdi fra listen

ListBox Tabel eller træ-struktur Læse Liste med afgrænsede(få) poster Bruges til brugeren kan vælge en værdi fra listen

SiteMapPath Træ-struktur Læse Viser en liste med navne(links) på siderne fra startsiden til nuværende side

Menu Træ-struktur Læse Viser en menu med øverste niveau synligt og mulighed for at se underliggende niveauer en ad gangen

TreeView Træ-struktur Læse Viser en menu med øverste niveau synligt og mulighed for at se et eller flere underliggende niveauer

Når du trækker en Data Control ind på siden, kan du i kontrollens Smart Tag vælge en datasource. Hvis du har lavet Data Source Control på siden inden, kan du vælge den i drop-downlisten eller kan du vælge at oprette en ny Data Source. Du kan ændre udseende og egenskaber ved kontrollen i kontrollens Smart Tag, i Properties-vinduet eller du kan ændre i Source View. Du har også mulighed for at bruge din code-behind-fil til at skrive kode til kontrollen. Opgave 1 – Data Source Control

1. Opret nyt web-site – navngiv DataSource 2. Højreklik på mappen App_Data og vælg Add New Item. 3. Vælg SQL-database, navngiv test.mdf. Se Figur 12

Page 97: Sonne Huse

Programmering med C#

Side 97 af 107 sider

Figur 12

I Server Explorer i venstre side af skærmen, kan du se din nye database. Den har intet indhold endnu. Det skal vi have ændret på.

4. Højreklik på Tables under test.mdf og vælg Add New Table. Opret følgende felter(se Figur 13:

Feltnavn Datatype

ID Unique identifier Navn Text Hold Text Role Text

Figur 13

Page 98: Sonne Huse

Programmering med C#

Side 98 af 107 sider

5. Luk tabellen og navngiv den Users.

6. Højreklik på tabellen og vælg Show Table Data.

7. Udfyld tabellen med min. 5 poster. Luk tabellen, den gemmer automatisk.

8. Tilføj en ny web-form til web-siten – navngiv DataSource.

9. Træk en SqlDataSource kontrol ind på siden fra ToolBoxen(Data)

10. I kontrollens Smart Tag klik Configure Data Source og vælg test.mdf i dropdownlisten se . Klik Next.

Figur 14

11. Fjern flueben i Yes Save Connectionstring as og klik Next

Page 99: Sonne Huse

Programmering med C#

Side 99 af 107 sider

Figur 15

12. Sæt flueben ud for * for at vælge alle kolonner – Klik Next.

13. Klik på knappen Test Query og dine poster fra databasen fremkommer i vinduet. Klik

Finish

Skift til Source View og se koden som er blevet tilføjet din side

<asp:SqlDataSource ID="SqlDataSource1" runat="server"

ConnectionString="<%$ ConnectionStrings:ConnectionString %>"

SelectCommand="SELECT * FROM [users]"></asp:SqlDataSource>

14. Tryk F5 for at se siden i browseren. I browseren er der intet at se på siden, og dette er også korrekt for Data Sourcen er kun linket mellem siden og databasen. For at se data, skal du bruge en Data kontrol. Det vil vi nu prøve

15. Træk en GridView ind på siden og vælg din DataSource i dropdownlisten. Tryk F5 for at se resultatet i browseren.

Da du lavede din DataSource kontrol, kunne du vælge at gemme din ConnectionString. Hvis du havde valgt dette, var den blevet gemt i din web.config-fil med denne kode:

<connectionStrings>

Page 100: Sonne Huse

Programmering med C#

Side 100 af 107 sider

<add name="ConnectionString" connectionString="Data

Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test.mdf;Integrat

ed Security=True;User Instance=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

16. Prøv at slette din DataSource kontrol og opret en ny, hvor du vælger at gemme din

ConnectionString – Test siden og se koden i din web-config. Der er 2 fordele ved at placere din ConnectionString i web.config. Først og fremmest skal du ændre et sted, hvis databasen flyttes til en anden server, og dernæst er den gemt væk, således du ikke behøver at skrive brugernavn og password på dine webforms(de vil aldrig vises i browseren, da dette eksekveres på serveren).

Hvad betyder de forskellige ting i ConnectionString? <connectionStrings>

<add name="ConnectionString" connectionString="Data

Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\test.mdf;Integrat

ed Security=True;User Instance=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

Det første du ser, er navnet på din string. I dette tilfælde er navnet ConnectionString, men det er op til dig, at bestemme.

name="ConnectionString

Det næste fortæller hvilken server databasen er placeret på. Punktummet foran backslash betyder, at det er en lokal server

Data Source=.\SQLEXPRESS

Så kommer navnet på databasen. Her kunne i stedet stå stien i Stifinderen

AttachDbFilename=|DataDirectory|\test.mdf

Og til sidst typen af sikkerhed

Integrated Security=True;User Instance=True"

Til allersidst er navnet på den data provider, der skaber forbindelsen. I dette tilfælde en SqlClient. Dette kunne også være fx til en Oracle-database, men er det til en Sql-database, kan provideren udelades.

Page 101: Sonne Huse

Programmering med C#

Side 101 af 107 sider

Data-Bound Kontroller Der er 2 krav for at få vist data fra en database på en webform. Der skal være en DataSource og en Data-Bound kontrol. Du kan tilføje en Data-Bound kontrol på 3 måder:

• Tilføje den efter du har tilføjet en Data Source • Tilføje den direkte og lad dig guide gennem opsætningen af en Data Source • Trække et felt direkte fra en tabel ind på en webform

Når du tilføjer en kontrol til en webform, vil der altid være et Smart Tag, som hjælper dig med at connecte til din Data Source – eller oprette en ny! I Smart Tag har du også mulighed for at tilføje eller fjerne felter via Edit Columns. Du har også muligheden for at skrive i Source View.

GriedView Et GriedView bruges til at vise posterne fra en database i en tabel på en side. Med mindre du selv definere andet, vil et GriedView som standard vise alle felter. Som alle andre DataBound Controller, kræver GriedView en DataSource. GriedView er optimeret til at vise data i en tabel fra databaser som SQL og Access. Her er et eksempel på et GridView:

<asp:GridView ID="GridView1" runat="server"

AutoGenerateColumns="False" DataKeyNames="FixtureID"

DataSourceID="SqlDataSource1">

<Columns>

<asp:BoundField DataField="FixtureID"

HeaderText="FixtureID" InsertVisible="False"

ReadOnly="True" SortExpression="FixtureID" />

<asp:BoundField DataField="FixtureDate"

HeaderText="FixtureDate" SortExpression="FixtureDate" />

<asp:BoundField DataField="FixtureType"

HeaderText="FixtureType" SortExpression="FixtureType" />

<asp:BoundField DataField="GoalsFor"

HeaderText="GoalsFor" SortExpression="GoalsFor" />

<asp:BoundField DataField="GoalsAgainst"

HeaderText="GoalsAgainst" SortExpression="GoalsAgainst" />

<asp:BoundField DataField="Notes" HeaderText="Notes"

SortExpression="Notes" />

<asp:BoundField DataField="Opponents"

HeaderText="Opponents" SortExpression="Opponents" />

</Columns>

</asp:GridView>

Page 102: Sonne Huse

Programmering med C#

Side 102 af 107 sider

Som du kan se, er der et <asp:BoundField Datafield…> for hvert felt fra tabellen. Der er en HeaderText for at lave en overskrift til kolonnen, og en SortExpression, som bruges hvis du ønsker at tillade brugeren at sortere posterne i stigende eller faldende orden. I det tilfælde skal du blot tilføje AllowSorting=true i <asp:GriedView…> Der er også mulighed for at lave paging. Her sætter du AllowPaging=”true” og Pagesize=”3”, hvis du ønsker 3 poster pr side. Af andre interessante egenskaber kan nævnes:

• NextPrevious – viser kun mulighederne Next og Previous ved paging • Numeric – viser alle sidenumrene, så man kan klikke sig direkte ind på side 4 fx Her bruger

du PageButtonCount til at sætte antallet af sider • NextPreviousFirstLast – som navnet antyder viser den mulighederne Next, Previous, First

og Last ved paging • NumericFirstLast – som Numeric men med 2 yderligere links til First og Last

Datalist & Repeater Til forskel fra GridView, som viser hvert felt fra en post i hver sin celle, viser DataListen og Repeateren en hel post i en celle. Forskellen mellem de to kontroller består i mulighederne for formattere. Med Datalisten følge flere skabeloner, som du kan vælge, hvor Repeateren er fuldstændig formattering. Opgave 2

1. I Server Explorer under test.mdf, marker mappen Tables – højreklik og vælg Open Table definition. Tilføj et nyt felt til tabellen – navn=Image – type=Text.

2. Skift til Show Table Data og tilføj et billede til dine poster.

3. Tilføj ny webform til din web-site – navn Galleri.aspx.

4. Træk en Datalist ind på siden. I Smart Tag vælger du Choose DataSource – new

DataSource.

5. Markér Database i dialogboksen og behold det foreslåede navn på connectionen. Klik OK

6. Vælg ConnectionString i næste trin og klik Next.

7. Vælg felterne Navn, Hold, Image. Klik Next og Test Query

8. Klik Finish.

9. Tast F5 og test siden i browseren. Du kan se hver post bliver vist samlet i en celle. Billedet kan ikke se, men det skal vi prøve at ændre.

10. Stop debugging og i kontrollens Smart Tag vælger du Edit Template.

Page 103: Sonne Huse

Programmering med C#

Side 103 af 107 sider

11. Slet label image og teksten image. Se Figur 16

Figur 16

12. Træk en image-kontrol ind, hvor du slette det foregående. I image-kontrollens Smart Tag

vælg Edit Databinding. Markér ImageUrl og bind til feltet Image. Se Figur 17

Figur 17

13. klik OK

14. Tryk F5 og test siden – den viser stadig ikke billeder.

15. Tilføj en ny mappe i roden af din web-site – navn=Images

16. Tilføj billederne fra databasen til mappen

17. Gå til SourceView og find koden der skal vise billeder

Page 104: Sonne Huse

Programmering med C#

Side 104 af 107 sider

<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("image") %>' />

Som det fremgår henviser der til billedet, men ikke til stien, hvor det er placeret.

18. Ændr koden på denne måde <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("image", "~/images/{0}") %>' />

Her tilføjer du stien ~betyder fra web-sitens rod og {0} er en pladsholder for billedet

19. Test siden

20. Undersøg Datalistens properties i Properties-vinduet. Hvis du vælger at bruge en Repeater i stedet for DataListen, fungerer den på nøjagtig samme måde, her skal du bare selv tilføje en <itemtemplate> i SourceView og definere hvad den skal indeholde. Med GriedView, Datalist og Repeateren kan du vise og redigere poster, men ikke oprette nye poster.

Page 105: Sonne Huse

Programmering med C#

Side 105 af 107 sider

Mere SQL – Insert, Update, Delete Med sql-statements kan du også tilføje nye data fra aspx-sider til din database. Til det skal du bruge kommandoen INSERT:

INSERT INTO Elever (Navn, Adresse, Postne)VALUES (“Elvis”, ”Hawaii”,

9000);

Typisk, har tabellen et primærfelt, som er unikt for tabellen. Hvis dette felt er defineret som ”identity”-felt med automatisk tildeling af et nr, skal du ikke indsætte noget i dette felt med dit INSERT-statement. Det sker automatisk. Du kan også opdatere en eksisterende post med sql. Til det bruger du UPDATE:

UPDATE Elever SET postnr = 9500 WHERE ID = 5;

Du er nødt til at fortælle hvilken post, der skal opdateres, derfor sætter du et kriterie på med WHERE

DELETE FROM Elever WHERE Navn = ”Nils”;

Denne kommando sletter en post.

Page 106: Sonne Huse

Programmering med C#

Side 106 af 107 sider

Indsætte, opdatere og slette med .NET Som tidligere nævnt giver nogle af kontroller i .NET mulighed for at indsætte, redigere og slette data. Hvis du bruger den indbyggede funktionalitet i VS, skal du blot, når du opretter din datasource, husker at bruge de avancerede muligheder:

Page 107: Sonne Huse

Programmering med C#

Side 107 af 107 sider

Dette er kun muligt, hvis du har valgt feltet med primær nøglen. VS generer automatisk INSERT, UPDATE og DELETE statements for dig, og du kan bruge dem i forbindelse med dine datakontroller.