Sunteți pe pagina 1din 272

Medii de dezvoltare curs 1- Informatic Economic, an III

Introducere in .NET Framework

Cristian Bologa

Obiective
Deprinderea principalelor concepte ale programarii in .NET
Framework 4.0
Programarea aplicatiilor Windows utilizand WPF
Programarea aplicatiilor Web utilizand ASP.NET
Programarea accesului la date

Organizare
Laborator: 418/419/420
Echipa:

Lect. Dr. Cristian Bologa, As. Dr. Alexandru Stan, Drd. Florina Covaci

Medii de dezvoltare
Cerine, evaluare
Prob teoretic: 40% - din care
Examen scris n sesiune: 75%
2 teste scrise la finalul cursurilor: fiecare 12.5%
Testele scrise: materia predata pana la momentul testului

Proiect: 40%, examinat prin sustinere in sesiune


Evaluarea activitii de laborator: 20%
Necesar: minim 5 la fiecare prob de examen

Bibliografie
v handouts la fiecare curs din Microsoft Official Curricula
v Orice alt material la dispozitia dvs este potrivit

Cuprins

Introducere in .NET Framework 4.0


Crearea proiectelor utilizand Visual Studio
Scrierea aplicatiilor in C#
Documentarea aplicatiilor
Debugging

Introducere n .NET Framework 4.0

Common Language Runtime (CLR)


Mediul de executie a programelor in .NET Framework
Mediu robust si securizat

Gestioneaza executia programelor


Simplifica procesul de dezvoltare software
Furnizeaza servicii comune pentru programele executate:

Managementul memoriei
Gestiunea tranzactiilor
Comunicarea intre procese, multithreading
Si altele

CLR suport pentru mai multe limbaje de


programare
Permite scrierea programelor in mai multe limbaje de programare
echivalente
Visual Studio 20xx furnizeaz compilatoare pentru C#, C++,
Visual Basic si F#
Modelul de compilare in 2 faze:
Codul surs este compilar intr-un limbaj intermediar MSIL
Codul MSIL este executat de ctre CLR

Biblioteca de clase

Furnizeaza clase reutilizabile care pot fi folosite de ctre programatori


Se asigura o fundatie comuna de functionaliti care pot fi folosite
Dezvoltatorii nu trebuie sa re-inventeze logica unor unelte clasice
Clasele din biblioteca de baza pot fi extinse prin procesul de motenire

Medii de dezvoltare suportate


ASP.NET aplicatii web server-side
Windows Presentation foundation (WPF) aplicatii client Windows
cu grafic bogat
Windows Communication foundation (WCF) aplicatii orientate pe
servicii
Vor fi abordate la disciplina Programare pe componente

Windows Workflow foundation (WWF) aplicatii bazate pe descrieri


de procese de tip workflow
Descrieri de tip workflow vor fi abordate la disciplina Sisteme pentru
modelarea proceselor de afaceri

10

Obiectivele limbajului C#

Este limbajul de programare dedicat pentru .NET Framework


Utilizeaza o sintax similar cu C/C++ i Java
C# este standardizat prin ECMA-334 C# Language Specification
Visual Studio furnizeaza editor de cod, compilator, template-uri
pentru proiecte, wizards, debugger, si alte unelte

11

Assembly
Prin compilarea codului sursa C# se genereaz fisiere executabile
care ruleaz pe CLR => assembly
Contin cod intermediar MSIL (Microsoft intermediate language)
CLR ruleaz cod MSIL indiferent de limbajul surs in care este scris
programul
Assembly:
sunt blocurile de baz a aplicaiilor .NET Framework
Reprezinta unitatea de baz pentru deployment, controlul versiunilor reutilizare si
securitate
Putem gandi un assembly ca o colecie de tipuri si resurse care conlucreaz si
formeaz o unitate logic de functionalitate

2 tipuri de assembly:
program executabil (.exe)
Librarii (.dll): pentru modularizarea dezvoltrii codului si descompunerea
aplicaiei in componente logice (reutilizabilitate)
12

Assembly (II)
Contin informaie legat de controlul versiunii
Fiecare assembly este semnat digital
Includerea informaiei legate de versiune permite realizarea
pailor necesari pentru upgrade-ul aplicaiei
Semnatura assemblyurilor asigura faptul c acestea nu vor fi
modificate sau inlocuite de o implementare alternativ
Semnatura asigura pentru fiecare assembly un strong name
Manifest-ul assembly-ului:
Contine informatia legata de versiune si semnatur
Contine metadata care descrie obiectivul (scopul) assembly-ului si referine la
alte clase si resurse
Este stocat intr-un fiier portable executable (.pe)

Versiunea (stocat in manifestul assembly-ului) contine: major


version, minor version, build number i revision number
13

Semnatura assembly-ului
Protejeaza assembly-ul de modificari neautorizate
Permite includerea unui assembly semnat in Global Assembly Cache
Astfel se pot partaja assemblyuri intre mai multe aplicaii

Se garanteaza un nume unic unui assembly


Pentru semnare, se foloseste Sign Tool (furnizat de Visual Studio)

14

Executia assemblyurilor
CLR incarc acele assemblyuri referite de ctre aplicaie
ClassLoader: pentru localizarea si incarcarea assemblyurilor

Verific i compileaz assemblyurile in cod masin


MSIL-to-native compiler
Just-in-time compilation: codul MSIL este compilat in executabil chiar inainte
de execuie

Ruleaz executabilul
CodeManager: incarca executabilul si executa metoda Main
Garbage Collector: elibereaz automat memoria obiectelor care nu mai sunt
utilizate de ctre aplicaie
Exception Manager: furnizeaz gestiunea excepiilor

15

Unelte furnizate de ctre .NET Framework


Code Access Security Policy Tool (Caspol.exe)
Permite utilizatorilor s modifice politicile de securitate la nivel de
utilizator, masin sau enterprise.
Permite definirea unui set de permisii custom.

Certificate Creation Tool (Makecert.exe)


Permite utilizatorilor s creeze certificate X.509
Aceste certificate sunt folosite pentru semnarea assemblyurilor si definirea
conexiunilor SSL

Global Assembly Cache Tool (Gacutil.exe)


Permite (dez/)instalarea assemblyurilor din GAC, astfel incat mai multe
aplicatii sa le poata utiliza

Native Image generator (Ngen.exe)


Permite imbunatatirea performantelor aplicaiilor .NET. prin precompilarea
assembly intr-o imagine ce contine cod masina specific procesorului
respectiv
CLR pot executa acest cod precompilat in locul compilarii Just-in-time

16

Visual Studio 20xx


IDE care permite dezvoltarea rapid a aplicaiilor (RAD)
Se pot crea interfete GUI complexe in mod rapid

Access la servere si date:


Server Explorer -Permite conectarea la serverele de date i explorarea acestora

Facilitati de debugging:
Furnizeaz o unealt pentru executie pas-cu-pas, breakpoints, urmarirea
executiei

Gestiunea erorilor
Error List Window -Fereastr de erori, acestea sunt produse pe msura scrierii
codului si la build

Facilitai pentru help si documentare


VS are help integrat
Microsoft Intellisense, Code snippets

17

Template-uri de baz in VS

Furnizeaza cod de start de la care se


poate crea in mod rapid o aplicaie
Include pentru utilizare
componentele si controalele
relevante tipului de proiect
Configureaza IDE-ul pentru
dezvoltarea tipului de aplicaie pe
care il dezvoltam
Adaug referinele ctre
assemblyurile relevante (necesare)
respectivului tip de aplicaie

"
"
"
"
"
"
"
"

Console applica9on
WPF applica9on
Class Library
Windows Forms Applica9on
ASP.NET Web applica9on
ASP.NET MVC 2 Applica9on
Silverlight Applica9on
WCF Service applica9on

18

Solutia VS

Reprezinta wrapper pentru proiectele .NET


O solutie VS poate contine mai multe proiecte .NET
O solutie VS poate contine tipuri diferite de proiecte .NET
Fisier .sln: punct de access pentru proiectele din solutie
Fisier .suo: user option file: setrile utilizatorului pentru solutia VS

19

Clase si namespace-uri
.NET Framework respect paradigma obiectual: clase
O clas defineste caracteristica i funcionalitatea unei entiti
Un namespace reprezinta o colecie logic de clase
Namespace-ul este echivalentul packageului

20

Structura unei aplicaii consol

21

Comentarea aplicaiilor
Incepei procedurile prin blocuri de comentarii
Spargeti procedurile lungi in unitti de munc prin blocuri de
comentarii
La declararea variabilelor folositi comentarii pentru a descrie
utilizarea acestor variabile
La utilizarea structurilor de decizie indicai (prin comentarii)
modul de luare a deciziei si logica acesteia

22

Documentarea aplicaiilor
Se folosesc comentarii XML pentru a genera documentatie HELP
pentru aplicaii

23

Taguri pentru documentare


<summary></summary>: furnizeaz o descriere scurt
<remark></remark>: furnizeaz o descriere lung
<example></example>: furnizeaz un exemplu de utilizare pentru
metod, proprietare, sau alt membru al bibliotecii
<code></code>: indic faptul c avem un cod surs
<returns></returns>: documenteaz valoarea sau tipul de return
al unei metode
Csc.exe cu parametrul /doc: genereaz un fisier XML care are codul
XML pentru documentare inclus
In fereastra properties a proiectului (in Solution Explorer) pe tabul
Build se bifeaz XML documentation
Sandcastle Help File Builder -> se folosesc sursele XML pentru a
genera fisiere help .chm

24

Medii de dezvoltare curs 2- Informatic Economic, an III

Crearea interfetelor grace in


.NET Framework

Cristian Bologa

25

Interfata grafic: reprezentarea vizual a aplicaiei


Utilizatorii interfaeaz cu aplicaia prin intermediul interfeei
grafice
Manipuleaz controalele gzduite de fereastra aplicaiei

Windows Forms: baza (istoric) a aplicaiilor Windows


WPF: succesorul Windows Forms
Diferenta fundamental a WPF:
Codul interfeei utilizator este separat de codul aplicaiei

26

Aplicatiile WPF

Fisiere XAML: descriu layoutul componentelor in format XML


Fisiere XAML.cs: contin codul din spatele designului
Fiecare XAML are o clas care descrie functionalitatea

Se poate folosi designerul VS pentru crearea interfetei


La run-time, controalele se aseaz pe interfat
Controalele pot fi create / pozitionate / modificate i la run-time

27

Controalele WPF
3 tipuri de controale: individuale, item i layout
Controalele individuale:

Corespund unor controale echivalente din Windows Forms: Button, Label,


TextBox etc.
Au un scop individual in aplicaie
Content controls (controale de continut): afiseaz o varietate de continut

Item controls: grupeaz mai multe itemuri


ListBox, Menu, TreeView
Permit utilizatorului s selecteze un item dintr-o list si s realizeze o actiune pe
acel item

Controale Layout: contin alte controale de orice tip


Furnizeaz logic incorporat pentru aranjarea vizual a acestor controale
Grid, StackPanel, Canvas

28

Controale Content
Deriveaz din clasa ContentControl
Contin un singur element inglobat
Acesta poate fi setat sau citit prin proprietatea Content
Tipul proprietatii Content este Object -> poate fi setat la orice
valoare. Pentru itemurile care nu deriv din UIElement, ele se
afiseaz prin apelarea proprietii toString
Proprietatea Content se poate seta din XAML sau din cod:

<Button Height="23" Margin="36,0,84,15" Name="button2"


VerticalAlignment="Bottom">This is the content string</Button>
button2.Content = "This is the content string";

29

Label i Mnemonic keys


Label: este un container pentru continut
Mnemonic key: mut focusul ctre un anume control la apsarea
alternativ Alt + key
Specificarea unui mnemonic key: _Caracter
Ex: _A
Trebuie s se seteze proprietatea Target a controlului de tip Label
<Label Target="{Binding ElementName=TextBox1}" Height="27"
HorizontalAlignment="Left" VerticalAlignment="Top" Width="51">_Name
</Label>
<TextBox Name="TextBox1" Margin="53,1,94,0"
Height="26 VerticalAlignment="Top">
</TextBox>

30

Controlul Button
Permite utilizatorului s efectueze aciunea click pentru a realiza o
alegere: de ex. Sa inchid o fereastr
Utilizatorul trebuie s scrie handler pt evenimentul Click
Proprietatea isDefault: -daca este True atunci butonul este setat
Default pt GUI (se genereaz evenimentul click la apsarea Enter)
Proprietatea isCancel: -daca este True atunci butonul este considerat
Cancel pt GUI (se genereaz evenimentul click la apsarea Esc)
Setarea unui access key pt buton: prin folosirea _ in Button Content,
la fel ca si mnemonic keys

31

Controlul CheckBox
Mosteneste din clasa ButtonBase
Permite setarea unei optiuni ca fiind On sau Off
Proprietatea isChecked de tipul bool? : permite valorile
booleene si valoarea nedefinit (atunci cand fereastra este
deschis prima data)
CheckBox genereaz evenimentul click la apsarea click de
mouse

32

Controlul RadioButton
Mosteneste tot din clasa ButtonBase
Butoanele Radio sunt grupate astfel incat s se permit
utilizatorului selectarea unei singure optiuni
La apsarea de mouse se genereaz evenimentul Click
In mod uzual, toate butoanele radio dintr-un container sunt in
acelasi grup
Setarea proprietatii GroupName pentru a avea mai multe grupuri
de butoane radio intr-un singur container
Butoanele Radio se pot grupa prin asezarea lor in containere
diferite ,de exemplu in StackPanel

33

TextBlock

Text care apare intr-o fereastr


Pentru a seta proprietatea Text in mod programatic trebuie setat
proprietatea Name

<TextBlock Name="TextBlock1">Here is some text</TextBlock>


TextBlock1.Text = "Here is the changed text";

34

Image
Controlul Image reprezint o imagine care se afiseaz
Proprietatea Source: programatic preia un obiect de tipul
System.Windows.Media.ImageSource
In XAML se poate furniza un identificator de tip URI (Uniform
Resource Identifier)
Fisier local sau resurs web

Proprietatea ImageStrech: determin modul de afiare a imaginii


None: este afisat in dimensiunea original
Fill: imaginea umple dimensiunea controlului
Uniform: imaginea este redimensionat cu pstrarea aspect ratio, nu se face
crop, ins poate aprea spaiu neumplut
UniformToFill: imaginea este redimensionat cu pstrarea aspect ratio, se face
crop pentru a se umple dimensiunea controlului

35

TextBox
Pentru afisare si editare de text
Proprietatea Text: este cea care contine textul afisat/introdus
Proprietatea isReadOnly: permite doar afisare
Proprietatea TextWrapping: pentru afisare / editare intr-un control
pe mai multe linii
Proprietatea VerticalScrollBarVisibility: permite afisarea unui
scrollbar

36

ProgressBar
Se permite afisarea progresului unei operatii mai lungi
Proprietatea isEnabled: daca controlul ProgressBar este activ
isIndeterminate: dac controlul arat progresul real sau un progres generic. La
progres real, controlul va arta valoarea din proprietatea Value
LargeChange: mrimea de adugat/scazut din Value atunci cand se solicit o
schimbare mare
Maximum: valoarea maxim a progressBar-ului. Cand Value == Maximum,
progressbarul este la maxim
Minimum: valoarea minim a progress barului
Orientation: dac controlul este orientat orizontal sau vertical
SmallChange: mrimea de adugat/scazut din Value la o schimbare mic
Value: valoarea afiat de progres bar.
ProgressBar1.Value += 1;

Controlul Slider

Simular cu ProgressBar, folosit pentru a seta o valoare cu mouse-ul intre un


minim si un maxim
Genereaz evenimenul ValueChanged
37

Tab Order pentru controale


Controalele primesc focus pe msur ce utilizatorul apas tasta Tab
Ordinea de accesare a controalelor este ciclica
Se poate seta ordinea in care se transfer focusul (sau Tab Order)
prin setarea proprietii TabIndex in XAML
Controalele care nu au TabIndex stabilit primesc focusul dup cele
cu TabIndex definit

38

Controale item: ListBox

Afiseaz o list de itemuri


Continutul este o list de controale ListboxItem fiecare gzduieste un singur
element
ListBox afiseaz controalele vertical, si eventual pune un scroll vertical dac lista
este lung
Implicit, se poate selecta un singur item din control.

proprietatea SelectedIndex pentru indexul itemului selectat


Proprietatea SelectedItem pentru a returna itemul selectat
Proprietatea IsSelected: pentru a verifica dac un item este selectat
Proprietatea SelectionMode pentru a permite selecia mai multor itemuri (cu Shift pt
itemuri consecutive si cu Ctrl pt itemuri disparate)

ComboBox

Similar cu ListBox, doar c afisarea de face in dropdown list


Poate gzdui o list de stringuri
Poate fi editabil.

39

TreeView
Gazduieste o list de controale TreeViewItem care permite
construirea unui continut de tip arbore
Un treeViewItem are un Header care permite setarea textului
care va fi afisat
Fiecare TreeViewItem gazduieste alte TreeViewItem
Putem face expande sau collapse
Proprietatea SelectedItem: returneaza itemul selectat din
TreeView

40

Menu

Prezinta utilizatorilor o lista de controale asociate cu comenzi


