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

A VIK Wikiből

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.