Szoftverfejlesztés .NET platformon - MCP 70-526 tanfolyam

A VIK Wikiből
A lap korábbi változatát látod, amilyen Hryghr (vitalap | szerkesztései) 2013. május 19., 22:28-kor történt szerkesztése után volt. (Hryghr átnevezte a(z) Szoftverfejlesztés .NET plattformon - MCP 70-526 tanfolyam lapot a következő névre: Szoftverfejlesztés .NET platformon - MCP 70-526 tanfolyam: pontos név)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.



%TOC{depth="3"}%

Időpont: 2007.04.16-2007.04.20. 16:00:00-19:30:00

A tanfolyam végén MCP vizsgalehetőséget lehet kapni, annak, aki

  • mind az 5 alkalmon bent volt
  • a pénteki teszten a jobbik 50%-ban szerepelt

A vizsgához MCTS könyvet lehet kölcsönözni. 10 példány van belőle, de a CD mellékletén fenn van a teljes könyv kereshető formában. A tanfolyam a könyv 15 fejezetéből 10-et fed le.

Előadók:

  • Követelmények ismertetése: Lippé Szabolcs
  • Fóliák: Kereskényi Robi

2007.04.16. Windows Forms alapok

  • Form propertyk: mi a neve, mi a hatása. Említettük: StartPosition (felülbírálja a sima Position-t), Opacity, TopMost.
  • Form példányosítása, megjelenítése.
  • Események, létrehozásuk designerből vagy kódból.
  • Egyedi alakú form: megjelenítés előtt Region propertyt kell állítani, GraphicsPath típusú objektumot vár.

Ilyenkor nincs címsor, bezáró gomb. stb.

Controlok elhelyezése

  • Controlok rakhatók közvetlenül a formra vagy helyőrzőbe (Panel, GroupBox, stb.)
    • Panel: benne lévő controlok öröklik a panel tulajdonságait (pl. Enabled, Visible, Position, Font), lehet benne scrollozni (AutoScroll=true)
    • GroupBox: Panel + keret + cím, nem tud automatikusan scrollozni. Használják pl. RadioButtonok csoportosítására.
    • FlowLayoutPanel: a benne lévő controlokat folytatólagosan helyezi el a megadott irányban, támogatja a sortörést. Manuális sortörés: SetFlowBreak(control): a megadott control elé sortörést illeszt be.
    • TableLayoutPanel: táblázatos megjelenítés. Alapból az első üres cellába teszi be a controlt. Sorok számozása 0-tól kezdődik, oszlopoké 1-től. 1 cellába csak 1 control mehet. Beállítható, hogy új sorral, új oszloppal vagy ne bővítse automatikusan.
    • TabControl: támogatja az automatikus scrollozást, definiálható a tabok sorrendje.
    • SplitContainer: két panel, közötte mozgatható elválasztó vonal. Az egyik panel beállítható collapsed-nek (nem látható). Beállítható az egyik panel fix méretűre (ablak átméretezéskor számít). Orientation: vízszintes vagy függőleges. Megadható a paneleknek minimális méret.
  • Control elhelyezése konténeren belül:
    • Anchor: a control milyen távolságot tartson a konténer széleitől. Alapból a konténer átméretezésekor balra és fölfelé tartja a távolságot.
    • Dock: olyan anchor, ami 0 távolságot tart a konténer megadott széleitől.