Meniurile sunt afisate ca si liste ierarhice
2 tipuri de meniuri:
Menu: care este vizibil in cadrul GUI
ContextMenu: apare ca si meniu pop-up doar in anumite situatii

Menu
Poate fi pus aproape oriunde in interfata. De obicei este sus, in bara de meniu
Proprietatea IsMainMenu: cauzeaza ca meniul sa fie considerat meniu principal al
ferestrei. Primeste focus cu tasta Alt sau F10
Contine o lista de controale de tip MenuItem

41

MenuItem

Reprezinta o suprafata pe care se poate face Click si are un text asociat


MenuItem: control de tip Item, el poate contine alte elemente de tip
MenuItem
Proprietatea Command: indic comanda asociat cu obiectul MenuItem
Proprietatea Header: textul afisat de meniu
Proprietatea Icon: icoana afisat in stanga intrrii de meniu. La
IsChecked setat true, icoana nu este afisata
Proprietatea IsChecked: permite ca un check sa fie afisat in dreptul
meniului
Proprietatea IsEnabled: meniul este activ sau nu
Proprietatea Items: contine lista de MenuItems a meniului
Cu _ se creaz un mnemonic key
Se recomand sa nu se asocieze comenzi meniurilor care au
componente in lista de Items
42

ContextMenu

Nu au o locatie fixa, ele sunt asociate cu alte controale


Un ContextMenu se atribuie propriettii ContextMenu a celorlalte controale
Meniul contextual este afisat la RightClick pe controlul respectiv sau la Shift+F10
cand controlul are focus
ContextMenu poate fi adaugat ca si resursa in Windows.Resources

43

ToolBar

Prezinta o serie de controale


Poate gazdui controale precum Button, ComboBox, TextBox, CheckBox si
RadioButton
Poate gazdui Separator
Proprietatea OverflowMode: dac in Toolbar se adaug mai multe controale
dect acesta poate afia, atunci cele care nu se pot afisa sunt sterse la
afisare. Ele sunt vizibile in meniul Overflow, care apare in dreapta
Toolbarului la configuratia orizontal
Valori posibile: Always, AsNeeded, Never

ToolbarTray
Este un container pentru controale de tip Toolbar
Se permite resize/move pentru controalele Toolbar plasate in ToolbarTray la
runtime

44

StatusBar

Similar cu ToolBar
Utilizat pentru a gazdui controale care afiseaz informaie
Label , ProgressBar

45

Controale de tip Layout


Permit utilizarea unor tipuri diferite de aranjare a controalelor
Se permite utilizarea unor tipuri de paneluri pentru gruparea
controalelor din GUI
Proprietatea FlowDirection: seteaz directia in care textul sau
celelalte controale se aranjeaza in cadrul controlului Layout printe
Proprietatea Height/Width: inaltimea/latimea controlului. La Auto,
controlul se autodefineste
HorizontalAlignment: VeritcalAlignment: caracteristici de aliniere
orizontal/vertical
HorizontalContentAlignment/ VerticalContentAlignment: seteaza sau
obtine caracteristicile de aliniere orizontal/vertical
Margin: seteaza distanta dintre controalele continute si marginea
containerului
MaxHeight, MaxWidth, MinHeight, MinWidth: dimeniunile max/min
ale controlului
Padding: spatiul dintre un control si elementul child
46

Proprieti attached

Controalele WPF contin informaie necesar pentru propria afisare si


orientare in GUI
Uneori, un control este necesar s defineasc informaie asupra
controlului care il contine
Astfel controlul container ataseaz controalelor continute o serie de
proprieti care pot fi setate de ctre controlul continut

<Button Grid.Row="1" Grid.Column="1"></Button>

47

Panelul Grid
Controalele gazduite de un Grid sunt afisate in ordinea in care apar
in codul XAML
Se pot defini coloane si linii: ColumnDefinition si RowDefinition
Controalele child se pot asigna intr-o linie si o coloan
Proprietile attached Grid.Column si Grid.Row

Se utilizeaz proprietile Margin, HorizontalAlignment si


VerticalAlignment a controlului child pentru afisarea acestuia
Proprietile attached ColumnSpan si RowSpan pentru a permite
afisarea unui control peste mai multe coloane/linii
Controlul GridSplitter
Permite userului sa redimensioneze liniile/coloanele unui grid la
runtime
Trebuie plasat intr-o celul a gridului
Trebuie pozitionat adiacent coltului liniei sau coloanei sau pus intr-o
linie sau coloan individual
48

UniformGrid
Plaseaz controalele intr-un grid de o mrime uniform,
Numrului de linii si coloane se autoajusteaz pe msur ce se
plaseaz controale n grid
Dac se fixeaz numrul de linii si coloane si se adaug mai multe
controale dect poate gzdui controlul de tip UniformGrid,
controalele in plus nu se vor afisa

49

StackPanel
Aseaz controalele continute unul deasupra celuilalt, in ordinea
in care sunt definite.
proprietatea Orientation: pentru a seta orientarea panelului
(StackPanel orizontal). Implicit e vertical
Proprietatea FlowDirection: pentru a seta curgerea controalelor
la afisate. Implicit e LeftToRight

50

WrapPanel

Aseaz controalele continute intr-o linie orizontal, unul langa celalalt,


pn se umple tot spaiul disponibil
Apoi se creaz o linie nou in care se adaug controalele care nu incap
in prima linie samd.
Se foloseste controlul de tip WrapPanel pentru controalele care pot fi
Resized la run-time prin drag-drop

51

DockPanel

Este un container care permite legarea controalelor de colturi.


Echivalent proprietii Dock din WindowsForms
Proprietatea attached Dock: specific modul de legare a controlului child de
panel
Top, Bottom, Left, Right

Proprietatea LastChildFill setata pe True: ultimul control va afisat de panel


va umple tot spatiul panelului
Ordinea in care controalele sunt adaugate in panel este esential pentru
afisarea controalelor continute

52

Canvas

Container care permite pozitionarea absolut a controalelor continute


Proprieti attached: Top, Bottom, Right, Left. Indic distanta dintre latura
specificat i latura corespondent a controlului continut

<Canvas>
<Button Canvas.Top="20" Canvas.Left="30">Button</Button>
</Canvas>

La resize, controalele continute isi mentin distanta setat fat de laturile


controlului Canvas
Controalele Canvas pot contine alte paneluri in interiorul lor.
Panelul definit ultimul este afisat deasupra
Proprietatea attached ZIndex: pentru a se seta ordinea de afisare a
controalelor overlapping
Cele cu Zindex mare se afiseaz deasupra

53

Accesarea programatic a controalelor


continute
" Proprietatea Children: colec9e care expune controalele con9nute
Button aButton;
aButton = (Button)grid1.Children[3];

Alinierea controalelor
" Se poate face la designTime cu u9lizarea snaplines

54

Folosirea resurselor
Resurse: obiecte sau fiiere pe care aplicaia le utilizeaz dar care nu au
fost create in aplicaie (ex: imagini, fisiere text mari)
Resurse binare: folosite atat in Windows Forms cat si in WPF
WPF defineste conceptul de resurs logic

Se permite definirea obiectelor care se utilizeaz in aplicaie


Se permite partajarea acestor obiecte intre elementele aplicaiei

55

Resurse binare

Permite compilarea unor fisiere binare mari in assemblyul aplicaiei si apoi


utilizarea acestora in aplicaie
Pentru a ingloba o resurs binar in aplicaie:
1. din meniul Project se apeleaz Add new Item
2. se selecteaz fisierul care se adaug in proiect. Se da Add
3. in fereastra Properties se seteaz proprietatea Build Action la Resource

56

Utilizarea imaginilor ca resurse


Clasa Image poate lucra direct cu resurse inglobate
Trebuie transmis calea ctre fisierul imagine
<Image Source="myFolder/myPic.bmp" Margin="17,90,61,22"
Name="Image1" Stretch="Fill"/>

In mod general, se poate lucra cu URI:


pack://<Authority>/<Folder>/<FileName>

<Authority> poate fi
Aplication,,, : resursa se afla in assemblyul aplicaiei
siteOfOrigin,,, : resursa trebuie cutat in situl de origine a aplicaiei

Se pot utiliza resurse din alte assemblyuri


pack://application:,,,/<AssemblyName>;component/<Folder>/
<FileName>

57

Fisiere continut

Nu toate fisierele externe pe care le utilizam dorim s le inglobam in


aplicaie ca si resurse
Dac aceste fisiere isi schimba continutul frecvent, atunci inglobarea ca si
resurse va determina necesitatea de a recompila aplicaia la fiecare
modificare de continut a fisierului
Pentru a dauga fisiere continut in aplicaie
1. din meniul Project se apeleaza Add new item
2. se selecteaza fisierul care se adaug in aplicaie, se da Add
3. In fereastra Properties se seteaza proprietatea BuildAction a fisierului la
Content
4. In fereastra Properties la proprietatea Copy to Output Directory se
seteaza Copy Always

58

Resurse adaugate manual

Metoda Application.GetResourceStream
Metoda returneaza un obiect de tipul
System.Windows.Resources.StreamResourceInfo, care are 2 proprieti
ContentType tipul de continut
UnmanagedMemoryStream datele binare (raw) ale resursei

Resursa poate fi folosita programatic de exemplu ca un stream de


IO de unde se citeste

59

Crearea de dll-uri cu resurse


Se pot crea dll-uri care s contin doar resursele compilate
1. in VS se creaz un proiect cu template-ul Empty Project
2. in solution explorer se d click dreapta pe numele proiectului si se
selecteaz Properties , apoi Project Properties . In tabul Application se
seteaza Application Type la Class Library
3. din meniul Project se adaug resursele la proiect cu Add Existing Item
4. la resursele din proiect, din fereastra Properties, proprietatea Build
Action se selecteaz Embedded Resource
5. in meniul Build se selecteaza Build <application>

60

Accesarea dll-ului cu resurse


Pentru a accesa programatic dll-ul cu resurse
1. se obtine numele assembly-ului
System.Reflection.AssemblyName aName;
aName = System.Reflection.AssemblyName.GetAssemblyName("C:\
\myAssembly.dll"));

2. Se foloseste obiectul AssemblyName pentru a incarca assemblyul


System.Reflection.Assembly asm;
asm = System.Reflection.Assembly.Load(aName);

3. Se acceseaz numele resursei folosing Assembly.GetManifestResourceName


si dup aceea se acceseaza streamul resursei utilizand
Assembly.GetManifestResourceStream
String res[] = asm.GetManifestResourceNames();
pictureBox1.Image = new
System.Drawing.Bitmap(asm.GetManifestResourceStream(res[0]));

61

Resurse logice

Putem defini obiecte in XAML care nu fac parte din arborele vizual dar sunt
disponibile pentru a fi utilizate in interfata GUI
Avantajele definirii de obiecte in sectiunea de Resources fat de definirea
unor obiecte la fiecare utilizare:
Se castiga in gradul de reutilizare
Se castiga in flexibilitate prin separarea obiectelor folosite in interfata de interfata
GUI. Astfel se poate face refactoring la interfata fara a fi necesar reproiectarea
acesteia ex: colectii diferite de resurse pt aplicatii localizate

Declararea unei resurse se face prin adaugarea acesteia la colectia de


resurse: - atentie la numele resursei: definit cu x:Key

<Window.Resources>
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="CornflowerBlue" Offset="0" />
<GradientStop Color="Crimson" Offset="1" />
</RadialGradientBrush>
</Window.Resources>

Resursa se poate defini doar intr-un Grid, si astfel nu e disponibil in intreaga


fereastr

62

Resurse la nivel de aplicaie

Se pot defini resurse accesibile de ctre toate obiectele din aplicaie

<Application x:Class="WpfApplication2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<SolidColorBrush x:Key="appBrush" Color="PapayaWhip" />
</Application.Resources>
</Application>

Accesarea resursei in XAML:


{StaticResource myBrush}
{DynamicResource myBrush}

Diferenta:
resursele referite static sunt regasite doar o singur data si utilizate pe toata
durata de viat a resursei
Resursele referite dinamic sunt achizitionate la fiecare referire a obiectului care
le utilizeaz

63

Dictionare de resurse

1.
2.

Un dictionar de resurse este o colectie de resurse care este salvata intr-un


fisier XML separat si care poate fi importat in aplicatie
Dictionarul de resurse poate fi util pentru partajarea resurselor intre aplicaii
Crearea unui dictionar de resurse:
din meniul Project se selecteaza Add Resource Dictionary. Se da un nume
dictionarului si se da Add
se adaug resurse in dictionarul deschis in mod XAML

Concatenarea a 2 dictionare de resurse


Se face prin adaugarea unei referinte catre fisierul dictionar in colectia
ResourceDictionary.MergedDictionaries
Regsirea unei referintei la o resurs:
Metoda FindResource apelat cu cheia resursei (Key)
Metoda poate fi invocata de la orice control care are access la resurs

64

Medii de dezvoltare curs 3- Informatic Economic, an III

Evenimente si comenzi

Cristian Bologa

Cluj-Napoca - 25 Noiembrie 2015

65

Arhitectura de gestiune a evenimentelor

Introdus in Windows Forms


Fiecare eveniment are
un obiect (control) trimittor care arunc (lanseaz) evenimentul
un obiect (control) receptor care are metoda handler a evenimentului

Delegate: un obiect intermediar intre trimitor i receptor


Este necesar pt ca trimitorul nu tie ce procedur va gestiona evenimentul
Prin delegate se creaz metodele care sunt utilizate (delegate) s rspund
la eveniment
Un delegate memoreaz o referin ctre metoda care va gestiona
evenimentul

Definete numele handlerului si tipul argumentelor

Sunt multicast -> pot memora referinte ctre mai multe handlere
Functioneaz ca si un dispecer intre clasa care arunc evenimentul prin
gestionarea unei liste de handlere de evenimente

66

Lucrul cu delegates

1. declararea delegate-ului

2. declararea evenimentului gestionat prin delegate


3. scrierea metodei care s rspund la eveniment (in clasa controlului care
rspunde la eveniment)
4. legarea evenimentului de handlerul su

public delegate void EventHandler(object sender, EventArgs e);

67

Handlere de evenimente
Metode legate de evenimente
La aparitia evenimentului, se execut codul din handler

Argumentele handlerului
Un obiect care a aruncat evenimentul (sender)
Un obiect care contine informatie specifica evenimentului (de tip EventArgs)

68

Adaugarea / stergerea de handlere


In designer:
se selecteaza controlul dorit
In fereastra de events, se selecteaza evenimentul care se
doreste a fi prins

La runtime

69

Evenimente si tratarea evenimentelor

Eveniment: un mesaj trimis de ctre un obiect la care programul rspunde


prin executarea unei buci de cod
Evenimentele pot fi lansate de ctre controale sau alte pri ale interfeei
utilizator

Evenimente rutate: un eveniment creat de ctre un control s apar la un


alt control dintre containerele in care st controlul surs
Se permite astfel programatorului s decid nivelul la care va prinde evenimentul
lansat in interfaa grafic
Se simplific scrierea codului si se asigur consisten la tratarea evenimentelor

Tipuri de evenimente rutate:


Directe
Bubbling
De tip tunel

70

Evenimente directe
Sunt similare evenimentelor din Windows Forms
Evenimentul este aruncat (si poate fi prins) doar la controlul de
origine (de la care provine)
Nu exist ansa ca evenimentul s fie prins la un control de nivel
superior

71

Evenimente bubbling

Sunt aruncate de ctre controalele unde ii au originea i apoi de ctre fiecare


control container in care rezid controlul de origine
Evenimentele sunt prinse si tratate mai inti la control i apoi la containerul care
il conine

Evenimente de tip tunel


Actioneaza invers ca si evenimentele bubbling
Este aruncat mai inti de ctre cel mai de sus container din arborele vizual si
apoi in jos de ctre fiecare container pn la controlul de origine
Permit ca evenimentele s fie prinse si tratate mai inti la container si apoi la
control
Astfel de evenimente sunt marcate cu cuvantul Preview (PreviewKeyDown,
PreviewMouseDown)
Evenimentele de tip tunel sunt definite in pereche cu cate un eveniment
bubbling
Mai inti se arunc evenimentul de tip tunel si apoi cel bubbling
Argumentele sunt partajate intre aceste evenimente

72

RoutedEventArgs

Fiecare eveniment include o instan a clasei RoutedEventArgs (sau o clas care


mosteneste RuotedEventArgs)
Aceasta conine informaie despre eveniment si sursa acestuia

Proprieti ale RoutedEventArgs


Handled: dac evenimentul a fost tratat deja sau nu. Prin setarea la True se
poate opri tratarea ulterioar a evenimentelor de tip bubbling sau tunel
OriginalSource: se obtine obiectul care a aruncat prima dat evenimentul (diferit
de Source la controale compozite)
Source: obiectul care a aruncat evenimentul
RoutedEvent: returneaz evenimentul care a fost ridicat. Se foloseste atunci
cand printr-un handler se gestioneaz mai multe evenimente si dorim sa
identificam care eveniment a fost ridicat

Argumentele de evenimente mostenesc din RoutedEventArgs si astfel furnizeaz


informaie suplimentar

73

Ataarea unui handler de evenimente


Se poate face direct in codul XAML prin atasarea numelui metodei la
eveniment
<Button Height="23" Margin="132,80,70,0" Name="button1"
VerticalAlignment="Top" Click="button1_Click">Button</Button>

Evenimente attached: pentru un control se poate atasa un handler


