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
handouts la fiecare curs din Microsoft Official Curricula
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
13 revision

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 application
WPF application
Class Library
Windows Forms
Application
ASP.NET Web application
ASP.NET MVC 2
Application
Silverlight Application
WCF Service application

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 grafice 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 runtime

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 Of
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
46
max/min ale controlului

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 sau48coloanei sau

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: colectie care expune controalele
continute
Button aButton;
aButton = (Button)grid1.Children[3];

Alinierea controalelor
Se poate face la designTime cu utilizarea 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>/<File
Name>

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


62
intreaga fereastr

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
63
obiectului care le utilizeaz

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
64
resurs

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

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

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

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 logof 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

88

Medii de dezvoltare curs 4- Informatic Economic, an III


Controale definite de utilizator

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 templateului 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();
103
PieClass.FlavorProperty = DependencyProperty.Register("Flavor",

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

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

Aplicatii Windows
Aplicatii web

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


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

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

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 defered 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;
Expresia poate fi compus din mai multe instructiuni x = theYear;
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
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


Entity 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 (codefirst)
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):

StoreGeneratedPattern (la coloane): dac valoarea proprietii va fi


sau nu autogenerat.

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

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="Codebehind.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>
public
partial class Code_behind :
<body>
System.Web.UI.Page
<form id="form1" runat="server">
{ The time is:
<asp:Label
runat="server" sender,
protected ID="TimeLabel"
void TimeLabel_Load(object
onload="TimeLabel_Load"></asp:Label>
EventArgs e)
</form>
{
</body>
TimeLabel.Text = DateTime.Now.ToString();
</html>

}
Cluj-Napoca
//Code-behind.aspx.cs

- 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 tip colectie: System.Web.Caching.Cache
Proprietatea Page.Cache foloseste un singur obiect pe
aplicatie (intr-o aplicatie web exista un singur obiect
Cache)
Cache["Greeting"] = "Hello, cache!";
if (Cache["Greeting"] != null)
Label1.Text = (string)Cache["Greeting"];
else
Label1.Text = "Hello, world!";

Pentru adaugarea mai sofisticata a unui element in


cache se poate folosi metoda Insert
Seteaza prioritati, timpul 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

Comportament de caching configurat pentru fiecare


pagina:
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


Gestiunea 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

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


la apariia unei cereri

Se poate folosi pentru a loga informaie referitoare la cerere

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 = of - 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>

Asocierea unui label cu un control de input se face:


1. se adaug controlul label, si controlul user input precum TextBox, CheckBox,
ListBox
2. Label.AccessKey se asociaz un keyboard shorcut (de ex. Alt+T)
3. in proprietatea Label.Text se poate face underline la litera corespunzatoare
4. 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:

RangeValidator:

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

RegularExpressionValidator:

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

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

Implicit e SQL server provider

2. definirea user profile: se seteaz campurile care s fie salvate pentru


fiecare profil
3. identificarea utilizatorilor: se pot identifica atat useri anonimi cat si cei
autentificati
4. setarea si salvarea profilului
5. 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

Gestionarea utiliztorilor utilizand


membership
ASP.NET membership se utilizeaza impreuna cu Forms
authentication
Informatia referitoare la utilizatori se pastreaza intr-un data
source (baza de date)
Controlul ASP.NET login permite realizarea unui sistem
complet pentru autentificarea utilizatorilor
Facilitati:
Crearea utilizatorilor noi si a parolelor. Gestiunea acestora
Salvarea informatiilor referitoare la useri pe server SQL Server
Autentificare utilizand controalelele de login ASP.NET

Membership providers:
SQL Server
Active directory

Cluj-Napoca - 13 Ianuarie 2016

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