control.Dock=DockStyle.Fill: kitölti a teljes szélességet és magasságot.

  • View / Document Outline: a controlok hierarchiáját mutatja. A controlok drag&drop módszerrel áthelyezhetők az egyik konténerből a másikba.
  • Designer támogatás
    • Control elhelyezése formon 4 módszerrel (drag&drop, control választás
    • Áthelyezéskor segédvonalakkal (snap lines) segíti a pontos elhelyezést.
    • Több control property-i egyszerre is szerkeszthetők.
    • Smart tagbe ki vannak vezetve a legfontosabb szerkesztési funkciók.

Control típusok

Egyszerű

  • TextBox: 1 vagy többsoros (MultiLine=true) szövegbevitelhez. Sortörés, scrollbarok, automatikus kiegészítés beállítható (AutoCompleteMode, AutoCompleteSource). Jelszó bevitel: TextMode, PasswordChar.
  • MaskedTextBox: csak bizonyos karaktereket vagy karaktersorozat mintákat fogad el. Pl telefonszám, serial number vagy IP cím beírása. A minta fix karaktereit prompt karakternek hívják. A Text property alapból a sallangot is visszadja, átállítás: CutCopyMaskFormat, TextMaskFormat.
  • NumericUpDown: textbox + föl-le nyilacska.
  • DomainUpDown: előre definiált string listában (Items) lépked.
  • CheckBox
    • Checked: be van-e pipálva.
    • CheckedState: Checked, Unchecked, Indeterminate (3 állapotú). Semleges állapotban akkor lehet, ha ThreeState=true.
  • TrackBar: csúszka, minimum és maximum érték között lehet navigálni.
    • SmallStep: balra-jobbra nyíl mennyit mozgasson, LargeStep: Page Up-Page Down mennyit mozgasson.
    • Value: kiválasztott érték.
  • MonthCalendar: dátumot lehet vele választani.
    • Beállítható minimális és maximális dátum és maximális intervallum hossz.
  • PictureBox
    • Image: System.Drawing.Image típusú objektumot lehet hozzákötni
    • ImageLocation: file-t vagy url-t jelenít meg
    • SizeMode: ő kövesse a kép méretét vagy a képet kicsinyítse
  • WebBrowser
    • Navigate(string path): megjeleníti egy url vagy egy file tartalmát, akár IE pluginnal is (pl. Word).
    • Lehet vele nyomtatni.
  • NotifyIcon: tray menü + sárga buborék
    • BalloonTipIcon, BalloonTipTitle, BalloonTipText, ContextMenu

Lista

  • ListBox, ComboBox, ListView, CheckedListBox, stb.
    • Adatkötés: DataSource, DataMember, FormatString
    • Elemek: Items, SelectedIndex (0-tól kezdődik), SelectedIndices, SelectedItem. Elemhalmaz módosítása: Add (végére), AddRange (végére sokat), Insert, RemoveAt, Remove. Keresés: IndexOf(), találat: >=0, nincs találat: -1.
    • Rendezés: Sort tulajdonság
    • SelectionMode: SingleSelect, MultiSelect (egyszerre hányat lehetten kiválasztani)
    • DropDownStyle: a ComboBox képes sima vagy legördülő listaként megjelenni
  • CheckedListBox
    • Nem köthető.
    • Kiválasztott elemek: CheckedIndices
  • ListView
    • Több módja van: egyszerű lista, detail nézet, kis ikonok, nagy ikonok.
    • Detail nézet a benne tárolt objektumok property-it jeleníti meg.
    • Képek megjelenítése detail nézetben: ImageList nem vizuális kontrolból kell képet (ImageKey vagy index) választani.
  • TreeView: adatok hierarchikus megjelenítésére alkalmas. Egy elemnek egy szülője lehet. Design time és kódból is felvehetők az elemek (TreeNode-ok).
    • Be lehet állítani, hogy mi legyen automatikusan kinyitva. Feltölthető kinyitáskor is.
    • A TreeNode tárol egy csomó pointert: FirstNode, NextNode, ParentNode, ChildNodes

Access key hozzárendelése

Access key = ugrás textboxra Alt+betűvel.

Tegyük fel, hogy van egy labelünk és egy textboxunk.

  • label.UseMnemonic=true.
  • label.Text-ben & karakter az egyik betű elé.
  • Label TabOrder-e legyen 1-gyel kisebb, mint a kapcsolódó TextBox-é.
  • Nem csak labellel működik.

Menü

  • MenuStrip: MenuStripItemeket tartalmaz.
  • ToolStrip: ToolStripItemeket tartalmaz, összerendelhető menü elemekkel
  • Beállítható, hogy átrendezhető legyen a felhasználó által, merge-ölhető legyen, hogyan merge-ölődjön, kitöltse a teljes szélességet (Stretch=true).
  • Label, Combobox, stb. controloknak van ToolStripItem leszármazott változatuk is.
  • ToolStripContainer: lehetővé teszi a toolbar dokkolását (megadható, hogy melyik oldalakra). A tartalmat a ContentPaneljébe kell belerakni. Belepakolhatók a ToolStripek és a menü is.
  • SoftKey: Alt+betű hatására a menüpontra ugrik, ShortcutKey: végre is hajtja a menüpontot. Szöveg: ShortcutKeyDisplayString.
  • A menüpontokhoz checkbox is rendelhető: Checked, AutoChecked.
  • Visible=false: a menüpont nem jelenik meg, Enabled=false: megjelenik, de ki van szürkítve.
  • Context menü is rendelhető a controlokhoz (ContextMenu property)

Események

  • Click, DoubleClick, MouseEnter, MouseMove, MouveLeave (esemény paraméter: MouseEventArgs)
  • KeyPressed, KeyDown, KeyUp (esemény paraméter: KeyEventArgs)

Mintapélda

Virtual PC image: =c:\Program Files\Microsoft Learning46\Drives46B-LON-DEV-01-01.vmc=

  • Konfiguráció: Visual Studio 2005 + SQL Server 2005
  • user: student vagy administrator, jelszó: Pa$$w0rd
  • Minta alkalmazás lépésről lépésre: E:\Labfiles\Solution46B_W01_LA.doc

2004.04.17. Adatbázis kliens oldali programozása, adatkötés

Adatbázis kapcsolódás

  • Connection: pipeline az adatbázishoz. Alapból 4-féle típusa van: SqlConnection, OracleConnection, OLEConnection (pl. Office-hoz), ODBCConnection. Komponensként a designerben Toolbox/Data, de alapból nem látszik, a context menü Choose Items menüpontjával lehet berakni. Megnyitni az Open() metódussal, lezárni a Close metódussal lehet.
  • Provider: a fizikai adatforrással fel tudja venni a kapcsolatot, felülről nézve egységes interfészt nyújt.

Connection létrehozása varázslóval

  1. Data menü / Add New Data Source
  2. Server Explorer / Add Connection
    • Data Source: Microsoft SQL Server
    • Server Name: .
    • Database Name: AdventureWorks

Server Explorer/Data Connections/lon-dev-01.AdventureWorks.dbo-t kiválasztva a Properties ablakban Connection String=

Data Source=.; Initial Catalog=AdvertureWorks; Integrated Security=true

A Connection Stringet érdemes az

app.config

-ban tárolni.

<connectionStrings> <add name="myconnectionstring" connectionString="Data Source=.;Initial Catalog=AdvertureWorks;Integrated Security=true"/> </connectionStrings> Gond: ha a connection string jelszót tartalmaz, az látszik a plain text file-ban is. Lehet titkosítani az =app.config= szakaszait 3-4 hívással, részletek a könyvben.

SQL Connection API

  • =conn.InfoMessage= esemény: adatbázistól jövő hibaüzenetekre fut le az eseménykezelője.
  • Connection pooling: alapból be van kapcsolva, kikapcsolni a Pool=false paraméterrel lehet a connection stringben.
  • Hiba esetén SqlException-t dob, ami egy SqlErrorCollection-t tartalmaz belül.
  • Elérhető szerverek listája:
    DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
    . Megmondja a szerver nevet, instance nevet, verziót, és hogy clusterezett-e az adatbázis szerver. A tűzfal letilthatja az SQL szerverek felderítését. Ugyanúgy okozhat hibát a túlterhelt hálózat (timeout), vagy ha az SQL Server 2005-ben nem fut az SQL Server Browser Service.

SqlCommand API

Az SqlCommand segítségével le lehet futtatni tetszőleges SQL utasítást vagy tárolt eljárást.

  • SQL utasítás: =cmd.CommandText="<SQL utasítás>";=
  • Tárolt eljárás: =cmd.CommandText="<tárolt eljárás neve>"; cmd.CommandType=CommandType.StoredProcedure;=
  • Tárolt eljárás: =cmd.CommandText="EXEC <tárolt eljárás neve>";=

Paraméterezés:

  • cmd.Parameters kollekciót kell feltölteni.

Előnye a string összefűzéshez képest: átlátható, nincs SQL Injection veszély.

  • Parameters property elemei SqlParameter példányok. Ennek van neve (
    ParameterName
    ), értéke (
    Value
    ), típusa (
    SqlDbType
    ).

Parancs végrehajtása:

  • Nincs visszatérési érték: =cmd.ExecuteNonQuery();=
  • Egy visszatérési érték: =cmd.ExecuteScalar();=. objectet ad vissza, nekünk kell castolnunk. Ha tábla lenne a visszatérési érték, az első sor első oszlopát kapjuk meg.
  • Tábla visszatérési érték: =cmd.ExecuteReader();=. SqlDataReader-t ad vissza, amin végig lehet iterálni.
  • BLOB olvasása: http://msdn2.microsoft.com/en-us/library/87z0hy49(VS.80).aspx

=SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);=
=rdr.GetBytes(columnIndex, startIndex, buffer, 0, bufferSize);=

  • tábla olvasása:
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);<br>
	  while (rdr.Read()) {<br>
	     int value1 = (int)rdr["oszlopnév"];<br>
	     int value2 = rdr.GetInt32(oszlopSorszam);<br>
	  }