unui eveniment care nu poate fi aruncat de ctre controlul respectiv
<Grid Button.Click="button_Click">
<Button Height="23" Margin="132,80,70,0" Name="button1"
VerticalAlignment="Top" >Button</Button>
</Grid>

Codul de mai sus defineste handler pentru toate butoanele din grid

74

Tratarea unui eveniment de tip tunel sau bubbling

Pentru a inhiba tratarea unui eveniment de tip tunel sau bubbling la un


anumit nivel in ierarhie, se foloseste proprietatea Handled setata pe True
Dac se seteaz Handled la un eveniment de tip tunel, atunci se consider
Handled si evenimentul bubbling pereche

Clasa EventManager - gestioneaz inregistrarea tuturor evenimentelor


rutate

GetRoutedEvents: returneaz un sir de evenimente integistrate in aplicaie


GetRoutedEventsForOwner: returneaz un sir de evenimente inregistrate pentru un
anume element din aplicaie
RegisterClassHandler: inregistreaz un handler de eveniment la nivel de clas
RegisterRoutedEvent: inregistreaz un handler de eveniment la nivel de instan

75

Definirea unui nou eveniment rutat


1. se creaz o definitie static, read-only a evenimentului
public static readonly RoutedEvent SuperClickEvent;

2. se creaz un wrapper pentru evenimentul rutat care il expune ca si un


eveniment traditional .NET Framework
public event RoutedEventHandler SuperClick
{
add
{
this.AddHandler(SuperClickEvent, value);
}
remove
{
this.RemoveHandler(SuperClickEvent, value);
}
}

76

Definirea unui nou eveniment rutat


3. in constructorul clasei care agreg evenimentul, se foloseste EventManager
pentru a inregistra noul eveniment.
Trebuie furnizat numele evenimentului, strategia de tratare a acestuia (direct,
tunelling sau bubbling), si tipul clasei care il detine
EventManager.RegisterRoutedEvent("SuperClick",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Window1));

Ridicarea unui eveniment


Se creaz o nou instan de RoutedEventArgs prin utilizarea metodei
RaiseEvent
RoutedEventArgs myEventArgs = new RoutedEventArgs(myControl.myNewEvent);
RaiseEvent(myEventArgs);

77

Crearea unui handler de eveniment la nivel de clas


Trateaz un eveniment pentru toate instantele din clasa respectiv
Este invocat intotdeauna inaintea handlerelor de evenimente de la
nivel de instan
1. se creaz o metod static de tratare a evenimentului
private static void SuperClickHandlerMethod(object sender,
RoutedEventArgs e)
{
// Handle the event here
}

2. in constructorul static al clasei se creaz un delegate pentru metod

RoutedEventHandler SuperClickHandler = new


RoutedEventHandler(SuperClickHandlerMethod);

3. tot in constructorul static al clasei se apeleaz EventManager.RegisterClassHandler

EventManager.RegisterClassHandler(typeof(Window1),
SuperClickEvent,SuperClickHandler);

78

Evenimente la nivel de aplicaie

Fiecare aplicaie WPF este incapsulat intr-un obiect de tip Application care
furnizeaz un set de evenimente pentru gestiunea ciclului de via al
aplicaie
Evenimente la nivel de aplicaie
Activated: apare cand aplicaia primeste focus de la un alt program (trecem de la
o alta aplicatie la programul nostru)
Deactivated: cand aplicatia las focusul unui alt program
DispatcherUnhandledException: apare cand o excepie nu este tratat in
aplicaie. Se poate gestiona o exceptie negestionat prin setarea
DispatcherUnhandledExceptionEventArgs.Handled la True
Exit: apare cand aplicaia este inchis
SessionEnding: cand se inchide sesiunea Windows adic la logoff sau computer
shutdown
Startup: cand aplicaia este pornit

Evenimentele la nivel de aplicatie sunt evenimente standard .NET


Framework

79

Crearea unui handler de eveniment la nivel de


aplicaie

1. in solution explorer, click dreapta pe App.xaml si se apeleaz view code


2. se creaz o metod pentru a gestiona evenimentul
void App_Startup(object sender, StartupEventArgs e)
{
// Handle the event here
}

3. In XAML, se adaug handlerul de eveniment la declararea tagului Application


<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml" Startup="App_Startup">

80

Comenzi

Taskuri de nivel inalt care sunt executate in aplicaie


Exemplu de comand: Paste: copierea unui obiect din clipboard container
Se permite crearea unei arhitecturi centralizate pentru comenzi, astfel incat
s nu fie nevoie s se scrie cate un handler de eveniment pentru fiecare
posibilitate de apelare a taskului
Se pot asocia orice numr de obiecte UI sau inputuri cu o comand astfel
incat s se lege comanda de un handler care este executat atunci cand sunt
activate controalele
Comanda poate fi dezactivat, atunci elementul de interfat la care
comanda este asociat este si el dezactivat
obiectul Command: obiectul care reprezinta taskul
Sursa comenzii: este controlul care genereaz comanda
Handlerul comenzii: este metoda care se executa la invocarea comenzii
CommandBinding: obiectul utilizat de .NET Framework pentru a tine
evidenta asocierilor dintre surse si handlere
81

Comenzi predefinite

ApplicationCommands
ComponentCommands
EditingCommands
MediaCommands
NavigationCommands

Fiecare din aceste clase expune o varietate de obiecte comanda statice pe


care le putem utiliza in aplicatii; trebuie sa cream binding-uri si handlere
pentru aceste comenzi pt a le putea utiliza in aplicatie

82

Implementarea unei comenzi

1. se decide comanda care se doreste a se utiliza. Poate fi o comand


static expus de .NET Framework sau una custom
2. se asociaz comanda cu un control sau cu un input
3. se creaz metoda care gestioneaz comanda
4. se creaz controlul CommandBinding care leag obiectul Command la
handlerul de comand si optional, la o metod care gestioneaz
Command.CanExecute
5. se adaug CommandBinding la collectia Commands a controlului sau la
controlul Window

83

Invocarea comenzii

Prin asocierea ei cu un control folosind un input sau invocare direct din cod

Asocierea comenzii cu un control

Majoritatea controalelor implementeaz interfata ICommandSource -> se permite ca


acestea s fie asociate cu o comand care este apelat automat cand este invocat controlul

<Button Command="ApplicationCommands.Find" ...>Button</Button>

Invocarea comenzii cu un input


Se pot inregistra evenimente de mouse sau tastatur cu obiecte de tip Command care
invoca comanda cand aceste evenimente apar
ApplicationCommands.Find.InputGestures.Add(new
MouseGesture(MouseAction.LeftClick, ModifierKeys.Control));
ApplicationCommands.Find.InputGestures.Add(new
KeyGesture(Key.Q, ModifierKeys.Control));

Invocarea comenzii din cod


Prin apelarea metodei Command.Execute
ApplicationCommands.Find.Execute(aParameter, TargetControl);

84

Handlere de comenzi

Pentru executarea unui cod atunci cand se invoca o comand trebuie


creat un CommandBinding care leag comanda de un handler
Handler corect al unei comenzi:

private void myCommandHandler(object sender, ExecutedRoutedEventArgs e)


{
// Handle the command here
}

ExecutedRoutedEventArgs este derivata din RoutedEventsArgs si


expune proprietatea Command care returneaz obiectul Command al
comenzii

Crearea CommandBinding
-asociaza o comanda cu un command handler
CommandBinding abinding = new CommandBinding();
abinding.Command = ApplicationCommands.Find;
abinding.Executed += new ExecutedRoutedEventHandler(myCommandHandler);
this.CommandBindings.Add(abinding);

85

Crearea de CommandBinding in XAML


<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Find"
Executed="myCommandHandler" />
</Window.CommandBindings>

86

Comenzi Bubbling

Comenzile se rostogolesc ctre containerele din varful ierarhiei in care rezid


controlul unde se invoca comanda
Fiecare control are propria colecie CommandBinding
Se poate opri rostogolirea procesarea comenzii prin setarea Handled=true

private void myCommandHandler(object sender, ExecutedRoutedEventArgs e)


{
// Handle the command here
e.Handled = true;
}

87

Dezactivarea comenzilor

Comenzile care nu sunt asociate in CommandBinding sunt automat


dezactivate
Fiecare control care are in proprietatea Command asignat o comand
disables devine la randul lui dezactivat
Pentru a dezactiva comenzi care sunt assignate in Command si avem setat si
CommandBinding se utilizeaz Command.CanExecute
Este un eveniment care determin dac o comand se poate executa

1. se creaz o metod s gestioneze evenimentul CanExecute


bool canExecute;
void abinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = canExecute;
}

2. Se seteaz handlerul evenimentului CanExecute a obiectului CommandBinding ctre


aceast metod
abinding.CanExecute += new
CanExecuteRoutedEventHandler(abinding_CanExecute);

88

Medii de dezvoltare curs 4- Informatic Economic, an III

Controale denite de u9lizator

Cristian Bologa

Cluj-Napoca - 2 Decembrie 2015

89

Cuprins

Implementarea controalelor utilizator in Windows Forms


Crearea si aplicarea template-urilor in WPF
Crearea si implementarea controalelor utilizator in WPF
Implementarea dependency properties

90

WPF - Controale compozite

Sunt controale realizate din alte controale


Motenesc din clasa UserControl
Au un designer asociat, deci noul control poate fi realizat in VS, folosind
designerul IDE

Adaugarea unui control compozit din meniu:

1. din meniul Project, se selecteaz Add user control


2. se da numele noului control si apoi Add

Adaugarea unui control compozit din cod

Se creaz o clas care motenete din UserControl

91

Adaugarea de metode, proprieti, evenimente la


un control

Adaugarea unei metode: se scrie o metod nou in clasa


Adaugarea unei proprieti: se scrie o proprietate nou in clas (se scriu
setter si getter); valoarea va fi stocata intr-o variabila membru privat
Adaugarea unui eveniment:
Necesar s fie prezent un delegate care s specifice semntura evenimentului
Se defineste evenimentul folosind event
Evenimentul poate fi apelat (aruncat) utilizand semntura

92

Expunerea unei proprieti


Implicit proprietile sunt private (ex: inaccesibile claselor din alte
asembly-uri)
Trebuie fcute public pt a fi expuse
Configurarea unui control pentru a fi invizibil la Runtime:
Setarea proprietii Visible la true

Setarea unui background transparent:


Proprietatea BackColor se seteaza la Color.Transparent

93

Property attributes

Specificate intre [] inainte de clas / proprietate / metod / eveniment


Specific modul in care controlul va fi interpretat de ctre designerul VS

Permit gruparea proprietilor noi in fereastra Properties


Permit stabilirea valorilor defaut utilizate in design time
Se pot defini editoare custom pentru noile proprieti

Exemple de property attributes: Browsable, Description, Category,


DefaultProperty

Crearea unui Toolbox bitmap -permite specificarea unei iconite in dreptul


controlului de pe Toolbox

Property attribute ToolboxBitmapAttribute


Trebuie setat ctre un bitmap de dimensiune 16x16
[ToolboxBitmap(@"C:\myToolboxBitmap.bmp")]
class myControl : UserControl {}

94

Windows Forms - Controale extinse

Extind functionalitatea controalelor existente in .NET Framework


Se reine funcionalitatea existent i se pot aduga metode i proprieti noi
Se motenete din clasa controlului care se doreste s se extind

Se poate furniza implementare nou unor funcionaliti existente prin suprascriere

protected override void OnClick(System.EventArgs e)


{
Clicks++;
base.OnClick(e);
}

Se poate schimba afisarea (rendering) controlului prin suprascrierea metodei onPaint

95

Windows Forms - Controale custom

Create de la zero
Se mosteneste din clasa Control
Trebuie s se suprascrie metoda OnPaint
Trebuie folosit obiectul Graphics pentru a realiza desenarea
controlului in OnPaint

96

WPF - Template-uri de controale

In WPF controalele sunt lookless: funcionalitatea este complet separat


de modul de afisare a elementului
Putem furnizeaza o nou afisare (appearance) a controlului prin crearea
unui nou template al controlului
Template al controlului: este un document XAML care arat cum va fi afisat
controlul in nivelul de prezentare
Reprezint arborele vizual al controlului, prile componente ale acestuia i
afisarea acestor pri
Definite in cadrul elementului <ControlTemplate>

<Button Height="23" Width="100" Name="Button3">


<Button.Template>
<ControlTemplate>
<Rectangle Fill="RoyalBlue" />
</ControlTemplate>
</Button.Template>
</Button>

97

Template-uri pt controale

Elementul <ContentPresenter>: este placeholder pt proprietatea Content


a template-ului
Content este afisat in locul specificat de ContentPresenter

La elemente de tip List: <ListPresenter>: placeholder pt elementele Item

Crearea template-ului ca si o resurs:


Se pune elementul <ControlTemplate> in cadrul tagului
Windows.Resource

Modul de afisare poate fi aplicat mai multor controale


Pt aplicare se utilizeaz proprietatea Template a controlului
<Button Template="{StaticResource ButtonTemplate}"
Margin="112,123,91,116"
Name="Button1">Button</Button>

98

Interactivitatea controalelor
Controalele interactioneaz cu utilizatorul in diverse modaliti (de exemplu la
mouse rollover deasupra controlului)
ControlTemplate.Triggers: o colecie de triggere a templateului
<ControlTemplate TargetType="{x:Type Button}" x:Key="ButtonTemplate">
<Border Name="Bord1" BorderBrush="Chocolate" BorderThickness="3">
<Grid>
<Rectangle Name="Rect1" Fill="RoyalBlue" />
<Ellipse Name="Elli1" Fill="Red" />
<ContentPresenter HorizontalAlignment="Center VerticalAlignment="Center" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Rect1" Property="Fill" Value="AliceBlue" />
<Setter TargetName="Bord1" Property="BorderBrush" Value="Red" />
<Setter TargetName="Elli1" Property="Fill" Value="Yellow" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
99

Template binding

Leag o proprietate a unui template de o proprietate a template-ului printe

{TemplateBinding <PropertyName>}: se specific numele proprietii din template-ul


parinte de care se doreste legarea

<ControlTemplate TargetType="{x:Type Button}" x:Key="ButtonTemplate">


<Border Name="Bord1" BorderBrush="Chocolate"
BorderThickness="{TemplateBinding BorderThickness}">
....

Se va folosi Binding in loc de TemplateBinding cand proprietatea este de tip

Freezable

...
<Setter TargetName="Elli1" Property="Fill" Value="{Binding
RelativeSource={RelativeSource TemplatedParent},
Path=Background}" />

100

Vizualizarea template-ului unui control


1. se creaz o instant din controlul dorit
Fie vizual utilizand designerul fie din cod

2. se foloseste XamlWriter pentru a se obtine un stream de iesire


unde se poate tipri template-ul
System.IO.FileStream aStream = new
System.IO.FileStream("C:\\template.xml", System.IO.FileMode.Append);
System.Windows.Markup.XamlWriter.Save(aTextBox.Template, aStream);

101

Crearea controalelor in WPF

2 mari categorii:
Controale utilizator (user control): mostenite din UserControl
Controale custom (custom control): mostenite din Control sau ContentControl

Alegerea tipului potrivit de control


Dac funionalitatea unui control predefinit se potriveste in mare msur peste
funcionalitatea dorit => un template nou cu o afisare nou a controlului
Daca funcionalitatea dorit se realizeaz cu o combinaie dintre un control
predefinit si cod nou, => un control utilizator
Dac nu exist un control predefinit sau o combinaie intre un control existent si
cod nou => un control custom

102

Dependency properties

Sunt forma standard a propriettilor in WPF


Permit change notification, animation, mostenirea property values, data
binding si altele
Se pot implementa doar la obiecte care deriveaz din clasa
DependencyObject
Toate elementele WPF deriv din DependencyObject

Daca intr-o clasa vrem sa implementam Dependency properties, acea clasa


va trebui sa mosteneasca din DependencyObject
Sunt implementate ca si proprieti WPF cu fucionalitate adiional

Pasi utilizati la implementarea unui DependecyProperty


1. in clasa care moteneste din DependencyObject se declar o variabil
public, static si read-only (doar cu getter) de tipul DependencyProperty
public static readonly DependencyProperty FlavorProperty;

2. se creaz un constructor static care inregistreaz proprietatea


static PieClass() {
FrameworkPropertyMetadata md = new FrameworkPropertyMetadata();
PieClass.FlavorProperty = DependencyProperty.Register("Flavor",
typeof(string), typeof(PieClass), md);
}

103

Dependecy properties (II)


3. se creaz proprietatea wrapper care permite DependencyProperty s fie
accesat in cod
public string Flavor
{
get {
return (string)GetValue(PieClass.FlavorProperty);
}
set {
SetValue(PieClass.FlavorProperty, value);
}
}

Se utilizeaza GetValue si SetValue pt setarea valorii proprietii si nu in mod


obisnuit

104

Dependecy properties (III)

Se poate furniza o metod callback care s se execute cand valoarea


proprietii se schimb

static PieClass()
{
FrameworkPropertyMetadata md = new FrameworkPropertyMetadata(new
PropertyChangedCallback(FlavorPropertyChanged));
PieClass.FlavorProperty = DependencyProperty.Register("Flavor",
typeof(string), typeof(PieClass), md);
}
private static void FlavorPropertyChanged(DependencyObject o,
DependencyPropertyChangedEventArgs e)
{
// Implementation omitted
}

105

Crearea controalelor utilizator


1. se creaz un proiect de tipul WPF User control library
2. se creaz interfata noului control prin drag&drop de pe toolbox sau prin
utilizarea XAML
3. se adaug functionalitatea nou. Se pot implementa dependecy properties
sau routed events

106

Crearea controalelor custom

La crearea unui custom control, se creaz un folder Theme care contine


fisierul Generic.xaml va contine template-ul default pt control care poate
fi alterat pt a crea noul template
1. se creaz un proiect nou de tipul WPF Custom Control library
2. in solution explorer se editeaza Generic.xaml din Theme
3. in xaml putem crea template-ul pt control
3. se poate adauga functionalitatea dorit. Putem implementa proprrietati,
dependecy properties si routed events.

107

Utilizarea controalelor utilizator/custom

1. in solution explorer, se da right-click pe proiect si apoi Add reference


2. Se face browse si se selecteaza dll-ul care contine controlul utilizat
3. in xaml se face referire la assemblyul nou adaugat

xmlns:cc="clr-namespace:WpfCustomControlLibrary1;
assembly=WpfCustomControlLibrary1"

4. in xaml se adaug noul control

<cc:CustomControl1 />

5. se face build

108

Theme

Pentru controale custom acestea se afiseaz consistent cu tema aleas


Clasele SystemColors, SystemFonts, SystemParameters se furnizeaz
unelte pentru construirea/customizarea temei
Cand utilizatorul schimba tema, culorile, fonturile si parametrii sistem sunt
update-uiti automat la cele din tema aleas
Aceste setri se pot accesa din sectiunea de resurse:

<Label Background ="{DynamicResource {x:Static


SystemColors.ControlBrushKey}}" Content="Hello World" />

Sau din cod:

label1.Background = SystemColors.ControlBrush;

109

Medii de dezvoltare curs 5-

- Informatic Economic, an III


Accesul la date in .NET Framework
ADO.NET modelul de baz

Cristian Bologa

Cluj-Napoca - 7 Decembrie 2015

ADO.NET

Framework flexibil prin care se realizeaz accesul aplicaiilor .NET


Framework la date
Aplicatii Windows
Aplicatii web

Tipuri de date suportate


Baze de date relationale si non-relationale
Depozite de date de tip XML
Date provenind de la aplicaii

Reprezint fundamentul pentru tehnologii noi de acces la date


Codul de access la date este strns legat de date
Dac se schimb structura datelor => schimbri in codul surs .NET
Se lucreaz la nivelul modelului logic al datelor

Se furnizeaz clase de access la SQL Server, XML, OleDB, ODBC

Modele de access la date in ADO.NET

Accesul la date in ADO.NET

Clase din namespace-ul System.Data

Obiecte de tip Connection:


-Obiecte de tip SqlConnection => pt lucrul cu date provenind de pe SQL
Server
-Obiecte de tip OleDbConnection => pt lucrul cu date de pe alte servere
relaionale
Obiecte de tip Command utilizeaza comenzi SQL sau proceduri stocate.
Rezulta niste streamuri care pot fi citite prin DataReader-e sau incarcate in
obiecte de tip DataSet. Avem 2 clase:
-Command.System.Data.SqlClient.SqlCommand
-System.Data.OleDb.OleDbCommand

Ce este un DataReader?

Lucrul in mod conectat

Obiectele connection gestioneaza


conexiunea cu serverul de date
Obiectele Command sunt
wrappere pentru comenzi Sql
DataAdapter contin obiecte de tip
Command
SelectCommand aduce date in
DataReader care poate fi iterat

Modelul deconectat de acces la date

Access deconectat: in aplicaie se mentine un obiect care reprezinta un


cache local de date (DataSet)
Obiectele de tip DataAdapter folosite pentru a realiza comunicarea intre
obiectul DataSet (local) si serverul de date

DataSet

Reprezint o copie local a bazei de date


Furnizeaz un mediu relaional de programare, prezentnd o vedere
relaional asupra datelor
Stocheaz date similar cu stocarea datelor intr-o baz de date relational
Este compus din obiecte de tip DataTable
Proprietatea Tables: colecie cuprinznd tabelele din DataSet
Proprietatea Relation: colectie a relatiilor ce leaga tabelele
DataSet tipizat (typed):
mediul de programare a construit clase pentru DataSet si pentru fiecare tabel a datasetului
Tabelele pot fi accesate prin numeObiectDataSet.numeTabel
Datele din tabele pot fi accesare prin numeObiectDataTable.numeColoana

DataSet netipizat (untyped):


Se folosesc clasele standard (DataSet, DataTable, DataRow etc)
Tabelele se acceseaz prin numeObiectDataSet.Tables[NumeTabela]
Datele se acceseaz prin numeObiectDataTable.Rows[numeColoan]

DataTable

DataTable: o tabel a unui BD, coninnd randuri (DataRow), coloane


(DataColumn) si constrngeri
La un moment dat, un obiect de tip DataTable conine o copie local a
datelor dintr-o tabel din sursa de date
proprietatea Rows: o colecie de obiecte de tip DataRow, conine datele
tabelei
Proprietatea Columns: o colecie de obiecte de tip DataColumn, conine
metadatele tabelei

DataAdapter

Folosit ca i o punte pentru a muta datele intre obiectul DataSet si sursa de


date
Asigur operaiile de transfer de date ntre sursa de date i obiectul DataSet

Modificarea datelor din DataSet

Obiectele DataTable pot contine date in 3 versiuni:


Original, curent si proposed

La incarcarea datelor in DataTable datele sunt in starea current


Operatia BeginEdit: pune linia in mod edit iar datele modificate devin
versiunea Proposed;
Operatia EndEdit: versiunea Current devine Original, versiunea Proposed
devine Current
A 2-a operatie BeginEdit: versiunea Current devine Proposed
La o nou operatie EndEdit: versiunea Proposed devine Current
Etc
Metoda AcceptChanges: reseteaz starea unui DataRow la unchanged
AcceptChanges se apeleaz dup un update a datelor ctre serverul de date
RejectChanges: face roll-back la date sau la momentul crearii sau la ultimul
apel a lui AcceptChanges -> se copiaz inapoi datele din versiunea Original

Viziunea asupra unui DataSet

Este o BD relational in memorie cached data


Nu furnizeaz proprieti tranzacionale: atomicitate, consisten, izolare i
durabilitate
Contine colecii de DataTable si DataRelation
DataTable contine chei unice si strine pentru integritatea datelor
Se poate crea un DataSet in mod programatic sau prin furnizarea unei
scheme XML .xsd
DataSet editor: se permite crearea si editarea grafica a unui fisier xsd pe
baza caruia se creaz clase DataSet tipizate
In meniul Project , Add new item, se selecteaz DataSet

Entity Data Models

Modelul fizic: modul de stocare a datelor in BD


Modelul logic:
Construit pe baza modelului fizic
Descrie modul in care datele sunt salvate in tabele studiat la disciplina BDE

Modelul conceptual:
Mapat pe modelul logic
O vedere business asupra datelor astfel incat s se evite operaii join complexe

Entity data model: modelul conceptual definit in .NET Entity


Framework
Entity framework: convertete functionalitatea de business in
comenzi compatibile la nivelul sursei de date

Strategii de proiectare a modelelor


1. Database design first
Prima dat se creaz BD-ul, apoi se proiecteaz entitile din aplicaie
Este strategia preferat de administratorii de BD, poate limita flexibilitatea
aplicaiei pe termen lung

2. Model design first


Mai inti se proiecteaz entitile aplicaiei apoi se creaz BD-ul in jurul acestora
Este strategia preferat de programatori

3. Code-design only
Modelul este generat doar la run-time

1 si 2 suportate in .NET Framework

Entity designer

Entity data model wizard: generarea modelelor, update pt modele


existente, crearea BD-urilor
Mapping details
Model browser

Medii de dezvoltare curs 6- Informatic Economic, an III

Data binding

Cristian Bologa

Cluj-Napoca - 9 Decembrie 2015

124

Data binding

Legarea proprietilor unor controale de date


Se poate orice proprietate a unui element de orice obiect, proprietate,
colecie sau surs de date
Data binding: procesul de creare a dependenei dintre valoarea unei
proprieti (target property) de valoarea unei alte proprieti (source
property)
Modificarea valorii proprietii surs se poate transmite imediat (sau nu)
proprietii int
Modificarea valorii proprietii int se poate transmite imediat (sau nu)
proprietii surs

125

Clasa Binding
Descrie relaia dintre proprietile int si surs
Proprieti ale clasei Binding:

ElementName: setter sau getter pentru elementul surs


FallbackValue: valoarea care va fi utilizat atunci cnd legarea nu poate produce o valoare clar
Mode: direcia fluxului de date intre int i surs
NotifyOnSourceUpdate: indic dac evenimentul SourceUpdated s fie lansat atunci cand se transfer o valoare de
la int la surs
NotifyOnTargetUpdate: indic dac evenimentul TargetUpdated s fie lansat atunci cnd se transfer o valoare de
la surs la int
Path: calea ctre proprietatea surs a obiectului surs a Bindingului
RelativeSource: sursa relativ a bindingului, in funcie de poziia elementului tint.
Source: obiectul care va fi folosit ca si surs a legturii. Utilizat doar cnd inta nu este un obiect WPF
TargetNullValue: valoarea folosit la int atunci cnd valoarea sursei este Null
!Nu exista o proprietate in clasa Binding care sa specifice obiectul target sau proprietatea target. Nu se specific
obiectul int. Binding-ul automat va transmite valoarea obtinuta de la proprietatea sursa la proprietatea
destinatie.

126

Legarea unei proprieti a unui element WPF de o


alt proprietate a unui alt element
<Label Content="{Binding ElementName=Slider1, Path=Value}" Height="25"
Width="100/>

sau
<Label Height="25" Width="100">
<Label.Content>
<Binding ElementName="Slider1" Path="Value" />
</Label.Content>
</Label>

sau
Binding aBinding = new Binding();
aBinding.ElementName = "Slider1";
aBinding.Path = new System.Windows.PropertyPath("Value");
Label1.SetBinding(ContentProperty, aBinding);
BindingOperations.ClearBinding(this.Label1, ContentProperty);

127

Legarea ctre un obiect

Se foloseste Source pentru a indica obiectul surs


Poate fi orice obiect accesibil in XAML
Dac se face legare ctre obiecte non-WPF, un exemplu este legarea ctre
obiecte statice precum culoare si fonturile system

<Button Background="{Binding Source={x:Static SystemColors.WindowColor}}"


Height="23" Width="75">Button</Button>

128

Legarea ctre un obiect resurs logic

Legarea ctre o proprietate din clasa aplicaiei

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:aClass x:Key="theObject" />
</Window.Resources>
<Grid>
<Button Content="{Binding Source={StaticResource theObject},
Path=myProperty}" />
</Grid>
</Window>

-
-
-

Importa namespace-ul WpfApplication1


Creaz obiectul theObject din clasa aClass
Leag proproprietatea Content a butonului de proprietatea myProperty a obiectului

129

Proprietatea DataContext

Nu este absolut necesar s setm proprietatea Source pentru a crea un Data Binding.
Putem utiliza DataContext pentru pentru a lega inta de un element (obiect) sau un
container din arborele vizual
WPF verific proprietatea DataContext in cazul in care proprietile Source,
RelativeSource sau ElementName nu sunt setate
La interpretarea DataContext se incepe cu elementul specificat, iar dac acesta este
null, se continu cu inspectarea ascendent a arborelui vizual pn la identificarea
unui element nenul
Obiectul specificat de ctre DataContext va reprezenta obiectul surs pentru toate
legrile din arborele vizual care care nu au setat un Source, ElementName sau
RelativeSource

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.Resources> <local:myDataClass x:Key="aDataObject" />
</
Window.Resources>
<Grid DataContext="{StaticResource aDataObject}">
<Label Content="{Binding Path=myTitle}" />
</Grid>
</Window>

130

Utilizarea DataContext

Se seteaz DataContext in cod cu un obiect surs de date (de exemplu ADO.NET)

myDataClass aDataObject = new myDataClass();


Grid1.DataContext = aDataObject;

Se seteaz bindingul pentru pentru diverse controale de pe interfat la proprieti ale


obiectului surs de date

<Grid Name="Grid1">
<Label Content="{Binding Path=myTitle}" />
</Grid>

Controlul va afia valoarea surs de date doar la setarea acesteia in cod

131

Binding Mode

Determin cum se comport controalele la schimbri ale valorilor in surs / int


Default: obiectul Binding folosete modul implicit al proprietii int
OneTime: obiectul Binding trebuie s reimprospteze proprietatea inta cnd se
pornete aplicaia sau cnd se schimb data contextul, dar nu se reimprospteaz la
alte modificri ulterioare
OneWay: se modific proprietatea int atunci cand sursa se modific
Pentru afiri de informaii

OneWayToSource: se modific proprietatea surs cand proprietatea tint se modific.


Schimbri in surs nu au efect la schimbarea proprietii int
TwoWay: orice modificare in surs se reflect n int i invers
Pentru editri de informaii

132

Binding la o valoare null

Se poate furniza o valoare implicit prin setarea proprietii TargetNullValue in caz


c valoarea surs este null

UpdateSourceTrigger

Controleaz modul in care proprietatea surs este actualizat


Dac proprietatea Binding.Mode este setat la TwoWay sau OneWayToSource,
schimbrile in target se reflect in surs
UpdateSourceTrigger controleaz frecvena acestor transferuri
Default: proprietatea surs se modific in concordan cu valoarea implicit a
proprietii int.
Valoarea implicit PropertyChanged: sursa se modific dac tinta se modific
Explicit: proprietatea surs este modificat doar la apelul Binding.UpdateSource()
LostFocus: sursa este modificat la LostFocus pe controlul tint.
Este folosit la proprietile susceptibile a fi editate
PropertyChanged: proprietatea surs este modificat la orice modificare a tintei

133

Conversia datelor

Implementarea IValueConverter
Metoda Convert: converteste inputul la tipul output
ConvertBack: conversia invers

Clasa care implementeaz IValueConverter trebuie adnotat cu atributul


ValueConversion care specific tipurile intre care are loc conversia

[ValueConversion(typeof(int), typeof(string))]

134

Formatarea datelor

Se utilizeaz converteri

Formatarea ca si o valut:
aString = aDouble.ToString("C");

Se poate insera aceast formatare intr-un converter


Se utilizeaz proprietatea culture pt a insera tipul potrivit de valut
Formatarea datelor
d/D dat scurt/lung,
f/F dat lung si timp scurt/lung
G - general
M lun si zi

135

Converteri pentru localizare


" Parametrul culture: se poate examina pentru a returna date localizate
string aString = (string)value;
switch(culture.ToString())
{
case "de-DE":
return myTranslator.EnglishToGerman(aString);
case "fr-FR":
return myTranslator.EnglishToFrench(aString);
default:
return aString;
}

136

Validarea datelor

Validarea: presupune asigurarea faptului c datele din control sunt conforme


cu specificrile tipului
Obiectul Binding expune colecia ValidationRules
Trebuie specificata o clas care s implementeze regula de validare

<TextBox>
<TextBox.Text>
<Binding Path="CandyBars">
<Binding.ValidationRules>
<local:CandyBarValidationRule />
<local:SweetTreatsValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

137

validare

Dac regulile de validare sunt violate:


Elementul supus validrii este prezentat cu rosu
Proprietatea Validation.HasError este true
Se creaz obiect de tipul ValidationError care este adaugat in colectia
Validation.Errors
Daca Binding.NotifyOnValidationError este setat la True si se arunc
evenimentul Validation.Error atasat evenimentului
Sursa de Data binding nu se modific (valoarea ce nu satisface regulile de
validare nu actualizeaza sursa data binding-ului).

Daca setam ExceptionValidationRule: toate exceptiile aruncate in procesul de


data binding sunt raportate ca si erori de validare
Astfel, o exceptie netratata nu va opri executia programului ci va creea o
eroare de validare

138

Implementarea unei reguli de validare

Se creeaza o clasa care mosteneste clasa abstract ValidationRule


Se suprascrie metoda Validate primeste ca si parametru un obiect care
reprezinta valoarea care trebuie evaluata
Returneaz un obiect ValidationResult care conine proprietile
IsValid true daca valoarea este valid. Avem false daca valoarea nu este
valid si se creaza un obiect ValidationError
ErrorCondition textul de eroare in cazul in care IsValid este false

139

Tratarea erorilor de validare

Elementul tint a erorii se marcheaz cu rosu


Apare evenimentul Validation.Error cu argumente
Proprietatea Action: dac eroarea este nou sau este o eroare veche
Error: eroarea efectiv

Evenimentul Validation.Error se arunc doar dac proprietatea


NotifyOnValidationError este setat la true
Validation.Error este un bubbling event

140

Legarea la o list

2 situaii:
Legarea unui singur element la o list de obiecte i facilitarea navigrii in lista de
obiecte
Legarea unei colecii (precum elementele unui ListBox) la o list de obiecte astfel
incat toate elementele listei sunt afisate

Legarea proprietii Item la o list de obiecte

DisplayMemberPath: proprietatea coleciei surs care va fi utilizat pentru a crea