Kapcsolatmentes adatbázis elérés

  • DataSet: adatbázist reprezentál.
  • DataSet.Tables: DataTable kollekció.
  • DataTable.Columns: oszlopok.
  • DataTable.Rows: sorok.

A DataSet lehet típusos vagy nem típusos. Típusos DataSet létrehozása:

  • Solution Explorer / Add New Item... / DataSet
  • Server Explorerből húzzunk rá egy táblát.
  • Fordítsuk le.
  • A kódból pl. =DataSet1= néven elérhető a generált típusos =DataSet=.

1. Típusos =DataSet= használata (

Contact

a benne lévő tábla neve)

DataSet1 ds = new DataSet1();
DataSet1TableAdapters.ContactTableAdapter ta =
	new DataSet1TableAdapters.ContactTableAdapter();
ta.Fill(ds.Contact);
foreach (DataSet1.ContactRow cr in ds.Contact.Rows)
	listBox1.Items.Add(cr.FirstName + " " + cr.LastName);

2. A DataAdapter a Toolboxról is felhúzható a formra, ekkor egy varázslóval lehet beállítani, hogy mi jelenjen meg.

3. Nem típusos =DataSet= használata kódból:

SqlDataAdapter da = new SqlDataAdapter("SELECT ...", conn);
// legenerálja az INSERT, UPDATE, DELETE commandokat is a SELECT-ből
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds);