textul care se afieaz pentru fiecare element
IsSynchronizedWithCurrentItem: daca itemul surs selectat este tinut sincronizat cu
proprietatea CurrentItem din colectia Item
ItemsSource: reprezint colecia surs
ItemTemplate: template-ul folosit pentru vizualizarea datelor

In cod se seteaza DataContext la numele listei surs de obiecte


In XAML prin DisplayMemberPath se selecteaz proprietatea sursei care s se afiseze

141

Legarea unei proprieti la o list surs

Se seteaz DataContext-ul in codul surs


Se foloseste Binding Path pentru specificarea proprietii care s se afiseze

La legarea unei colecii surs de un element tint singular, se creaz in spate un


obiect de tipul ICollectionView
Memoreaz starea curent (de navigare) in colecie, vederi, grupri si sortri ale elementelor

CurrentItem: proprietatea returneaza itemul curent


CurrentPosition: pozitia curent numeric a elementului curent
IsCurrentAfterLast: dac itemul curent este dup ultimul item din colecie
IsCurrentBeforeFirst: itemul curent este inaintea primului din colecie
MoveCurrentTo / MoveCurrentToLast / MoveCurrentToFirst /
MoveCurrentToNext / MoveCurrentToPrevious: setarea itemului curent

System.ComponentModel.ICollectionView myView;
myView = CollectionViewSource.GetDefaultView (myCollection);

142

Legare de obiecte ADO.NET

Navigarea intr-o tabela prin controale din GUI


Se seteaz DataContext la obiectul DataTable
Se seteaz obiectul Binding la nimic
Se seteaz DisplayMemberPath la proprietatea care se afiseaz pentru
controalele de tip lista
Se seteaz proprietatea Path pentru controalele individuale
Dac se seteaz DataContext la obiectul DataSet, trebuie s se seteze
proprietatea Path la obiectul DataTable corespunztor

Fereastra DataSource din VS permite drag&drop la campuri din


sursele de date
Se defineste automat obiectul de tip CollectionViewSource

143

Legare ctre tabele legate prin DataRelation

Obiecte DataRelation: chei straine care exprim relatii dintre 2 tabelele


Realizarea unui Binding ctre:
ParentTable reprezint tabela printe
Relation reprezint o relatie de la tabela parinte ParentTable
Relation2 reprezint o relatie de la tabela copil a tabelei ParentTable
{Binding Path=ParentTable/Relation/Relation2}

144

Legare prin ObjectDataProvider


Permite legarea unui element sau proprieti la o metod apelat pe un
obiect
Proprieti ale ObjectDataProvider
ConstructorParameters: lista parametrilor transmisi la contructor
IsAsynchronous: daca crearea obiectelor sau apelul metodelor se face in
threadul curent sau unul in background
MethodName: numele metodei obiectului surs care va fi apelata
MethodParameters: lista parametrilor transmisi metodei
ObjectInstance: obiectul utilizat ca si surs
ObjectType: tipul obiectului surs

145

DataTemplate

Descrie cum vor fi afisate datele surs legate de un control tint


Poate contine elemente care sunt legate (fiecare) de date surs
Poate contine elemente de layout, culoare sau alte aspecte legate de afisare
Pentru controalele care au proprietatea Content: ContentTemplate
Pentru controalele care au proprietatea Item: ItemsTemplate
DisplayMemberPath si ItemsTemplate se exclud mutual
De obicei, DataTemplate se defineste ca si o resurs

146

Medii de dezvoltare curs 7- Informatic Economic, an III

Accesul la date in .NET Framework - LINQ

Cristian Bologa

Cluj-Napoca - 14 Decembrie 2015

147

LINQ

Probleme la transferul de date ntre aplicaie si sursa de date

LINQ: language integrated query


Permite s creem operatii de tip interogare, update si transformri in sintaxa
limbajului de programare
Lucreaz cu colecii de tip IEnumerable -> au metoda GetEnumerator

Modul de tratate (diferit) al valorilor Null (impedance mismatch)


Modul de transmitere a comenzilor ctre serverul de date: string in ghilimele. Daca
apare eroare serverul de date arunca o exceptie

IEnumerable<string> results = from c in colors


where c.StartsWith("B")
orderby c
select c;

Deffered execution

O interogare LINQ este un obiect generic de tipul Ienumerable


variabila la care rezultatul e asignat (results) este un range variable
nu este o colectie populat, LINQ nu acceseaz sursa de date dect la utilizarea
obiectului care lucreaz cu results e cunoscuta sub numele de deffered execution

148

LINQ providers

LINQ: middle tier intre locul de stocare a datelor si aplicaie


Pentru a crea un LINQ provider trebuie implementata interfata IQueryable

149

Initializarea obiectelor

Object initializer:
Se execut default constructorul generat de compilator si apoi se asigneaz
proprietile cu valori

Car c = new Car() { VIN = "ABC123", Make = "Ford",


Model = "F-250", Year = 2000 };

Similar se pot initializa coleciile, ca si elemente de tip List


Collection initializer:

List<Car> lc = new List<Car>


{
new Car {VIN = "ABC123",Make = "Ford", Model = "F-250", Year = 2000},
new Car {VIN = "DEF123",Make = "BMW", Model = "Z-3", Year = 2005}
}

150

Proiectii

Projection: transformare asupra datelor astfel incat in urma unui select


LINQ s obtinem outputul in tipul dorit

string[] colors = {Red, Brown, }


IEnumerable<Car> fords = from c in colors
where c.Length == 5
orderby c
select new Car() {
Make = "Ford",
Color = c
};
foreach (Car car in fords)
{ txtLog.AppendText(String.Format("Car: Make:{0} Color:{1}"
+ Environment.NewLine, car.Make, car.Color));
}

151

Declararea variabilelor locale cu tip implicit


var cars = GetCars();

Se interogheaza compilatorul asupra tipului variabilei cars i acest tip se


asigneaz implicit
Nu putem avea valoarea null in dreapta operatorului de atribuire
Dup momentul in care compilatorul decide tipul variabilei cars, acest tip nu
mai poate fi schimbat
Variabile cu tip implicit pot fi doar variabile locale, nicidecum tip de argumente
de metode

152

Tipuri anonime
var x = new {Make = "VW", Model = "Bug"};
txtLog.AppendText(x.Make + ", " + x.Model);

IntelliSense stie ca tipul lui x are proprietile Make si Model


LINQ foloseste tipuri anonime pentru a implementa proiectii
var carData = from c in GetCars()
where c.Year >= 2000
orderby c.Year
select new
{
c.VIN,
MakeAndModel = c.Make + " " + c.Model
};
dgResults.DataSource = carData.ToList();

153

Expresii lambda (I)


Reprezint un soi de metode anonime cu sintaxa abreviat
Ex: metoda Find a clasei List<T>:
accepta ca si parametru un delegate Predicate
Tipul acestui delegate: referint la o metod care accept la intrare un argument de
tipul T si returneaz un boolean
Find itereaz pe colecie, aplic metoda din Predicate pe toate elementele si
returneaz doar acele elemente pe care metoda returneaz true
Problem: tipul predicatului trebuie s fie identic cu tipul coleciei
int yearToFind = 2000;
private void toolStripMenuItem_Click(object sender, EventArgs e) {
var cars = GetCars();
yearToFind = 2000;
var found = cars.Find(ByYear);
txtLog.AppendText(string.Format("Car VIN:{0} Make:{1} Year{2}" + Environment.NewLine,
found.VIN, found.Make, found.Year));
}
private bool ByYear(Car c) { return c.Year == yearToFind; }

154

Expresii lambda (II)


private void lambdaExpressionsToolStripMenuItem_Click(object sender,
EventArgs e) {
var cars = GetCars();
var theYear = 2000;
var found = cars.Find(c => c.Year == theYear);
txtLog.AppendText(string.Format("Car VIN:{0} Make:{1} Year{2}" +
Environment.NewLine,
found.VIN, found.Make, found.Year));
}
var found = cars.Find(c =>
Partea stanga declar parametrii, separai prin ,
{
Dup semnul => avem expresia care se evalueaz
int x;
x = theYear;
Expresia poate fi compus din mai multe instructiuni
return c.Year == x;
});

155

Metode extensii

Putem aduga metode unui tip chiar dac nu avem codul surs pentru tipul
respectiv
Problem: s adaugm o metod isNumeric clasei string
Soluie clasic: creem o clas StringHelper care s conin toate metodele
noi pe care dorim s le adugm iar aceste metode s preia o valoare de tip
string ca i prim parametru

public static class StringHelper {


public static bool IsNumeric(string str) {
double val;
return double.TryParse(str, out val);
} }

Avantaj al acestei soluii: nu trebuie s instaniem un obiect de tip string pt


a folosi metoda IsNumeric (metoda e static)
Dezavantaj: trebuie s tim c clasa StringHelper exist

156

Metode extensii

Extension method: putem crea o clas public static iar metoda nou s o facem
membr a acestei clase
Se foloseste cuvantul cheie this inaintea primului parametru pentru a se indica
faptul c metoda este o extensie a acestuia

public static class StringHelper {


public static bool IsNumeric(this string str)
{
double val;
return double.TryParse(str, out val);
}
}
string s = "abc123";
txtLog.AppendText(s.IsNumeric() + Environment.NewLine);

Metodele extinse sunt artate de ctre IntelliSense

157

Metode extensii pentru regsire

Se pot aduga metode extensii pentru interfee

string[] colors = {"Red", "Brown", "Orange", "Yellow", "Black"}


IEnumerable<string> colorEnumerable = colors;

colorEnumerable are toate metodele interfeei Ienumerable (query


extension methods)

158

LINQ keywords

from: specific sursa de date sau variabila de tip range


where: filtreaza elementele surs pe baza unei/unor expresii booleene
select: specific tipul elementelor returnate la execuia interogrii
group: grupeaz elementele rezultat in funcie de o cheie specificat
into: furnizeaz un identificator care poate fi utilizat ca si o referin ctre
rezultatele unui join, group sau select
orderby: sorteaz rezultatele interogrii
join: unete 2 surse de date pe baza egalitii dintre 2 criterii specificate
let: introduce o variabil pentru a salva rezultatul unei subexpresii
in: folosit in join sau from, pentru a specifica sursa de date
on: folosit in join pentru a specifica clauza (criteriul) de join
equals: folosit in join pentru a specifica egalitatea
by: folosit in group by, pentru a specifica clauza de grupare
Ascending/descending: folosite in orderby

159

Proiecii si let

Se poate utiliza let pentru a crea o variabil temporar in interiorul unei


interogri

var vinsAndMakes = from c in cars


let makeModel = c.Make + " " + c.Model
where makeModel.Contains('B')
select new { c.VIN, MakeModel=makeModel };

160

where

Clauza where se mapeaz direct pe o metod extensie Where care


realizeaz filtrarea
Se poate specifica un predicat (expresie ce se evalueaza la o valoare
booleana) pentru a determina elementele ce vor fi returnate

int yearRange = 2000;


var cars = GetCars();
var oldCars = from c in cars
where c.Year < yearRange
select c;

orderby
Permite sortare cresctor / descresctor
Se poate sorta pe mai multe proprieti
var sorted = from c in cars
orderby c.Make ascending, c.Model descending
select c;

161

Paginare

Este necesar atunci cand interogrile returneaz o colecie mare de date


Metodele extensie Skip si Take

int pageSize = 10;


//create 5 copies of the cars - total 25 rows
var cars = Enumerable.Range(1,5).SelectMany(i=>GetCars()
.Select(c=>(new {BatchNumber=i, c.VIN, c.Make, c.Model, c.Year})));
//calculate page count
int pageCount = (cars.Count() / pageSize);
if (pageCount * pageSize < cars.Count()) pageCount++;
for(int i=0; i < pageCount; i++) {
txtLog.WriteLine("-----Printing Page {0}------", i);
var currentPage = cars.Skip(i * pageSize).Take(pageSize);
foreach (var myCar in currentPage) {
txtLog.WriteLine("#{0} Car VIN:{1}, Make:{2}, Model:{3} Year:{4}",
mCar.BatchNumber, myCar.VIN, myCar.Make, myCar.Model, myCar.Year);
}
}

162

Join

Permite realizarea operatiei de Join pe 2 colecii de tip Ienumerable


Sunt 3 tipuri de join
Inner join
Outer join
Cross join produs cartezian intre cele 2 multimi

163

Inner join

Similar cu join-ul din SQL


Produce rezultat doar dac este o potrivire de chei intre ambele surse
de join
Se foloseste equals si nu semnul =

var cars = GetCars();


var repairs = GetRepairs();
var carsWithRepairs = from c in cars
join r in repairs
on c.VIN equals r.VIN // nu =
orderby c.VIN, r.Cost
select new
{
c.VIN,
c.Make,
r.Desc,
r.Cost
};

164

Outer join

Produce rezultat pentru fiecare element din colectia outer chiar daca pe
colectia inner nu se identifica o potrivire de chei
Se foloseste clauza into pentru a specifica o referinta la rezultatul joinului
var cars = GetCars();
var repairs = GetRepairs();
var carsWithRepairs = from c in cars
join r in repairs
on c.VIN equals r.VIN into g
from r in g.DefaultIfEmpty()
orderby c.VIN, r==null?0:r.Cost
select new
{
c.VIN,
c.Make,
Desc = r==null?"***No Repairs***":r.Desc,
Cost = r==null?0:r.Cost
};

165

Cross join
" Produs cartezian intre 2 elemente sursa
" Se foloseste clauza from de mai multe ori
var carsWithRepairs = from car in cars
from color in colors
orderby car.VIN, color
select new
{
car.VIN,
car.Make,
car.Model,
Color=color
};

166

LINQ to SQL
Permite gestionarea BD relationale ca si obiecte
Object-relational model (ORM) tool, permite interogri, update, insert,
delete
Generarea unui model LINQ to SQL dintr-o BD existent
Add new item -> LINQ to SQL classes -> se creaz un fiier dbml
Se poate face drag & drop pt adaugarea de tabele la model
Se pot adauga proceduri stocate prin drag&drop

Acestea devin metode ale modelului

167

Examinarea modelului

La adaugarea unui tabele se vizualizeaz (pe fereastra modelului) o clas cu o


inregistrare din tabel
Designerul face din plural singular in mod implicit (dar tabela movies -> clasa movy)
Se poate schimba numele clasei din fereastra properties proprietatea Name (clasa
movie)

Se genereaz metode la runtime pentru insert, update si delete


Acestea pot fi setate din properties ctre o procedur stocat

Designerul a importat si relatiile dintre tabele


Procedurile stocate vor putea fi folosite ca si metode in modelul LINQ to SQL
Uneori, designerul nu stie sa interpreteze corect tipul de return al procedurii stocate
Daca procedura stocata returneaza un anume tip din model, se poate face drag&drop
pe clasa respectiva in model
Se creaz o clas cu numele numeStoredProcedureResult pentru a identifica tipul de
rezultat al procedurii stocate

168

Clasa DataContext

E responsabil cu mutarea datelor intre obiectele din program si baza de


date
Se utilizeaz o instant din clasa derivat din DataContext pentru a folosi
proprietile si metodele care furnizeaz accesul la baza de date
Obiectul mappingSource agregat de clasa DataContext mentine potrivirea
(mapping) intre clasele din model si baza de date
Pentru conectarea la un SQL Server, DataContext foloseste obiect de tipul
SQLConnection
Proprietatea Connection

Exemplu de lucru cu obiectul DataContext


var ctx = new NorthwindDataContext();
var employees = from emp in ctx.Employees
where emp.LastName.StartsWith("D")
select emp;
dg.ItemsSource = employees;

Proprietatea Log a obiectului DataContext: se logheaz toate comenzile


trimise ctre BD
Se poate atasa un StringWriter

169

Interogari folosind LINQ to SQL

Obiectul DataContext furnizeaz cate o proprietate pt fiecare tabel


Acestea sunt vazute ca si colecii .NET
=> se pot folosi toate facilitile LINQ descrise la inceputul cursului
Se pot folosi inner/outer/cross join, agregare (GROUP) sau sortare etc
Se pot folosi projection
Se pot folosi expresii lambda

170

Gestiunea modificarilor in obiecte

Similar cu Java, numele de variabile reprezint referin ctre obiect


Aliasing functioneaz
Obiectul DataContext gestioneaz identitatea obiectelor din BD:
Inregistrrile regsite din tabele sunt automat logate in tabela de identiti
(intern obiectului DataContext) cu ajutorul cheii primare
Dac acelai rnd este regsit inc o dat prin intermediul aceluiasi obiect
DataContext, acesta returneaz instana original a rndului
Aplicaia vede starea rndului
Deci nu se vd modificri asupra inregistrrii realizate de ctre alte obiecte
DataContext

Metoda SubmitChanges: trimite modificrile ctre BD

171

Ciclul de via al unei entiti

Modificarile realizate intr-o entitate rmn persistente (salvate in baza de


date) doar la apelul SubmitChanges (din obiectul de tip DataContext)
Obiectul DataContext memoreaz informaie despre obiectele entitate
Identity tracking service

172

Stri ale unui obiect entitate

Untracked: obiectul nu este tracked de ctre LINQ to SQL in urmtoarele


cazuri
Obiectul este instantiat de ctre programator
Obiectul a fost creat prin deserializare
Obiectul a fost regsit printr-un alt obiect DataContext

Unchanged: obiectul a fost regsit prin obiectul DataContext si nu a fost


modificat
PossiblyModified: obiectul este ataat unui DataContext si va fi in aceast
stare pn cnd se specific altfel
ToBeInserted: obiectul nu a fost regsit prin intermediul DataContext curent
si urmeaz s fie inserat prin insert
ToBeUpdated: obiectul a fost modificat de la ultima regsire i DataContext
urmeaz s trimit un update
ToBeDeleted: obiectul a fost marcat pt delete, si DataContext urmeaz s
trimit un delete
Deleted: obiectul a fost sters (delete) din Bd, este marcat ca si final, nu se
mai pot face modificri pe el
173

Medii de dezvoltare curs 8- Informatic Economic, an III

En9ty data models

Cristian Bologa

Cluj-Napoca - 16 Decembrie 2015

174

Entity Data Models

Modelul fizic: modul de stocare a datelor in BD


Modelul logic:
Construit pe baza modelului fizic
Descrie modul in care datele sunt salvate in tabele studiat la disciplina BDE

Modelul conceptual:
Mapat pe modelul logic
O vedere business asupra datelor astfel incat s se evite operaii join complexe

Entity data model: model conceptual definit in .NET Entity


Framework
Entity framework: convertete functionalitatea de business in
comenzi compatibile la nivelul sursei de date

175

Strategii de proiectare a modelelor


1. Database design first
Prima dat se creaz BD-ul, apoi se proiecteaz entitile din aplicaie
Este strategia preferat de administratorii de BD, poate limita flexibilitatea
aplicaiei pe termen lung

2. Model design first


Mai inti se proiecteaz entitile aplicaiei apoi se creaz BD-ul in jurul acestora
Este strategia preferat de programatori realizeaz persistena datelor in BD

3. Code-design only
Modelul este generat doar la run-time

1 si 2 suportate in .NET Framework

176

Arhitectura Entity framework

177

Comparaie Linq-SQL Entity framework

178

Modelarea datelor

Se pot crea mai inti clasele din model si acestea s fie mapate pe o
schem de date.
Dup crearea modelului se pot defini operaii CRUD pentru model
folosind LINQ to Entity si Object Services

179

Scenarii de mapare

Single mapping: o entitate din modelul conceptual este mapat catre o singur tabel
din modelul fizic modelul implicit
Entity splitting: proprieti dintr-o singur entitate a modelului conceptual sunt
mapate n coloane din 2 sau mai multe tabele care partajeaza o cheie primara
comun
Partiionare orizontal a modelului conceptual: mai multe entiti din modelul
conceptual cu aceleasi proprieti sunt mapate pe o singur tabel
Motenire TPH (table per class hierachy): toate tipurile dintr-o ierarhie de motenire
sunt mapate pe o singur tabel
Motenire TPT (table per type): toate tipurile sunt mapate in tabele individuale
Motenire TPC (table per concrete class): tipurile ne-abstracte sunt mapate pe tabele
individuale. Fiecare tabel are coloane care mapeaz toate proprietile tipurilor
derivate, inclusiv proprietile mostenite de la clasa de baz
Mai multe seturi de entiti pe tip: o singur entitate este expus in dou sau mai
multe seturi de entiti din modelul conceptual. Fiecare set de entiti este mapat in
tabele separate in modelul fizic
Tipuri complexe: e o proprietate nescalar a unui entity type care nu are o
proprietate cheie. Se mapeaz tipuri complexe pe tabele din BD

180

Scenarii de mapare (II)

Mapare function import: o procedur stocat din modelul fizic este mapat pe un
element FunctionImport din modelul conceptual
Mapare modification function: se definesc proceduri stocate in modelul fizic pentru a
reprezenta operaiile de insert, update, delete
Mapare bazat pe interogri: in modelul fizic se defineste o interogare pentru a aduce
date intr-o tabel a sursei de date. Elementul acesta de tip DefiningQuery este mapat
pe un tip entitate in modelul conceptual
Mapare bazat pe vederi: reprezint o mapare de tip read-only intre tipuri de entiti
din modelul conceptual i tabele din modelul fizic . Nu permite realizarea operaiilor
de update
Mapari de tip AssociationSet: asocieri (fie one-to-one sau one-to-many) din modelul
conceptual sunt mapate pe asocieri din modelul fizic
Asocieri Many-to-Many: fiecare capt al unei asocieri este mapat intr-o tabel
legtur in modelul fizic
Self association: asocieri intre 2 entiti de acelai tip

181

Code-first vs database-first

Code first: se creaz mai inti modelul conceptual, apoi pe baza acestuia se
genereaz modelul fizic
Database first: modelul conceptual se creaz pe baza schemei de date
Recomandare: s se porneasc de la modelul cu care programatorul se
simte cel mai confortabil

182

Implementarea modelului code-first


1. se adaug un ADO.NET Entity data model in soluie din Add new item
Creaz un fiier edmx
2. se pornete Entity Data Model Wizard si se selecteaz empty model (code-first)
3. se foloseste toolbox-ul pentru a se aduga entiti in model prin drag&drop
O entitate astfel adugat primete automat o coloan ID
4. se adaug proprieti ale entitii prin click dreapta si Add | Scalar property
5. se seteaz proprietile entitii din fereastra Properties
6. se seteaz proprietile fiecrei proprieti din entitate prin fereastra Properties
7. se pot adauga asocieri intre entiti
8. Se genereaz baza de date prin click dreapta pe fundalul designerului
9. Prin click dreapta pe fisierul SQL se poate executa scriptul generat

183

Proprieti ale entitilor i campurilor

Entity set name: numele coleciei din clasa ObjectContext care va returna
obiecte de tipul entitii
Concurency Mode (la coloane):
None: coloana nu va fi implicat in verificri legate de concuren
Fixed: valoarea original a proprietii va fi trimis ca si parte a unei clauze Where la
crearea interogrilor de tip update sau delete pt a ne asigura c aceast proprietate nu
a fost modificat de la momentul cand a fost citit

StoreGeneratedPattern (la coloane): dac valoarea proprietii va fi sau nu


autogenerat.
Identity: se autogenereaz valoare cu auto-number, dup fiecare insert
Computed: valoarea se pune dupa insert, dar este o valoare calculat (ex: timestamp)

La adugarea asocierilor, se seteaz entitatea printe si cea copil,


precum si cheile implicate
Se definesc navigation properties, care va permite ca in clasele generate s se creeze
cmpuri ce vor permite navigarea intre ele

184

Implementarea modelului database-first

1. se adaug la proiect un ADO.NET entity data model


2. se porneste Entity Data Model wizard, se selecteaz Generate Model from
Database
3. se selecteaz conexiunea la BD
4. se selecteaz obiectele BD care se vor importa in modelul conceptual
5. finish -> genereaza fisierul edmx
!!! Relatiile many-to-many nu se transforma in entitati separate -> numarul de
entiti poate fi mai mic dect numrul de tabele
AssociationSetName: numele tabelei unde se face maparea

Fereastra MappingDetail (Ctrl + 2) pentru a inspecta modul de mapare a entitilor

185

ObjectContext

Folosit pentru a muta date intre sursa de date si aplicaie


La crearea EntityModel se creaz o clas care mosteneste din ObjectContext
Se permite utilizarea LINQ pentru interogri

ObjectStateEntry: permit monitorizarea strii obiectelor regsite. Proprieti:

CurrentValue: valoarea curent a proprietii


Entity: obtinem o referin la obiectul asociat si monitorizat
EntityKey: returneaz cheia asociat cu obiectul ObjectStateEntity
EntitySet: returneaz clasa de baz
isRelationship: daca entitatea asociat este relatie sau nu
ObjectStateManager: returneaz managerul de stare
OriginalValues: returneaz valorile read-only originale ale proprietatii obiectului
Relationship Manager: referin la instanta referitoare la obiectul reprezentat prin entitate

Metoda SaveChanges: care se apeleaz la salvarea obiectelor schimbate

186

Starea unui obiect entitate

Se obtine din proprietatea ObjectStateManager a obiectului ObjectContext


Acesta are metoda GetObjectStateEntry, care returneaz ObjectStateEntry, care are o
proprietate State cu urmtoarele valori posibile:
Added: obiectul a fost adaugat in ObjectContext, dar nu s-a dat SaveChanges. Dupa
salvare, starea se face Unchanged.
Deleted: obiectul a fost sters din ObjectContext. Dupa SaveChanges starea se
schimba la Detached
Modified: cel putin o proprietate scalar s-a modificat si metoda SaveChanges inca nu
s-a apelat
Detached: obiectul exist dar nu este gestionat de ObjectContext
Unchanged: nu a fost modificat de la ultimul SaveChanges

187

Medii de dezvoltare curs 9- Informatic Economic, an III

Pagini Web In ASP.NET

Gheorghe Cosmin Silaghi

Cluj-Napoca - 4 Ianuarie 2016

ASP.NET
Mediu de dezvoltare al aplicatiilor web in Visual Studio
Parte de server:
Limbaj de programare pe parte de server: C# sau VB
Utilizarea tehnologiilor de conectare la baze de date pentru realizarea site-urilor
dinamice specifice .NET

Parte de client:
HTML, CSS, Javascript
Controale web i web forms

Aplicaiile web ruleaz pe servere de IIS

Cluj-Napoca - 4 Ianuarie 2016

Client vs. Server in ASP.NET


Clientul interfata front-end, afiseaz i colecteaz date pe care
le trimite la server pentru procesare

Constituit de cele mai multe ori de browsere web


Rol: trimite cereri la server, autentificare, procesare
rspuns, ruleaz scripturi client
Serverul back-end trateaz cererile venite prin HTTP de la
client i rspunde clientului
Rspunsul serverului const n pagini HTML
Rol: verific integritatea mesajelor, autentificare i
autorizare, caching

Cluj-Napoca - 4 Ianuarie 2016

Comunicarea prin HTTP


Comunicarea se realizeaz prin protocolul HTTP/HTTPS
Client->Server = Obiectul Request; Server->Client: Obiectul Response

Cluj-Napoca - 4 Ianuarie 2016

Colectarea datelor in ASP


<form method="POST" action="getCustomer.aspx">
Enter Customer ID:
<input type="text" name="Id">
<input type="submit" value="Get Customer">
</form>

Postback - trimiterea datelor napoi la server ca i parte a cererii


noastre
Orice pagin asp are proprietatea IsPostBack

Cluj-Napoca - 4 Ianuarie 2016

Proiecte ASP
n funcie de tipul de acces la fiierele proiectului
File system ,FTP, HTTP

ASP.NET Empty Web Application


ASP.NET Web Application
Structura unui proiect ASP:

Cluj-Napoca - 4 Ianuarie 2016

Pagini ASP.NET (Web Forms)


Componente: Directive, Layout & Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Code-behind.aspx.cs"
Inherits="Code_behind" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/
TR
/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Code-behind Web Form</title>
</head>
<body>
public
partial class Code_behind : System.Web.UI.Page
<form id="form1" runat="server">
{ The time is:
<asp:Label
protected ID="TimeLabel"
void TimeLabel_Load(object
runat="server" onload="TimeLabel_Load"></asp:Label>
sender, EventArgs e)
</form>
{
</body>
TimeLabel.Text = DateTime.Now.ToString();
</html>
}

}
//Code-behind.aspx.cs

Cluj-Napoca - 4 Ianuarie 2016

Compilarea unui site ASP.NET


Compilare dinamica: primul request catre o versiune noua a
site-ului declanseaza compilarea => assembly
Avantaje:

Schimbarile in site se compileaza automat -> deployment usor


Compilare selectiva se compileaza doar componenta/pagina care a suferit modificari
Paginile cu erori nu impiedica celelalte pagini sa ruleze

Dezavantaje:

Recompilarea poate afecta timpul de raspuns


Codul sursa trebuie sa fie transferat pe serverul de deployment

Precompilarea: compilarea site-ului local apoi se face


deployment la versiunea compilata in IIS
Verificare pentru erori la copilare
Performanta pentru primul request nu este afectata
Deployment mai dificil

Cluj-Napoca - 4 Ianuarie 2016

Fisiere de configurare
Fisiere XML ce contin directive de configurare a aplicatiei
Model ierarhic al fisierelor de configurare

Se pot edita in varianta online cu ASP.NET Configuration (din


meniul Project)
Cluj-Napoca - 4 Ianuarie 2016

Master Pages (I)


Asigura o structura unitara a tuturor paginilor in site
Izoleaza elementele comune ale tuturor paginilor din site de
elementele specifice fiecarei in parte.
Paginile ASPX se incarca (rendering) in interiorul paginilor
Master
Au extensia .master
Contin HTML, Javascript si controale server-side, pot avea si
fisiere de code-behind
Incep cu directiva @Master in loc de @Page
Utilizarea controlului ContentPlaceHolder pentru a integra o
pagina ASP de continut cu o pagina Master

Cluj-Napoca - 4 Ianuarie 2016

Master Pages (II)


Elemente, controale, proprietati definite la nivel de Master Page de
care pot depinde anumite proprietati:
Crearea unei proprietati publice in clasa de code-behind a master page
Utilizarea directivei @MasterType in fisierul ASPX al master page
Referentierea proprietatii din paginile de continut: Master.proprietate

Se pot crea Master Pages Nested


<%@ Master Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true
CodeFile="CommunityMasterPage.master.cs" Inherits="Account_CommunityMasterPage" %>

Se pot schimba dinamic paginile master in metoda Pre_Init din


Master:
void Page_PreInit(Object sender, EventArgs e)
{ MasterPageFile =MasterPage1;}

Cluj-Napoca - 4 Ianuarie 2016

Caching in ASP.NET
Stocarea datelor, a elementelor de continut, a paginilor frecvent
incarcate in memorie pentru a fi incarcate mai repede
Performanta si scalabilitate
Tipuri de caching:
La nivel de aplicatie web o collectie ce poate stoca in memorie orice
tip de obiect. Obiectul va fi automat eliminat in functie de diferite
contrangeri.
La nivel de pagina stocarea unei pagini sau a unei portiuni de pagini
gata incarcata

Cluj-Napoca - 4 Ianuarie 2016

Application caching (I)


"
"
"
"

Stocheaza date (nu pagini) in memorie


Obiect accesat ca si proprietate a unui obiect Page
Clasa de 9p colec9e: System.Web.Caching.Cache
Proprietatea Page.Cache foloseste un singur obiect pe aplica9e (intr-o
aplica9e web exista un singur obiect Cache)
Cache["Gree9ng"] = "Hello, cache!";
if (Cache["Gree9ng"] != null)
Label1.Text = (string)Cache["Gree9ng"];
else
Label1.Text = "Hello, world!";

v Pentru adaugarea mai sos9cata a unui element in cache se poate


folosi metoda Insert
v Seteaza priorita9, 9mpul de expirare, CacheDependency

Cluj-Napoca - 4 Ianuarie 2016

Application Caching
DependencyCaching relatia de dependenta dintre 2 elemente din
Cache
Element independent element dependent
Cache.Insert("FileCache", File.ReadAllText("SourceFile.txt"),
new System.Web.Caching.CacheDependency(Server.MapPath("SourceFile.txt")));

Cand elementul dependent se schimba Cache-ul se invalideaza

Cluj-Napoca - 4 Ianuarie 2016

Page Output Caching


Caching la nivel de browser (browser-ul verifica doar
modificarile in pagina)
Se pastreaza o copie a paginii in format rendered in memoria
serverului
Se preteaza in cazul incarcarii unor pagini complexe sau a unor
rapoarte cu foarte multe date care trebuie incarcate din BD
ASP.NET suporta si configurari de tip partial-page caching
v Comportament de caching configurat pentru fiecare pagina:
v Utilizand directiva @OutputCache
<%@ OutputCache Duration="15" VaryByParam="search;category" %>

Cluj-Napoca - 4 Ianuarie 2016

Utilizarea temelor
Tema colectie de stiluri, proprietati, setari si elemente grafice
care determina design-ul paginilor asp.net
O tema poate include:
Fisiere .skin setari comune pentru propritatile controalelor ASP
Default Skin se aplica tuturor controalelor de pe pagina
Named Skin se aplica numai unui anumit tip de control de pe pagina

Temele se creaza in folderul App_Themes


Global Themes stocate intr-un singur loc pe serverul de IIS
<%@ Page Theme="SampleTheme" %>
<%@ Page StyleSheetTheme="SampleTheme" %>
Protected void Page_PreInit(object sender, EventArgs e)
{
Page.Theme = "BlueTheme";
}
Cluj-Napoca - 4 Ianuarie 2016

Regula de aplicare a temelor


1.
2.
3.
4.
5.

Teme specificate in interiorul directivei @Page


Teme specificate in Web.config in <system.web>
Atribute specifice controalelor
Teme de tip StyleSheetTheme in directiva @Page
Teme de tip StyleSheetTheme in Web.config

Cluj-Napoca - 4 Ianuarie 2016

Medii de dezvoltare curs 10- Informatic Economic, an III

Ges9unea evenimentelor si a starii

Gheorghe Cosmin Silaghi

Cluj-Napoca - 6 Ianuarie 2015

Ciclul de via a paginilor web: mult mai scurt decat cel al unei aplicaii
windows
La fiecare incarcare a paginii, se creaz noi obiecte
Obiectele sunt distruse cand se iese din pagina

Mecanisme disponibile pentru a realiza persitena datelor ntre cereri