// DataSet listázása
foreach (DataRow dr in ds.Tables[1].Rows)
	 MessageBox.Show((string)dr[0]);
// DataSet megjelenítése DataGridView-ban
dataGridView1.DataSource = ds.Tables[0];

Mintapélda

  • Virtual PC image: =c:\Program Files\Microsoft Learning46\Drives46B-LON-DEV-01-04.vmc=
  • Minta alkalmazás lépésről lépésre: E:\Labfiles\Solution46B_W04_LA.doc

2007.04.18. XML, nyomtatás, globalizáció, drag&drop

XML kezelés

Soros olvasás / írás

=XmlReader=: XML beolvasás sorosan. Nem tárolja a korábban beolvasorr részleteket. Metódusai:

  • konstruktor:
    XmlReader rdr = XmlReader.Create("file név");
  • beolvasás
    • =ReadInnerXml=: az aktuális element belsejét olvassa be.
    • =ReadOuterXml=: az element nyitó részét, belsejét és záró részét olvassa be.
    • =Read=: következő részlet beolvasása. A =NodeType= alapján kell elágazni.

=XmlWriter=: XML írás sorosan. Tud elementet, attribútumot, stb. írni.

  • =WriteStartElement("name")=
  • =WriteEndElement()=: tudja, hogy mit kell lezárni.

XML beolvasása egyszerre

  • konstruktor: =XmlDocument doc = new XmlDocument(); doc.Load("file");=
  • file teljes tartalma: =doc.OuterXml=
  • módosítás
    • =doc.CreateElement(name);=
    • =element.SetAttribute(name, value);=
    • =node.AppendChild(child);=
    • =node.PrependChild(child);=
    • =node.Replace(...);=
  • betöltődés közben a következő események hívódnak meg
    • =NodeInserting=
    • =NodeInserted=

Órai feladat

Könyveket (amik belül chaptereket tartalmaznak) beolvasni XML file-ból, listázást, beszúrást, mentést implementálni.

Nyomtatás

=PageSetupDialog=: oldalméret, margók

=PrintPreviewDialog=: nyomtatási előnézet, egyszerre sok lapot is meg tud mutatni. Ugyanazzal a mechanizmussal működik, mint az éles nyomtatás.

=PrintPageEventHandler=: itt történik a nyomtatás, egy Graphics-re kell rajzolni. Az eseménykezelő megkap paraméterként egy =PrintPageEventArgs= objektumot. Attribútumai:

  • =Cancel=: nyomtatás megszakítása
  • =HasMorePages=: nyomtatás befejezése. Ha true, még egyszer ki fog váltódni a =PrintPage= esemény.
  • =PrintMarginBounds=: margók
  • =PageBounds=:

A nyomtatást bonyolítja, hogy nem automatikus a sortörés és a lapozás.

  • Nyomtatható sorok száma: =e.MarginBounds.Height / font.GetHeight(e.Graphics)=
  • Szöveg kiírása: =e.graphics.DrawString(szöveg, font, Brushes.Black, x, y, new StringFormat());=

Órai feladat

  1. adott méretű (több oldalra kiterjedő) ellipszist kinyomtatni
  2. többsoros szöveg tördelése

2. megoldás:

string lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed " +
	"do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad " +
	"minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip " +
	"ex ea commodo consequat. Duis aute irure dolor in reprehenderit in " +
	"voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur " +
	"sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt " +
	"mollit anim id est laborum.";

private void Form1_Load(object sender, EventArgs e) {
	 PrintDocument doc = new PrintDocument();
	 doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
	 PrintPreviewDialog preview = new PrintPreviewDialog();
	 preview.Document = doc;
	 preview.ShowDialog();
}

void doc_PrintPage(object sender, PrintPageEventArgs e) {
	 Font font = new Font("Arial", 12);
	 float fontHeight = font.GetHeight(e.Graphics);
	 e.Graphics.DrawString(lorem, font, Brushes.Black, e.MarginBounds, new StringFormat());
}

Globalizáció és lokalizáció

  • *Globalizáció*: előre definiált formázások hogyan jelenjenek meg (dátum, pénz, stb.)
  • *Lokalizáció*: alkalmazásban lévő szövegek fordítása

Az aktuális globalizációs kultúrát a =Thread.CurrentThread.CurrentCulture= tartalmazza, a lokalizációs kultúrát a =Thread.CurrentThread.CurrentUICulture=.

Form fordítása a Designerben:

  • =form1.Localizable= = true
  • =form1.Language = (Default)= mellett megszerkeszteni a formot
  • =form1.Language = English= mellett megszerkeszteni az angol változatot (ilyenkor új controlokat nem lehet hozzáadni)

A lokalizált formokat nem tárolja le teljes egészében, csak a különbségeket jegyzi meg.
Nyelvet legkésőbb a form konstruktorában az =InitializeComponent()= hívás előtt lehet váltani.

Drag & drop

Szükséges egy forrás és egy cél control.

  • Egér esemény hatására a forrás controlon meg kell hívni egy =DoDragDrop= metódust. Első paramétere: dragelendő objektum, második paramétere: mód (copy/move/stb.)
  • A cél controlon az =AllowDrop= tulajdonságot true-re kell állítani. Kiváltódnak a következő események:
    • =DragOver=, =DragLeave=: föléhúzzuk az egeret, illetve elhúzzuk róla
    • =DragEnter=: tudja-e fogadni az adott controlt az adott módban. A =DragEventArgs= paraméter mutatja, hogy mi érkezett.
    • =DragDrop=: dropoláskor hívódik meg.

Órai példa: két textbox között szöveg másolása.

  • =textBox1_MouseMove= eseménykezelőben =DoDragDrop(textBox1.Text, DragDropEffects.Copy | DragDropEffects.Move);=
  • =textBox2_DragEnter= eseménykezelőben: =e.Effect = DragDropEffects.Copy;=
  • =textBox2_DragDrop= eseménykezelőben: =textBox2.Text = (string) e.Data.GetData(DataFormats.Text);=

2007.04.19. MDI, többszálúság, controlok írása

MDI formok

  • New Windows Application
  • New Form, Name: =ChildForm=, húzzunk rá egy MultiLine TextBoxot, és állítsuk be a Dock tulajdonságát Fillre.
  • A régi formnak állítsuk az IsMdiContainer tulajdonságát true-ra, tegyünk fel rá egy menüt és hozzuk létre a következő menüpontokat:

File/New

ChildForm form = new ChildForm();
form.MdiParent = this; 

Window

Meg lehet adni egy top-level menüt, amiben felsorolja a nyitott ablakokat.

menuStrip1.MdiWindowListItem = windowToolStripMenuItem;

Window/Tile vertical

this.LayoutMdi(MdiLayout.TileVertical)

File/Open

ChildForm