succesive:
View state: datele sunt stocate in cadrul controalelor din pagina
Campuri ascunse: pagina contine campuri care nu se afiseaza care contin date
Sesiune: datele sunt stocate intre apeluri ale unor pagini diferite de catre acelai
utilizator
Cookies: datele sunt stocate pe calculatorul utilizatorului
Query string: datele sunt stocate in URL-ul apelului
Application state: datele salvate la nivel de aplicaie sunt disponibile oricarei
pagini din aplicaie care se incarc indiferent de sesiunile utilizatorilor

Cluj-Napoca - 6 Ianuarie 2015

Ciclul de viat a aplicaiilor Web

Descrie modul in care serverul pornete si oprete aplicaia, o izoleaz fa de alte aplicaii
si execut codul acesteia
Serverul web: de obicei IIS, executat pe un Windows Server

1. utilizatorul cere o pagin web


2. cererea este rutat ctre mediul ASP.NET
3. mediul ASP.NET creaz un obiect de tipul ApplicationManager

Acesta va executa cereri care vin ctre aceast aplicaie web


Realizeaz izolarea aplicaiei web inclusiv variabilele globale la nivel de aplicaie

4. se creaz un obiect de tipul HostingEnvironment

Acesta permite acces la itemii din environment, precum folderul cu resursele aplicaiei

5. se creaz obiecte de tipul HttpContext, HttpRequest si HttpResponse

Pentru gestiunea cererii

6. se creaz sau utilizeaz obiectul de tip HttpApplication -> descris in Global.asax

Aici se gestioneaz evenimente la nivel de aplicaie

7. se proceseaz evenimentele cererii

Cluj-Napoca - 6 Ianuarie 2015

Evenimente la nivel de aplicaie

Application_Start: atunci cand aplicaia este pornit de ctre serverul IIS

De obicei la satisfacerea primei cereri a unui client


Aici se initializeaz variabile folosite la nivel de aplicaie

Application_End: la oprirea aplicaiei


Application_Error: atunci cand apar erori care nu sunt prinse si care sunt aruncate pn

la acest nivel

Aici se poate face o prindere general a erorilor

Se poate folosi pentru a loga informaie referitoare la cerere

Application_LogRequest: apare atunci cand se arunc un eveniment de tip LogRequest la


apariia unei cereri

Application_PostLogRequest: apare dup ce cererea este tratat de server

Aceste handlere pot fi implementate in fiierul Global.asax

Se poate folosi colecia Application pentru a stoca variabile la nivel de aplicaie


Pentru a evita accesul concurent in scriere, trebuie folosit locking
Tipul variabilelor din colecia Application este object

Cluj-Napoca - 6 Ianuarie 2015

Ciclul de
via a unei
pagini web

Cluj-Napoca - 6 Ianuarie 2015

Evenimente la nivelul ciclului de via a unei pagini web (I)

PreInit: primul eveniment real invocat.

Init: apare dup ce fiecare control a fost initializat.

Se pun procesri dup initializare dar care trebuiesc facute inainte care view state-ul controalelor s
se restabileasc

Load: pagina este stabil: a fost construit i initializat.

Se pot schimba valorile de initializare a controalelor

InitComplete: apare dup toate init-urile din pagin (a tuturor controalelor)


PreLoad: apare inainte inaintea incarcrii view state pentru pagin si controale si
inaintea procesrilor postback

Se pot seta valori precum master page sau theme.


Pentru paginile cu controale create dinamic, aici se incarca aceste controale

De obicei se verific daca este postback i se fac procesri speciale pentru acest caz
Mai intai se lanseaz Load pentru pagin, si apoi evenimente load pentru fiecare control din pagina
respectiv

Evenimentele controalelor din pagin: sunt posibile evenimente de tip postback

Cluj-Napoca - 6 Ianuarie 2015

Evenimente la nivelul ciclului de via a unei pagini web (II)

LoadComplete: toate controalele sunt incarcate,


PreRender: apare de obicei dup ce toate evenimentele postback au fost
procesate si inainte ca View state s fie salvat
SaveStateComplete: apare imediat ce view state pentru pagin si controale
a fost setat
Render: aceast metod genereaz codul HTML / DHTML care afiseaz
pagina
Folositor atunci cand scriem propriile nostre controale

Unload: folosit pentru a pune cod de clean-up

Cluj-Napoca - 6 Ianuarie 2015

Evenimentele ciclului de viat a controalelor

Fiecare control din pagin are un ciclu de viat similar cu pagina


Init, Load, Render i Unload etc.
Cand un eveniment se execut la nivel de pagin, se execut apoi la nivelul
fiecrui control din pagin

Crearea handlerelor de evenimente

Prin dublu click pe suprafata controlului


Handlerul de evenimente apare in fereastra properties la events se face
legarea automat a functiilor handler de eveniment la nivel de control
Pentru legarea automat a functiilor handler pentru eveniment la nivel de
pagin:
Proprietatea AutoEventWireup in directiva @Page trebuie setat la true (in HTML)
In codul surs C# a paginii se scriu handlerele respective

Cluj-Napoca - 6 Ianuarie 2015

Automatic postback

Postback: este o reincarcare a aceleiai pagini


Unele controale server cauzeaz postback la invocarea anumitor evenimente
(de ex. Click la un buton care da submit la o form)
La evenimentele care nu genereaz postback (de exemplu TextChanged la
un TextBox) evenimentul se arunc la urmtorul postback
Orice eveniment amnat (care nu genereaz postback) se execut inaintea
evenimentului care a cauzat postback
Proprietatea AutoPostback: dac e true atunci evenimentul implicit al
controlului va cauza postback imediat.

Cluj-Napoca - 6 Ianuarie 2015

Managementul starii la nivel de client

View state
Campuri ascunse
Cookies
Query string

HTTP este state-less


nu se mentine starea intre 2 apeluri succesive
Pentru a se transmite informaii intre apeluri trebuie un mecanism special:
managementul starii

Informaiile care se transmit intre pagini se pot salva la nivel de


client sau server

Cluj-Napoca - 6 Ianuarie 2015

Avantaje pentru gestiunea strii la nivel client

Scalabilitate mai bun: nu se consum memorie pe server


Se poate distribui continutul aplicaiei de ctre mai multe servere
Altfel, nu se poate schimba in mijlocul unei sesiuni de navigare serverul care livreaz
continutul

Avantaje pentru gestiunea strii la nivel de server


Securitate sporit
Niciodat nu se va salva la client informaie sensibil precum parolele

Trafic sczut:
In special cand datele care trebuie gestionate sunt multe

Cluj-Napoca - 6 Ianuarie 2015

View state

Datele sunt salvate in view state a paginii si sunt trimise in raspunsul serverului
ctre client
La urmtoarea cerere a clientului, view state este returnat cu aceast cerere
La procesarea cererii, ASP.NET preia view state din request si il foloseste ca s
reseteze proprietile paginii si a controalelor pe care le afiseaz

Acest mecanism permite ASP.NET s aib date obiecte intre mai multe cereri fr
s le stocheze pe server

Proprietatea Page.ViewState: un dictionar pentru a retine valorile dintre mai


multe cereri ale aceleiai pagini

Obiect de tipul StateBag


Valoarea de hash este salvat in campul ascuns _ViewState

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"


value="/wEPDwULLTEzNjkxMzkwNjRkZAVvqsMGC6PVDmbCxBlPkLVKNahk" />

Cluj-Napoca - 6 Ianuarie 2015

View state (II)

Implicit este activat pentru pagin si toate controalele sale


Pentru a minimiza traficul, se recomand dezactivarea view state
pentru acele controale unde nu este necesar

Cluj-Napoca - 6 Ianuarie 2015

Citirea / scrierea datelor din view state

Se poate folosi view state pentru a persista date intre cererile unui client

//writing to view state


this.ViewState.Add("MyData", "some data value");
//read from view state
string myData = (string)ViewState["MyData"];

View state este doar la nivelul aceleiasi pagini si nu intre 2 pagini diferite ale
aceleiasi aplicaii
Tipul obiectelor salvate pe View state poate fi orice tip serializabil

Cluj-Napoca - 6 Ianuarie 2015

Campuri ascunse

Sunt campuri de tip input puse in pagina HTML care nu sunt afisate
utilizatorului
Acestea sunt returnate la comanda post a paginii
Controlul HiddenField: are proprietatea Value unde se poate salva date
HiddenField este valabil doar pentru aceasi pagina web si nu intre mai
multe pagini web
HiddenField nu are criptate/hashing: datele sunt gasite in clar in codul
HTML a paginii afisate
HiddenField nu sunt transmise la cererile Get a paginii doar la Post

Cluj-Napoca - 6 Ianuarie 2015

Cookies

Cantitate mic de date scris la client si care este transmis cu o cerere la un website
Cookiurile persistente se scriu ca si fisiere text pe masina client
Ele rezist si dup ce browserul este inchis
Cookie temporar: care persist doar cat timp browserul este deschis
Utilizarea cea mai comun: identificarea unui utilizator intre mai multe vizite a unor
pagini web din website
Cookiurile sunt folosite pentru a se face track la sesiunea utilizatorului

Cluj-Napoca - 6 Ianuarie 2015

Cookies

Probleme: userul poate sterge fisierul cu cookie


Cookies nu rezolva problema aceluiasi utilizator care acceseaza un
website de la calculatoare diferite

Pentru a scrie in cookies se foloseste Response.Cookie.Add


Pentru a citi un cookie se foloseste colecia Request.Cookie
Proprietatea Expires a cookiului: pentru a defini perioada de valabilitate
Dac nu se defineste Exprires, => cookie temporar
Proprietatea Path: pentru a defini domeniul de aplicabilitate a cookiului:
Doar paginile din directorul respectiv vor avea access la cookie

Proprietatea Domain: se stabileste domeniul (web) a cookiului


Cookiul este transmis la toate paginile din domeniu

Cluj-Napoca - 6 Ianuarie 2015

Query string

Sunt adugate la URL-ul cererii


Salveaz variabile care definesc contextul cererii respective
Query string: dup semnul ?, variabilele sunt desprtite de &
Valorile transmite in query string se obtin din colecia
Page.Request.QueryString

Unele browsere au limitatea de 2083 caractere pentru URL


Alt limitate este c query string se aplic doar la cererile get
Utilizatorii pot modifica usor valoarea query string pt ca ea este vizibil
in browser
Valorile din query string trebuie validate !!!!

Cluj-Napoca - 6 Ianuarie 2015

Server side state management

Starea aplicaiei disponibil in toate pagile indiferent de utilizator


Starea sesiunii disponibil doar unui utilizator in sesiunea lui de navigare

Application state: colecia Page.Application


Starea sesiunii: colecia Session

Sesiune: fiecare utilizator are izolat propria sesiune de navigare in site


Sesiunea este disponibil tuturor paginilor navigate de ctre un anume utilizator
Sesiunea este pierdut la terminarea navigrii. La o nou navigare se deschide o
nou sesiune

sessionState mode = off - pentru a dezactiva sesiunile

Cluj-Napoca - 6 Ianuarie 2015

Sesiunii cookieless
Implicit se folosesc cookies pentru a se gestiona o sesiune de navigare
Se poate dezactiva folosirea cookies pentru gestiunea sesiunilor:
sessionState cookieless = true
In acest caz id-ul de sesiune va fi transmis in URL
http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx

Evenimentul Session_start: cand se porneste o nou sesiune


Evenimentul Session_end: cand se abandoneaz sau exprir o sesiune
existent
Aceste dou evenimente se prind in global.asax

Cluj-Napoca - 6 Ianuarie 2015

Medii de dezvoltare curs 11- Informatic Economic, an III

Controale server. Validarea inputului.


Navigarea in website

Gheorghe Cosmin Silaghi

Cluj-Napoca - 11 Ianuarie 2016

Controale server

Furnizeaz functionalitate sporit fa de controalele HTML si un model de


programare consistent
Sunt bazate pe clase din .NET Framework
ASP.NET le afiseaz folosind HTML standard,
Se detecteaz capabilitile browserului si se genereaz cod HTML
customizat pe tip de browser

2 modaliti de folosire a controalelor server:


Utilizarea toolboxului sau

In codul surs ASPX, se includ taguri <asp: >

Controalele server sunt localizate in HTML in elemente care au runat=server


Controalele au un atribut unic numit ID prin care se asigur o referin ctre obiectul
asociat controlului
Celelalte proprieti pot fi setate din fereastra properties

Cluj-Napoca - 11 Ianuarie 2016

Label

Afiseaz un text la o locaie specific din pagina web


Se utilizeaz cnd dorim s schimbm in mod programatic vreuna din proprietile
labelului
De obicei sunt utilizate in forme lang cate un TextBox asociat
Label este afisat intr-un element <span>

1.
2.
3.
4.

Asocierea unui label cu un control de input se face:


se adaug controlul label, si controlul user input precum TextBox, CheckBox, ListBox
Label.AccessKey se asociaz un keyboard shorcut (de ex. Alt+T)
in proprietatea Label.Text se poate face underline la litera corespunzatoare
Label.AssociatedControlID se seteaz ID-ul controlului asociat

Cluj-Napoca - 11 Ianuarie 2016

Controlul Literal

Pentru a afisa cod basic HTML intr-o pagin,


Fat de Label, nu are proprietate de stil, deci nu se pot afisa stiluri
Folosit pentru a afisa text in mod dinamic
Proprietatea Mode: specific modul de tratare a continutului proprietii Text
- PassThrough: textul este afisat fr nici o formatare
- Encode: textul este encodat HTML. Orice marcator HTML este afisat ca si cum nu ar
fi marcator HTML
- Transform: continutul este convertit pentru a se potrivi cu flavorul HTML a
browserului client

Cluj-Napoca - 11 Ianuarie 2016

Controlul TextBox

Folosit pentru a prelua input de la utilizator


Proprietatea TextMode: poate fi SingleLine, MultiLine sau Password
MaxLenght: limiteaz numrul de caractere care pot fi introduse in textbox
Evenimentul TextChanged: dac se schimb continutul textboxului. Nu este
de tip Postback

Cluj-Napoca - 11 Ianuarie 2016

Controlul CheckBox

Permite utilizatorului s introduc alegeri de tipul Yes-No


Evenimentul CheckedChanged: dac starea controlului se schimb
Acesta nu este un eveniment postback
CheckBoxList: pentru a crea un grup de controale checkbox

Cluj-Napoca - 11 Ianuarie 2016

Controlul RadioButton

Un control care permite utilizatorului s selecteze din mai multe optiuni


Pentru a grupa mai multe butoane radio intr-un grup se utilizeaz optiunea
GroupName
Se poate folosi RadioButtonList pentru a crea o list de butoane radio
Evenimentul CheckedChanged pentru a prinde schimbarea strii butonului
nu este postback

Cluj-Napoca - 11 Ianuarie 2016

Controlul DropDownList

Permite utilizatorului sa selecteze din mai multe optiuni, care toate sunt
afisate pe ecran
Optiunile sunt salvate in colectia Items a controlului
Evenimentul SelectedIndexChanged: notific schimarea selectiei
- nu este postback

Cluj-Napoca - 11 Ianuarie 2016

Controlul Listbox

Permite selectarea unei optiuni


Ne furnizeaz un derulator dac nu incap toate optiunile in fereastr
Implicit se poate selecta o singur optiune
Proprietatea SelectionMode se poate pune Multiple: se pot selecta mai
multe optiuni
Pentru selectarea mai multor optiuni care nu sunt succesive se poate folosi
tasta Ctrl

Cluj-Napoca - 11 Ianuarie 2016

Controlul Button

Afiseaz un buton care de obicei cauzeaz postback


2 tipuri de butoane: submit si command
Daca un handler trebuie atasat mai multor butoane, acesta se pune in evenimentul
Button.Command
Pentru a se putea deosebi intre aceste butoane se utilizeaz proprietatea
CommandName
Proprietatea CausesValidation: dac va genera o validare a paginii la apsarea
butonului

Cluj-Napoca - 11 Ianuarie 2016

Controalele Table, TableRow si TableCell

Pentru a afisa o tabel: controlul Table


Se pot adauga in mod programatic TableRow si TableCell
Randurile si celulele tabelei trebuie recreate la un postback
Proprietatea Rows: contine randurile tabelei (TableRow)
Proprietatea Cells a unui TableRow: contine celulele randului

Cluj-Napoca - 11 Ianuarie 2016

Controlul Image

Pentru a afisa o imagine. Se foloseste dac dorim s manipulam programatic


imaginea
Altfel, se recomanda utilizarea unei imagini statice in HTML

ImageButton: dac dorim s tratm imaginea ca si un buton. Are eveniment Click


ImageMap: se pot defini regiuni din imagine care s aib atasate handlere diferite
pentru click

Cluj-Napoca - 11 Ianuarie 2016

Controlul Calendar

Calendarul este folosit pentru a permite utilizatorului s selecteze o dat


calendaristic
SelectionMode poate fi Day, Week sau WeekMonth sau one
Evenimentul SelectionChanged: dac se selecteaz o dat. Este postback
Utilizatorul poate accesa data selectat prin SelectedDates

Cluj-Napoca - 11 Ianuarie 2016

Controlul FileUpload

Permite selectia si uploadul unui fisier


Se afiseaz un textBox si apoi un buton Browse
Genereaz un element de tip input type=file
Selectarea unui fisier nu cauzeaz postback.
Fisierul poate fi tratat ca si
Sir de octeti prin proprietatea FileBytes
Stream prin proprietatea FileContent
PostedFile: un obiect de tip HttpPostedFile, cu contenttype si contentlenght

Cluj-Napoca - 11 Ianuarie 2016

Controlul Panel

Control folosit ca si contrainer pt alte controale


In HTML se genereaz un element div
Proprietatea BackimageURL: pentru a afisa o imagine de background
HorizontalAlignment: alinierea orizontala a controalelor
Wrap: modul de wrapping, in caz de resize a ferestrei browserului
DefaultButton: care este butonul (controlul) implicit la apsarea Enter

Cluj-Napoca - 11 Ianuarie 2016

Controlul Wizard

Afiseaz o colecie de controale WizardStep


Permite ca doar un singur WizardStep s fie vizibil la un moment dat,
Se permite colectarea unei cantiti mari de date de la utilizator in pasi, astfel incat
acesta s introduc doar buci de date la un moment dat
Acelasi rezultat poate fi obtinut cu pagini web separate

Cluj-Napoca - 11 Ianuarie 2016

Frameworkul pentru validarea datelor

Client-side: este convenabil pentru utilizator pentru c nu trimite datele la


server
Client-side nu este convenabil dpdv al securitii: un client rauvoitor poate
sri peste validarea client-side
Server-side: creste securitatea
Controale de validare: in toolbox
Se trag controalele de validare lang controalele validate
Se seteaz proprietatea ControlToValidate la controlul care este validat.
Proprietatea ErrorMessage: mesajul care va fi afisat pentru a asista userul la
introducerea datelor
Proprietatea Text: mesajul care va fi afisat in cazul in care validarea
genereaz eroare
Controlul ValidationSummary: sumarizeaz toti ceilalti validatori

Cluj-Napoca - 11 Ianuarie 2016

Server-side validation

Clasa Page are o colectie Validators care contine toti validatorii utilizati
pe pagin
Clasa Page are o metod Validate care determin executia tuturor
validatorilor si verificarea dac ceva nu se valideaz
Metoda Validate seteaz PageIsValid
ASP.NET apeleaz in mod implicit metoda Validate dup metoda Load a
paginii => se poate utiliza PageIsValid in handlerele de evenimente

Cluj-Napoca - 11 Ianuarie 2016

Client-side validation

ASP.NET genereaz cod pentru validare la client la utilizarea controalelor de


validare
Acest cod (JavaScript) se execut la momentul in care utilizatorul introduce
date i se incearc eliberarea focusului controalelor validate
Validarea Client-side este convenabil: nu trimite date la server pn nu se
trec toate validrile
Client-side validation poate fi srit prin setarea proprietii CausesValidation
la false pentru controalelele pentru care se doreste evitarea validrii

Cluj-Napoca - 11 Ianuarie 2016

Grupuri de validare

Permite impartirea paginii in grupuri care s se valideze independent


Proprietatea ValidationGroup: setat la un string care specific sectiunea din
pagin care se valideaz in grupul respectiv
La un control de tip Postback, atunci cand se incearc submituirea paginii,
se valideaz toate controalele care au setat acelasi ValidationGroup
Proprietatea Page.IsValid reflect doar starea controalelor utilizate la
validare
Metoda Validate a lui Page poate fi invocat si cu stringul utilizat in
ValidationGroup

Cluj-Napoca - 11 Ianuarie 2016

Controale de validare

RequiredFieldValidator: ne asigur faptul c utilizatorul a tiprit input in


control
CompareValidator:
se face validare prin utilizarea operatorilor de comparare (ValueToCompare)
Se poate face validare dac data introdus este de un anume tip
Pentru compararea cu valoarea din alt control: ControlToCompare

RangeValidator:
Dac inputul utilizatorului se afl ntr-un domeniu specificat de 2 limite

RegularExpressionValidator:
Dac inputul este conform cu expresia regulat specificat in ValidationExpression

CustomValidator:
Programatorul poate scrie propriul cod care s se execute pentru validare
Se poate scrie cod JavaScript pt validare client sau cod .NET C# pentru validare server

Cluj-Napoca - 11 Ianuarie 2016

Navigarea in site

Se refer la modul in care utilizatorul este purtat intre paginile sitului


Utilizatorul trebuie sa simt faptul c miscarea pe o alt pagin este planificat si
sigur
Postback: datele sunt trimise aceleiasi pagini
Programatorul trebuie s se asigure ca datele sunt trimise corect altor pagini care se
incarc (in cazul in care nu avem Postback)

Cluj-Napoca - 11 Ianuarie 2016

Client-side navigation

Se utilizeaz control HyperLink cu proprietatea NavigationUrl


Acesta genereaz tag HTML <a>
Se poate genera client-side navigation prin JavaScript prin schimbarea
proprietii location a obiectului document

Cluj-Napoca - 11 Ianuarie 2016

Cross-page

Datele sunt procesate intr-o pagin nou care se incarc


Controlul Button are proprietatea PostBackUrl: se poate scrie pagina
care trebuie s se incarce
Page.PreviousPage: contine datele din pagina anterioar navigrii
Se poate utiliza metoda FindControl pentru a regsi un control din
pagina anterioar
Proprieti StronglyTyped: pentru a permite evitarea folosirii
FindControl
In pagina cu datele, se defineste o proprietate public care s expun data dorit
Se seteaz PreviousPageType din pagina de procesare ctre pagina cu datele
<%@ PreviousPageType VirtualPath="~/ProcessingPage.aspx" %>
Se poate folosi PreviousPage.NumeProprietate

Cluj-Napoca - 11 Ianuarie 2016

Redirectionare

De exemplu, dup finalizarea procesrii handlerului asociat unui buton, s se


redirecteze pe o nou pagin
Page.Response are metoda Redirect
PreviousPage nu se populeaz in cazul utilizarii metodei Redirect
Redirect afecteaz browserul, in sensul in care cererea de redirectare e fcut de
ctre browser

Page.ServerTransfer: redirect fr s afectm browserul


In browser se va afisa URL-ul paginii care a invocat ServerTransfer

Cluj-Napoca - 11 Ianuarie 2016

Medii de dezvoltare curs 12- Informatic Economic, an III

Tracing si debugging
Securitatea in ASP.NET

Gheorghe Cosmin Silaghi

Cluj-Napoca - 13 Ianuarie 2016

Debugging

VS permite debugging prin breakpoints, fereastra watch, urmrirea


programului pas cu pas si informaii despre erori

Activarea debugerului:
1. in solution explorer click dreapta pe website, si apoi pagina properties
2. se selecteaz start options (sau Web in VS 2013)
3. in sectiunea Debuggers se selecteaz ASP.NET

Cluj-Napoca - 13 Ianuarie 2016

Configurarea debuggerului

Se poate permite debugging la nivel de site sau la nivel de pagina


Activarea debuggerului: inserarea de cod pentru debugging
Performant mai sczut

Configurare pt intregul site: web.config

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<system.web>
</configuration>

Configurare la nivel de pagina

<%@ Page Debug="true" ... %>

Cluj-Napoca - 13 Ianuarie 2016

Pagin global de erori la nivel de site

Se poate seta o pagin de eroare la nivel de site


In web.config se utilizeaz tagul <customErrors> in cadrul <system.web>
Dac se seteaz remoteOnly = true, atunci utilizatorii care ruleaz de pe server
primesc eroarea real
defaultRedirect: indic url-ul paginii globale de tratare a erorii

<configuration>
<system.web>
<customErrors defaultRedirect="SiteErrorPage.aspx" mode="RemoteOnly">
<error statusCode="403" redirect="RestrictedAccess.aspx" />
</customErrors>
<system.web>
</configuration>

Cluj-Napoca - 13 Ianuarie 2016

Remote debugging

Pentru a face debug de la distant pe o aplicaie web care ruleaz pe un


server web diferit de masina curent
Pe serverul web se porneste VS Remote Debugging Monitor (msvsmon.exe)
La pornirea monitorului, se solicit configurarea Windows Firewall pentru a
permite conexiunea incomming
In fereastra Options la monitorului se seteaz numele serverului si metoda
de autentificare
Remote, se porneste VS
In meniul debug se foloseste Attach to process
La qualifier se trece numele serverului setat in options in monitor (de obicei
e User@server)
La available processes apar procesele de pe server si se selecteaz procesul
ASP.NET

Cluj-Napoca - 13 Ianuarie 2016

Tracing

Informatia logat de aplicaie (trace-urile aplicaiei) pot fi afisate in


browser: tracing
Se furnizeaz informaie despre evolutia site, cine a accesat siteul,
rezultatele cererilor, cum arat cererile / raspunsurile HTTP
Pentru a activa tracing: web.config la nivelul intregului website

<configuration>
<system.web>
<trace enabled="true"
requestLimit="100"
pageOutput="false"
traceMode="SortByTime"
localOnly="false"
mostRecent="true" />
<system.web>
</configuration>

Cluj-Napoca - 13 Ianuarie 2016

Tracing la nivel de pagin


<@Page trace="true" ... />

Pentru a vizualiza trace-ul se acceseaz pagina trace.axd


Daca trace este activat la nivel de pagin atunci va fi afisat pe orice pagin din
orice browser: potential de afisare a unor informaii sensibile

Cluj-Napoca - 13 Ianuarie 2016

Informatia afisat de ctre trace:

Request details: informaii generale despre pagina solicitat


Trace information: informaii despre ciclul de viat a paginii web
Control Tree: informaii despre fiecare control din pagin
Session state: informaii despre sesiune si variabilele de sesiune
Application state: variabilele aplicaie si valorile lor
Request cookie collection: cookies care sunt transferate la server cu
requestul
Response cookie collection: cookiurile care sunt tranferate ctre browser
Headers collection: HTTP headers transmise ctre server parte a requestului
Form collection: variabilele trimise la server parte a unei comenzi Post
Query string collection: variabilele transmise la server parte a query string
Server variables: toate variabilele de pe server

Cluj-Napoca - 13 Ianuarie 2016

Clasa Trace
In namespace-ul system.Diagnostics
Se pot afisa propriile mesaje de trace care s apar in paginile de trace
Fiecare mesaj are o categorie si un mesaj
Trace.Write("Custom Category", "Page_Load called");

Cluj-Napoca - 13 Ianuarie 2016

User profiles

Profil utilizator: o multime de caracteristici asociate unui utilizator


Poate include preferinta de culori, informatii legate de adres sau alte informaii care
se doresc a fi inregistrate despre un utilizator

Se poate configura site-ul in web.config pentru a permite stocarea profilelor utilizator

1. configurarea furnizorilor de user profile: informatiile vor fi stocate intr-o BD

2.
3.
4.
5.

Implicit e SQL server provider

definirea user profile: se seteaz campurile care s fie salvate pentru fiecare profil
identificarea utilizatorilor: se pot identifica atat useri anonimi cat si cei autentificati
setarea si salvarea profilului
recunoasterea unui utilizator care se reintoarce

Cluj-Napoca - 13 Ianuarie 2016

Configurarea furnizorilor de profile utilizator


<profile>
<providers>
<add name="AspNetSqlProfileProvider"
connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>

LocalSqlServer: configurat in machine.config ca s arate ctre versiunea local


a lui SQL Express
ConnectionStringName: poate fi pointat ctre orice connection string definit in
web.config

Cluj-Napoca - 13 Ianuarie 2016

Configurarea unui nou BD cu profile

Se foloseste Aspnet_regsql.exe
Dac se execut fr parametrii: se porneste o interfa grafic un un wizzard
Dup ce baza de date este configurat, trebuie pus connection stringul in web.config

Definirea profilelor utilizator


Se determin fisierele pe care se doreste s se faca tracking pentru utilizatori
Fiecare valoare care se doreste inregistrat se defineste ca si o proprietate a profilului
In web.config avem elementul <profile> si apoi elementul <properties>
Elementul <allowAnonymous>: permite logarea vizitelor utilizatorilor anonimi. Se face
tracking prin browser cookie
<profile>
<properties>
<add name="FirstName" />
<add name="LastName" />
<add name="LastVisit" type="System.DateTime" />
</properties>
</profile>

Cluj-Napoca - 13 Ianuarie 2016

Identificarea utilizatorilor
User profiles sunt activate automat pentru utilizatorii autentificati
Dac utilizatorii nu se autentific: trebuie folosit anonymousIdentification in
web.config
<anonymousIdentification enabled="true" />
Elementele care se doresc locate se mentioneaz cu allowAnonymous

La autentificatea utilizatorului se poate migra profilul anonim la un profil


autentificat
Prin prinderea evenimentului MigrateAnonymous

Cluj-Napoca - 13 Ianuarie 2016

Salvarea profilelor

Se seteaz valorilor proprietilor individuale


Se apeleaz Profile.Save
De obicei se creaz in site o pagin de setri unde utilizatorul isi seteaz
propriile preferinte
La apelul butonului save pe pagin se face Profile.Save

Recunoasterea unui utilizator returning se poate face in Load a paginii

Cluj-Napoca - 13 Ianuarie 2016

Metode de autentificare in aplicatiile web


Windows: basic, digest, integrated windows authentication
Forms authentication
Client certificate authentication

Cluj-Napoca - 13 Ianuarie 2016

Cum functioneaza mecanismul de securizare

Autentificare: verifica daca un


utilizator este intradevar acela care se
pretinde a fi. Aplicatia obtine
credentialele utilizatorului. Daca acestea
sunt valide, atunci utilizatorul respectiv
se considera a fi autentificat
Autorizare: limiteaza drepturile de
access prin acordarea sau interzicerea
unor permisiuni specifice utilizatorilor
autentificati

Cluj-Napoca - 13 Ianuarie 2016

Impersonation

Implicit, toate cererile sunt


executate cu contul ASP.NET sau
cu contul Network Service
Web.config:

<identity impersonate="true" />

Cere in mod explicit realizarea


impersonrii

Pentru a se realiza impersonare la


un username specificat

<identity impersonate="true"
userName="DOMAIN\UserName"
password="Password"/>

Cluj-Napoca - 13 Ianuarie 2016

Form authentication

Cluj-Napoca - 13 Ianuarie 2016

Sintaxa fisierului de configurare


<authentication mode="[Windows|Forms|None]">
<forms name="name" loginUrl="url"
protection="[All|None|Encryption|Validation]
timeout="minutes" path="path
requireSSL="[true|false]
slidingExpiration="[true|false]
defaultUrl="string
cookieless="[UseCookies|UseUri|
AutoDetect|UseDeviceProfile]"
domain="string>
<credentials passwordFormat="[Clear|MD5|SHA1]">
<user name="********" password="********"/>
</credentials>
</forms>
</authentication>

Cluj-Napoca - 13 Ianuarie 2016

Sintaxa fisierului de configurare


<authorization>
<allow users="comma-separated list of users
roles="comma-separated list of roles
verbs="comma-separated list of verbs" />
<deny users="comma-separated list of users
roles="comma-separated list of roles
verbs="comma-separated list of verbs" />
</authorization>
<identity impersonate ="[true|false]
userName="domain\username"
password="password" />
<trust level="[Full|High|Medium|Low|Minimal]"
originUrl=""/>
Cluj-Napoca - 13 Ianuarie 2016

Windows authentication
<system.web>
<authentication mode="Windows"/>
</system.web>
Identitatea Windows furnizata sistemului de operare este utilizata pentru
verificarea permisiunilor precum drepturi asupra fisierelor locale sau
conectarea la baza de date utilizand integrated security
" Implicit, aceasta este identitatea procesului ASP.NET
" Impersonarea identitatii furnizate de IIS pentru toate taskurile din sistemul
de operare Windows care necesita autentificare (precum accesul la fisiere
sau la retea):
"

<system.web>
<authentication mode="Windows"/>
<identity impersonate="true"/>
</system.web>

Cluj-Napoca - 13 Ianuarie 2016

Forms authentication

Clasa FormsAuthentication
Aplicatia se redirecteaza automat catre forma de Login atunci cand se solicita access
la o resursa protejata
Daca credentialele sunt valide, clasa FormsAuthentication permite sa se redirecteze
apelul inapoi la cererea initiala
Forms authentication se seteaza in Web.config
Credentialele pot fi setate fie in web.config fie intr-un fisier separat

<authentication mode="Forms">
<forms name="SavingsPlan" loginUrl="/Login.aspx">
<credentials passwordFormat="SHA1">
<user name="Kim
password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6"/>
<user name="John
password="BA56E5E0366D003E98EA1C7F04ABF8FCB3753889"/>
</credentials>
</forms>
</authentication>
String authUser2 = User.Identity.Name;
Cluj-Napoca - 13 Ianuarie 2016

Ges9onarea u9liztorilor u9lizand


membership
" ASP.NET membership se u9lizeaza impreuna cu Forms authen9ca9on
" Informa9a referitoare la u9lizatori se pastreaza intr-un data source (baza
de date)
" Controlul ASP.NET login permite realizarea unui sistem complet pentru
auten9carea u9lizatorilor
" Facilita9:
n Crearea u9lizatorilor noi si a parolelor. Ges9unea acestora
n Salvarea informa9ilor referitoare la useri pe server SQL Server
n Auten9care u9lizand controalelele de login ASP.NET

" Membership providers:


n SQL Server
n Ac9ve directory

Cluj-Napoca - 13 Ianuarie 2016

S-ar putea să vă placă și