-ban létre kell hozni egy publikus propertyt =TText= néven, és hozzákötni a benne lévő textbox textjéhez.

OpenFileDialog opf = new OpenFileDialog()
if (opf.ShowDialog == DialogResult.OK) {
	 ChildForm newForm = new ChildForm();
	 newForm.Text = opf.FileName;
	 newForm.MdiParent = this;

	 StreamReader sr = new StreamReader(opf.FileName, Encoding.Default);
	 newForm.TText = sr.ReadToEnd();
	 sr.Close();
	 newForm.Show();
}

File/Identify

MessageBox.Show(this.ActiveMdiChild.Text);

Ha konkrétan a =TText= propertyre lenne szükségünk, először castolni kéne

ChildForm

-ra.

Önálló feladat

Felvenni a menübe egy font- és egy színválasztó dialógust, ami megváltoztatja a kiválasztott gyerekablak szövegének stílusát.

Többszálúság és háttér folyamatok kezelése

1. =BackgroundWorker=: a toolboxon a Data alatt található meg, nem vizuális komponens.

  • Indítása: =RunWorkerAsync= metódushívás
  • A hosszú ideig futó metódusokat a =DoWork= eseménykezelőben kell implementálni. Paramétere: =DoWorkEventArgs=
  • a =Cancel= propertyjével jelezhető, hogy meg akarjuk szakítani. A megszakítást kézzel kell implementálni.
    • átadhatunk egy paramétert az =Argument= propertyben
    • visszaadhatjuk az eredményt a =Result= propertyben
    • =RunWorkerCompleted=: befejezéskor hívódik meg

2.

TimeConsumingMethodDelegate

-ek használata

  • delegate = típusos függvényreferencia
  • hívni a =BeginInvoke= metódussal kell, az =EndInvoke= pedig addig blokkol, amíg nem fejeződött be a futás
  • a =BeginInvoke= visszaad egy =IAsyncResult= objektumot, amit lehet pollolni, amíg be nem fejeződött a futás
  • be lehet állítani egy eseményt, ami a futás végén következik be

3. =Thread= használata

  • A form szála a főszál. Háttérszál: nem várja be a gyerek szálak befejeződését.
  • Thread pool használata: =ThreadPool= osztály, szálakat lehet elkérni tőle, és a futás végén visszaadni.
  • Ha a szálak közös memóriaterületet használnak, szinkronizáció szükséges.

Legegyszerűbb a kritukus szakasz használata. Egy kritikus szakaszban egyszerre csak egy szál lehet.

A Windows Forms controlok csak abból a szálból hívhatók, amelyikben létre lettek hozva. Tipikusan a főszálban hozzuk létre őket.

public delegate void SetProgressDelegate(int val);
public void SetProgress(int val) {
	 if (progressBar1.InvokeRequired) {
		  SetProgressDeleagte del = new SetProgressDelagete(SetProgress);
		  this.Invoke(del, new object[] { val });
	 } else {
		  progressBar1.Value = val;
	 }
}

Controlok készítése

User control

Meglévő controlok egy halmaza, ami együtt nyújt egy funkcionalitást. Pl. login form. Kívülről nem érhetők el a tartalmazott controlok, amire szükségünk van, publikus tulajdonságként kell kivezetni. A =System.Windows.Forms.UserControl= osztályból származik.

Demo: óra control

  • New Windows Application
  • Add New Item: User Control
  • Rakjunk rá egy labelt és egy timert, az utóbbit engedélyezzük.
  • Tick eseményben: =label1.Text = DateTime.Now.ToLongTimeString();=

A user control háttérszínét be lehet állítani speciálisan:

  • =clock.BackColor = Color.Transparent=: a form látszik alatta
  • =clock.BackColor = Color.Yellow; form1.TransparenceKey = Color.Yellow=: a form alatti dolgok látszanak alatta

A kész control kikerül a toolboxra default ikonnal. Ha felül akarjuk definiálni, létre kell hozni egy =ToolboxBitmap= attribútumot, ami egy 16x16-os ikont ad vissza.

  • =[ToolboxBitmap(GetType(System.Windows.Forms.Button))]=: a gombhoz tartozó képet rakja be a designerbe
  • =[ToolboxBitmap("file")]=: egy .bmp-t rak be a designerbe

Custom Control

System.Windows.Forms.Control

-ból származik.

Meglévő controlt nem tudunk ráhúzni, de komponenst igen. Az =OnPaint= eseménykezelőt kell felüldefiniálni. A =PaintEventArgs= paraméteren keresztül kapjuk meg a =Graphics= objektumot.

Demo: óra control

  • New Windows Application
  • Add New Item: Custom Control
  • Rakjunk rá egy timert, engedélyezzük, a =Tick= eseménykezelőbe írjuk be, hogy =this.Invalidate();=
  • =OnPaint= eseménykezelőbe: =e.Graphics.DrawString(DateTime.Now.ToLongTimeString(), new Font("Verdana", 24), Brushes.Red, 0, 0);=

Extended control

Meglévő controlt is ki lehet egészíteni leszármaztatással.

Demo: áthúzott gomb

 
class AthuzottGomb: System.Windows.Forms.Button {
	 private Color lineColor = Color.Blue;
	 public Color LineColor { ... }

	 protected override void OnPaint(PaintEventArgs pevent) {
		  pevent.Graphics.DrawLine(new Pen(lineColor, 3), 0, 0, this.Width, this.Height))
	 }
}

Önálló feladat

  • Készítsünk Login User Controlt.
  • Készítsünk egy gombot, ami számolja, hogy hányszor nyomtuk meg, és kijelzi a jobb felső sarokban.
  • Készítsünk el egy ProgressBart Custom Controlként.

2007.04.20. Dialógusablakok, setup

Dialógusablakok

Funkciókat ki lehet emelni külön formra, dialógusablakba. Pl. beépített dialógusok: font választás, szín választás, nyomtatási előnézet, ... Általában van 2 gombja: OK, Cancel. Azt, hogy melyiket nyomták meg, a =ShowDialog= metódus visszatérési értékében kapjuk meg.

  • Modális dialógusablak: megnyitás után csak a dialógushoz lehet hozzáférni, az alkalmazás főablakához nem.
  • Nem modális dialógusablak: nem blokkol

Dialógusablak létrehozása

  • Project / Add New Item / Windows Form
  • =button1_click=: =this.DialogResult = DialogResult.OK; Close;=
  • =button2_click=: =this.DialogResult = DialogResult.Cancel; Close;=
  • Ha a fő formon
    Show
    -val hívjuk a dialógusablakot, akkor nem modális lesz, ha
    ShowDialog
    -gal, akkor modális.
  • A
    ShowDialog
    -nak paraméterként átadhatjuk a szülő formot.
  • A dialógus eredményét (pl. kiválasztott szín) beírhatjuk egy propertybe, ahonnan kiolvassa a hívó.

Gyakorlat: 2546/6

Telepítő készítése

Visual Studioban Setup Project (az alkalmazással azonos solution-be)

  • Szokásos telepítő funkciókat támogatja (kód file másolás, adat file másolás, shortcut, ...)
  • Telepítés helye gyakorlatilag bármi lehet

.NET 2.0 újdonságok:

  • ClickOnce
  • Automatikus alkalmazás frissítés

Gyakorlat: 2546/9

-- Peti - 2007.04.20.


%META:FORM{name="ValaszthatoForm"}% %META:FIELD{name="Trgy" title="Tárgy" value=".NET framework 2.0 Windows-Based Client Development"}% %META:FIELD{name="Trgykd" title="Tárgykód" value="70-526"}% %META:FIELD{name="Tanszk" title="Tanszék" value="Microsoft"}% %META:FIELD{name="Elad" title="Előadó" value="Kereskényi Robi"}% %META:FIELD{name="Kreditszm" title="Kreditszám" value="0"}% %META:FIELD{name="raszm" title="Óraszám" value="5x4"}% %META:FIELD{name="Flv" title="Félév" value="tavaszi"}% %META:FIELD{name="Terlet" title="Terület" value="Programozás"}% %META:FIELD{name="raijelenlt" title="Órai jelenlét" value="kötelező"}% %META:FIELD{name="Jegy" title="Jegy" value=""}% %META:FIELD{name="Elvrtmin.munka" title="Elvárt min. munka" value="bejárás"}% %META:FIELD{name="Minimumrajrjegy" title="Minimumra járó jegy" value=""}% %META:FIELD{name="Elvrtmax.munka" title="Elvárt max. munka" value="könyv elolvasása - nagy meló"}% %META:FIELD{name="Munkrajrjegy" title="Munkára járó jegy" value=""}%