Visual C# 2012 - Grundlagen und Profiwissen | 4 |
Vorwort | 52 |
Zum Buchinhalt | 52 |
Zu den Neuigkeiten in Visual Studio 2012 | 53 |
Weitere Bücher von uns | 54 |
Zu den Codebeispielen | 54 |
Nobody is perfect | 55 |
1 Einstieg in Visual Studio 2012 | 58 |
1.1 Die Installation von Visual Studio 2012 | 58 |
1.1.1 Überblick über die Produktpalette | 58 |
Visual Studio 2012 Express | 58 |
Visual Studio 2012 Professional | 59 |
Visual Studio 2012 Premium | 60 |
Visual Studio 2012 Ultimate | 60 |
1.1.2 Anforderungen an Hard- und Software | 60 |
1.2 Unser allererstes C#-Programm | 61 |
1.2.1 Vorbereitungen | 61 |
Compilerpfad eintragen | 61 |
1.2.2 Quellcode schreiben | 63 |
1.2.3 Programm kompilieren und testen | 64 |
1.2.4 Einige Erläuterungen zum Quellcode | 64 |
Befehlszeilen und Gültigkeitsbereiche | 64 |
using-Anweisung | 65 |
class-Anweisung | 65 |
WriteLine- und ReadLine-Methoden | 65 |
Assemblierung | 65 |
1.2.5 Konsolenanwendungen sind langweilig | 65 |
1.3 Die Windows-Philosophie | 66 |
1.3.1 Mensch-Rechner-Dialog | 66 |
1.3.2 Objekt- und ereignisorientierte Programmierung | 66 |
Objekte (Objects) | 67 |
Eigenschaften (Properties) | 67 |
Methoden (Methods) | 67 |
Ereignisse (Events) | 68 |
1.3.3 Programmieren mit Visual Studio 2012 | 68 |
1.4 Die Entwicklungsumgebung Visual Studio 2012 | 69 |
1.4.1 Neues Projekt | 69 |
1.4.2 Die wichtigsten Fenster | 70 |
Der Projektmappen-Explorer | 71 |
Der Designer | 72 |
Der Werkzeugkasten | 72 |
Das Eigenschaften-Fenster | 72 |
Das Codefenster | 73 |
1.5 Microsofts .NET-Technologie | 73 |
1.5.1 Zur Geschichte von .NET | 73 |
Warum eine extra Programmiersprache? | 74 |
Wie funktioniert eine .NET-Sprache? | 75 |
1.5.2 .NET-Features und Begriffe | 76 |
.NET-Framework | 76 |
Die Common Language Specification (CLS) | 77 |
Das Common Type System (CTS) | 77 |
Die Common Language Runtime (CLR) | 78 |
Namespaces ersetzen Registry | 79 |
Assemblierungen | 80 |
Zugriff auf COM-Komponenten | 80 |
Metadaten und Reflexion | 80 |
Attribute | 81 |
Serialisierung | 82 |
Multithreading | 82 |
Objektorientierte Programmierung | 83 |
1.6 Wichtige Neuigkeiten in Visual Studio 2012 | 83 |
1.6.1 Die neue Visual Studio 2012 Entwicklungsumgebung | 83 |
Neues Outfit der Toolbar | 83 |
Veränderter Projektmappen-Explorer | 84 |
Registerkartenverwaltung der geöffneten Dateien | 85 |
Suchen überall | 85 |
Neuer Verweis Manager-Dialog | 85 |
Projekt-Kompatibilität | 85 |
Neue Projekttypen | 86 |
Multi-Monitor -Unterstützung | 86 |
Zusätzliche Tools und Features | 86 |
1.6.2 Neuheiten im .NET Framework 4.5 | 86 |
WinRT-Anwendungen | 86 |
Portable Klassenbibliotheken | 86 |
Parallele Computervorgänge | 87 |
Internet | 87 |
WPF | 87 |
WCF | 87 |
1.6.3 C# 5.0 – Sprache und Compiler | 88 |
Asynchrone Methoden | 88 |
Caller Information | 88 |
1.7 Praxisbeispiele | 88 |
1.7.1 Windows Forms-Anwendung für Einsteiger | 88 |
1. Etappe: Visueller Entwurf der Bedienoberfläche | 89 |
2. Etappe: Zuweisen der Objekteigenschaften | 90 |
3. Etappe: Verknüpfen der Objekte mit Ereignissen | 90 |
4. Etappe: Programm kompilieren und testen | 91 |
Bemerkungen | 92 |
1.7.2 Windows-Anwendung für fortgeschrittene Einsteiger | 93 |
1. Etappe: Visueller Entwurf der Bedienoberfläche | 93 |
2. Etappe: Zuweisen der Objekteigenschaften | 94 |
3. Etappe: Verknüpfen der Objekte mit Ereignissen | 95 |
4. Etappe: Programm kompilieren und testen | 98 |
IntelliSense – die hilfreiche Fee | 99 |
Hilfe ein Fehler! | 99 |
2 Grundlagen der Sprache C# | 102 |
2.1 Grundbegriffe | 102 |
2.1.1 Anweisungen | 102 |
2.1.2 Bezeichner | 103 |
2.1.3 Schlüsselwörter | 104 |
2.1.4 Kommentare | 104 |
Einzeilige Kommentare | 104 |
Mehrzeilige Kommentare | 105 |
2.2 Datentypen, Variablen und Konstanten | 105 |
2.2.1 Fundamentale Typen | 105 |
2.2.2 Wertetypen versus Verweistypen | 106 |
Wertetypen | 107 |
Verweistypen | 107 |
2.2.3 Benennung von Variablen | 107 |
2.2.4 Deklaration von Variablen | 107 |
Initialisierte Variablen | 108 |
Typinferenz | 108 |
2.2.5 Typsuffixe | 109 |
2.2.6 Zeichen und Zeichenketten | 110 |
char | 110 |
string | 110 |
2.2.7 object-Datentyp | 112 |
2.2.8 Konstanten deklarieren | 112 |
2.2.9 Nullable Types | 113 |
Initialisieren von Wertetypen mit null | 113 |
Zuweisungen mit dem ??-Operator | 114 |
2.2.10 Typinferenz | 114 |
2.2.11 Gültigkeitsbereiche und Sichtbarkeit | 115 |
2.3 Konvertieren von Datentypen | 115 |
2.3.1 Implizite und explizite Konvertierung | 115 |
as-Konverierungsoperator | 117 |
2.3.2 Welcher Datentyp passt zu welchem? | 117 |
2.3.3 Konvertieren von string | 118 |
ToString-Methode | 118 |
String in Zahl verwandeln | 119 |
EVA-Prinzip | 119 |
2.3.4 Die Convert-Klasse | 120 |
2.3.5 Die Parse-Methode | 120 |
2.3.6 Boxing und Unboxing | 121 |
Boxing | 121 |
Unboxing | 121 |
2.4 Operatoren | 122 |
2.4.1 Arithmetische Operatoren | 123 |
Standard-Operatoren | 123 |
Inkrement- und Dekrement-Operatoren | 123 |
2.4.2 Zuweisungsoperatoren | 124 |
2.4.3 Logische Operatoren | 125 |
Vergleichsoperatoren | 125 |
Boolesche Operatoren | 126 |
Kurzschlussauswertung | 127 |
Bitweise Operationen | 127 |
2.4.4 Rangfolge der Operatoren | 128 |
2.5 Kontrollstrukturen | 129 |
2.5.1 Verzweigungsbefehle | 129 |
Klassische Entscheidungsanweisungen | 129 |
Ergänzung | 131 |
Sprungbefehle | 132 |
2.5.2 Schleifenanweisungen | 132 |
for-Schleifen | 133 |
while-Schleife | 133 |
do-Schleife | 133 |
Vorzeitiges Verlassen einer Schleife | 134 |
2.6 Benutzerdefinierte Datentypen | 135 |
2.6.1 Enumerationen | 135 |
Deklaration | 135 |
Zugriff | 135 |
2.6.2 Strukturen | 136 |
Deklaration | 136 |
Datenzugriff | 137 |
Struktur versus Klasse | 138 |
2.7 Nutzerdefinierte Methoden | 138 |
2.7.1 Methoden mit Rückgabewert | 139 |
Deklaration | 139 |
Aufruf | 139 |
2.7.2 Methoden ohne Rückgabewert | 140 |
Deklaration | 140 |
Aufruf | 140 |
2.7.3 Parameterübergabe mit ref | 141 |
Noch einmal – aber bitte langsam | 142 |
2.7.4 Parameterübergabe mit out | 142 |
2.7.5 Methodenüberladung | 143 |
Bemerkungen | 143 |
2.7.6 Optionale Parameter | 144 |
2.7.7 Benannte Parameter | 145 |
2.8 Praxisbeispiele | 146 |
2.8.1 Vom PAP zur Konsolenanwendung | 146 |
Programmablaufplan | 146 |
Programmierung | 146 |
Kompilieren | 147 |
Test | 147 |
2.8.2 Ein Konsolen- in ein Windows-Programm verwandeln | 148 |
Oberfläche | 148 |
Quelltext | 149 |
Test | 150 |
Bemerkungen | 150 |
2.8.3 Schleifenanweisungen verstehen | 150 |
Oberfläche | 150 |
Quellcode | 150 |
Test | 152 |
2.8.4 Benutzerdefinierte Methoden überladen | 152 |
Oberfläche | 153 |
Quellcode | 153 |
Test | 155 |
3 OOP-Konzepte | 156 |
3.1 Kleine Einführung in die OOP | 156 |
3.1.1 Historische Entwicklung | 156 |
Strukturierte Programmierung | 157 |
Objektorientiertes Programmieren | 157 |
3.1.2 Grundbegriffe der OOP | 158 |
Objekt | 158 |
Klasse | 159 |
Instanz | 159 |
Kapselung | 159 |
Wiederverwendbarkeit | 159 |
Vererbung | 159 |
Polymorphie | 160 |
3.1.3 Sichtbarkeit von Klassen und ihren Mitgliedern | 160 |
Klassen | 160 |
Klassenmitglieder | 161 |
3.1.4 Allgemeiner Aufbau einer Klasse | 161 |
3.1.5 Das Erzeugen eines Objekts | 162 |
Referenzieren und Instanziieren | 163 |
Klassische Initialisierung | 164 |
Objekt-Initialisierer | 164 |
Arbeiten mit dem Objekt | 165 |
Zerstören des Objekts | 165 |
3.1.6 Einführungsbeispiel | 165 |
Vorbereitungen | 165 |
Klasse definieren | 166 |
Bemerkungen | 167 |
Objekt erzeugen und initialisieren | 168 |
Objekt verwenden | 168 |
Unterstützung durch die IntelliSense | 168 |
Objekt testen | 169 |
Bemerkungen | 170 |
3.2 Eigenschaften | 170 |
3.2.1 Eigenschaften mit Zugriffsmethoden kapseln | 170 |
Deklarieren von Eigenschaften | 171 |
Zugriff | 172 |
Bemerkung | 172 |
3.2.2 Berechnete Eigenschaften | 172 |
3.2.3 Lese-/Schreibschutz | 174 |
3.2.4 Property-Accessoren | 175 |
3.2.5 Statische Felder/Eigenschaften | 175 |
Konstante Felder | 177 |
3.2.6 Einfache Eigenschaften automatisch implementieren | 178 |
3.3 Methoden | 179 |
3.3.1 Öffentliche und private Methoden | 179 |
3.3.2 Überladene Methoden | 180 |
3.3.3 Statische Methoden | 180 |
Bemerkungen | 182 |
3.4 Ereignisse | 182 |
3.4.1 Ereignis hinzufügen | 183 |
Ereignis deklarieren | 184 |
Ereignis instanziieren | 184 |
Ereignis auslösen | 185 |
3.4.2 Ereignis verwenden | 186 |
Ereignisbehandlung schreiben | 187 |
Ereignisbehandlung anmelden | 188 |
Bemerkungen | 188 |
3.5 Arbeiten mit Konstruktor und Destruktor | 189 |
3.5.1 Konstruktor und Objektinitialisierer | 189 |
Deklaration | 190 |
Aufruf | 190 |
Objektinitialisierer | 191 |
Statischer Konstruktor | 191 |
3.5.2 Destruktor und Garbage Collector | 192 |
3.5.3 Mit using den Lebenszyklus des Objekts kapseln | 195 |
3.5.4 Verzögerte Initialisierung | 195 |
3.6 Vererbung und Polymorphie | 196 |
3.6.1 Klassendiagramm | 196 |
3.6.2 Method-Overriding | 198 |
3.6.3 Klassen implementieren | 198 |
Basisklasse CKunde | 198 |
Subklasse CPrivatKunde | 199 |
Subklasse CFirmenKunde | 200 |
Testoberfläche | 201 |
3.6.4 Implementieren der Objekte | 201 |
Praxistest | 202 |
3.6.5 Ausblenden von Mitgliedern durch Vererbung | 203 |
3.6.6 Allgemeine Hinweise und Regeln zur Vererbung | 205 |
3.6.7 Polymorphes Verhalten | 206 |
Praxistest | 208 |
3.6.8 Die Rolle von System.Object | 209 |
3.7 Spezielle Klassen | 210 |
3.7.1 Abstrakte Klassen | 210 |
Abstrakte Methoden | 210 |
3.7.2 Versiegelte Klassen | 211 |
3.7.3 Partielle Klassen | 212 |
3.7.4 Statische Klassen | 213 |
3.8 Schnittstellen (Interfaces) | 214 |
3.8.1 Definition einer Schnittstelle | 214 |
3.8.2 Implementieren einer Schnittstelle | 215 |
3.8.3 Abfragen, ob Schnittstelle vorhanden ist | 216 |
3.8.4 Mehrere Schnittstellen implementieren | 216 |
3.8.5 Schnittstellenprogrammierung ist ein weites Feld | 216 |
3.9 Praxisbeispiele | 217 |
3.9.1 Eigenschaften sinnvoll kapseln | 217 |
Oberfläche | 217 |
Quellcode (CKreis) | 218 |
Quellcode (Form1) | 219 |
Test | 219 |
Bemerkungen | 220 |
3.9.2 Eine statische Klasse anwenden | 220 |
Oberfläche | 220 |
Quellcode | 220 |
Test | 221 |
3.9.3 Vom fetten zum schlanken Client | 222 |
Oberfläche | 222 |
Quellcode (Fat Client) | 223 |
Test | 226 |
Bemerkungen | 226 |
Abmagerungskur für den fetten Client | 227 |
Quellcode für CRegister | 228 |
Quellcode für CRechenmodul | 229 |
Quellcode für Form1 | 232 |
Test | 233 |
Bemerkungen | 233 |
3.9.4 Schnittstellenvererbung verstehen | 233 |
Klassendiagramme | 234 |
Oberfläche Form1 | 234 |
Quellcode CPerson | 235 |
Quellcode CKunde | 235 |
Quellcode Form1 | 236 |
Test | 237 |
Quellcode IPerson | 237 |
Quellcode CKunde | 238 |
Bemerkungen | 238 |
4 Arrays, Strings, Funktionen | 240 |
4.1 Datenfelder (Arrays) | 240 |
4.1.1 Array deklarieren | 240 |
4.1.2 Array instanziieren | 241 |
4.1.3 Array initialisieren | 241 |
4.1.4 Zugriff auf Array-Elemente | 242 |
Indexüberprüfung | 242 |
Oberen Array-Index ermitteln | 243 |
4.1.5 Zugriff mittels Schleife | 243 |
for-Schleife | 243 |
foreach-Schleife | 243 |
4.1.6 Mehrdimensionale Arrays | 244 |
Dimensionsgrenzen ermitteln | 245 |
Mehrdimensional initialisieren | 245 |
4.1.7 Zuweisen von Arrays | 246 |
4.1.8 Arrays aus Strukturvariablen | 247 |
4.1.9 Löschen und Umdimensionieren von Arrays | 248 |
Felder löschen | 248 |
Array löschen | 248 |
Array-Dimensionen ändern | 249 |
4.1.10 Eigenschaften und Methoden von Arrays | 249 |
Wichtige Eigenschaften und Methoden von Array-Variablen | 250 |
Wichtige Methoden der Array-Klasse | 250 |
4.1.11 Übergabe von Arrays | 251 |
Arrays als Parameter | 251 |
Rückgabe von Arrays | 251 |
4.2 Verarbeiten von Zeichenketten | 252 |
4.2.1 Zuweisen von Strings | 252 |
4.2.2 Eigenschaften und Methoden von String-Variablen | 253 |
Strings in Char-Arrays verwandeln | 255 |
4.2.3 Wichtige Methoden der String-Klasse | 255 |
Strings zerlegen und wieder zusammenstückeln | 256 |
4.2.4 Die StringBuilder-Klasse | 257 |
Grundlegendes | 257 |
Eigenschaften | 258 |
Methoden | 259 |
4.3 Reguläre Ausdrücke | 259 |
4.3.1 Wozu werden reguläre Ausdrücke verwendet? | 260 |
4.3.2 Eine kleine Einführung | 260 |
4.3.3 Wichtige Methoden/Eigenschaften der Klasse Regex | 261 |
Die Match-Methode | 261 |
Eigenschaften des Match-Objekts | 262 |
Die NextMatch-Methode | 262 |
Die Matches-Methode | 262 |
Der Alternator | 262 |
4.3.4 Kompilierte reguläre Ausdrücke | 263 |
4.3.5 RegexOptions-Enumeration | 264 |
4.3.6 Metazeichen (Escape-Zeichen) | 264 |
4.3.7 Zeichenmengen (Character Sets) | 265 |
4.3.8 Quantifizierer | 267 |
4.3.9 Zero-Width Assertions | 268 |
String- und Zeilengrenzen (^ und $) | 268 |
Wortgrenzen (b) | 269 |
Positiver Lookahead (?=expr) | 269 |
Negativer Lookahead (?!expr) | 270 |
Positiver (?<=expr) und negativer (? | 271 |
4.3.10 Gruppen | 271 |
4.3.11 Text ersetzen | 272 |
4.3.12 Text splitten | 273 |
Trennzeichen im Ergebnis | 273 |
4.4 Datums- und Zeitberechnungen | 274 |
4.4.1 Die DateTime-Struktur | 274 |
Grundlegendes | 274 |
4.4.2 Wichtige Eigenschaften von DateTime-Variablen | 275 |
4.4.3 Wichtige Methoden von DateTime-Variablen | 276 |
4.4.4 Wichtige Mitglieder der DateTime-Struktur | 276 |
4.4.5 Konvertieren von Datumstrings in DateTime-Werte | 277 |
4.4.6 Die TimeSpan-Struktur | 278 |
4.5 Mathematische Funktionen | 279 |
4.5.1 Überblick | 279 |
4.5.2 Zahlen runden | 280 |
4.5.3 Winkel umrechnen | 280 |
4.5.4 Potenz- und Wurzeloperationen | 280 |
4.5.5 Logarithmus und Exponentialfunktionen | 281 |
4.5.6 Zufallszahlen erzeugen | 281 |
4.6 Zahlen- und Datumsformatierungen | 282 |
4.6.1 Anwenden der ToString-Methode | 282 |
Zahlenformatierungen | 283 |
Datumsformatierungen | 283 |
4.6.2 Anwenden der Format-Methode | 284 |
4.7 Praxisbeispiele | 286 |
4.7.1 Zeichenketten verarbeiten | 286 |
Oberfläche | 286 |
Quellcode | 287 |
Test | 288 |
Bemerkungen | 288 |
4.7.2 Zeichenketten mit StringBuilder addieren | 289 |
Oberfläche | 289 |
Quellcode Klasse CTest | 289 |
Quellcode Form1 | 291 |
Test | 292 |
Bemerkungen | 292 |
4.7.3 Reguläre Ausdrücke testen | 292 |
Oberfläche | 292 |
Quellcode | 293 |
Test | 294 |
Bemerkungen | 294 |
4.7.4 Methodenaufrufe mit Array-Parametern | 294 |
Oberfläche | 294 |
Quellcode | 294 |
Test | 297 |
Bemerkungen | 297 |
5 Weitere Sprachfeatures | 298 |
5.1 Namespaces (Namensräume) | 298 |
5.1.1 Ein kleiner Überblick | 298 |
5.1.2 Einen eigenen Namespace einrichten | 299 |
5.1.3 Die using-Anweisung | 300 |
5.1.4 Namespace Alias | 301 |
5.1.5 Namespace Alias Qualifizierer | 301 |
5.2 Operatorenüberladung | 302 |
5.2.1 Syntaxregeln | 302 |
5.2.2 Praktische Anwendung | 303 |
5.3 Collections (Auflistungen) | 304 |
5.3.1 Die Schnittstelle IEnumerable | 304 |
IEnumerable | 305 |
ICollection | 305 |
IList | 306 |
5.3.2 ArrayList | 306 |
Weitere Eigenschaften und Methoden | 307 |
5.3.3 Hashtable | 308 |
5.3.4 Indexer | 308 |
5.4 Generics | 310 |
5.4.1 Klassische Vorgehensweise | 311 |
Miserable Typsicherheit bei den alten Collections | 311 |
Viel Aufwand für eigene generische Collection-Klassen | 312 |
Warum uns auch ein Array nicht weiterhilft | 312 |
5.4.2 Generics bieten Typsicherheit | 312 |
Einen einfachen generischen Typ deklarieren | 312 |
Generischen Typ verwenden | 313 |
5.4.3 Generische Methoden | 313 |
5.4.4 Iteratoren | 314 |
5.5 Generische Collections | 315 |
5.5.1 List-Collection statt ArrayList | 315 |
5.5.2 Vorteile generischer Collections | 316 |
5.5.3 Constraints | 316 |
5.6 Das Prinzip der Delegates | 316 |
5.6.1 Delegates sind Methodenzeiger | 317 |
5.6.2 Einen Delegate-Typ deklarieren | 317 |
5.6.3 Ein Delegate-Objekt erzeugen | 317 |
5.6.4 Delegates vereinfacht instanziieren | 319 |
5.6.5 Anonyme Methoden | 320 |
5.6.6 Lambda-Ausdrücke | 321 |
5.6.7 Lambda-Ausdrücke in der Task Parallel Library | 323 |
Bemerkungen | 324 |
5.7 Dynamische Programmierung | 325 |
5.7.1 Wozu dynamische Programmierung? | 325 |
5.7.2 Das Prinzip der dynamischen Programmierung | 325 |
5.7.3 Optionale Parameter sind hilfreich | 328 |
5.7.4 Kovarianz und Kontravarianz | 329 |
5.8 Weitere Datentypen | 329 |
5.8.1 BigInteger | 329 |
5.8.2 Complex | 332 |
5.8.3 Tuple<> | 332 |
5.8.4 SortedSet<> | 333 |
5.9 Praxisbeispiele | 334 |
5.9.1 ArrayList versus generische List | 334 |
Oberfläche | 335 |
Quellcode (mit ArrayList) | 335 |
Quellcode (mit generischer List) | 336 |
Test | 337 |
Bemerkungen | 338 |
5.9.2 Generische IEnumerable-Interfaces implementieren | 338 |
Oberfläche | 338 |
Quellcode CTestListe | 339 |
Quellcode Form1 | 340 |
Test | 340 |
Bemerkungen | 341 |
5.9.3 Delegates, anonyme Methoden, Lambda Expressions | 341 |
Oberfläche | 341 |
Quellcode | 342 |
Test | 344 |
5.9.4 Dynamischer Zugriff auf COM Interop | 345 |
Oberfläche | 345 |
Quellcode (klassische Programmierung) | 345 |
Quellcode (dynamische Programmierung) | 346 |
Test | 346 |
Bemerkungen | 347 |
6 Einführung in LINQ | 348 |
6.1 LINQ-Grundlagen | 348 |
6.1.1 Die LINQ-Architektur | 348 |
LINQ-Implementierungen | 349 |
6.1.2 Anonyme Typen | 349 |
6.1.3 Erweiterungsmethoden | 351 |
6.2 Abfragen mit LINQ to Objects | 352 |
6.2.1 Grundlegendes zur LINQ-Syntax | 352 |
6.2.2 Zwei alternative Schreibweisen von LINQ Abfragen | 353 |
6.2.3 Übersicht der wichtigsten Abfrage-Operatoren | 354 |
6.3 LINQ-Abfragen im Detail | 355 |
6.3.1 Die Projektionsoperatoren Select und SelectMany | 356 |
Select | 356 |
SelectMany | 357 |
6.3.2 Der Restriktionsoperator Where | 357 |
6.3.3 Die Sortierungsoperatoren OrderBy und ThenBy | 358 |
OrderBy/OrderByDescending | 358 |
ThenBy/ThenByDescending | 358 |
Reverse | 359 |
6.3.4 Der Gruppierungsoperator GroupBy | 359 |
6.3.5 Verknüpfen mit Join | 362 |
6.3.6 Aggregat-Operatoren | 362 |
Count | 362 |
Sum | 363 |
6.3.7 Verzögertes Ausführen von LINQ-Abfragen | 364 |
6.3.8 Konvertierungsmethoden | 365 |
6.3.9 Abfragen mit PLINQ | 365 |
Probleme mit der Sortierfolge | 367 |
6.4 Praxisbeispiele | 368 |
6.4.1 Die Syntax von LINQ-Abfragen verstehen | 368 |
Oberfläche | 369 |
Quellcode | 369 |
Test | 370 |
Bemerkungen | 370 |
6.4.2 Aggregat-Abfragen mit LINQ | 371 |
Oberfläche | 371 |
Quellcode | 372 |
Test | 373 |
Bemerkungen | 373 |
7 Zugriff auf das Dateisystem | 376 |
7.1 Grundlagen | 376 |
7.1.1 Klassen für den Zugriff auf das Dateisystem | 377 |
7.1.2 Statische versus Instanzen-Klasse | 377 |
7.2 Übersichten | 378 |
7.2.1 Methoden der Directory-Klasse | 378 |
7.2.2 Methoden eines DirectoryInfo-Objekts | 379 |
7.2.3 Eigenschaften eines DirectoryInfo-Objekts | 379 |
7.2.4 Methoden der File-Klasse | 379 |
7.2.5 Methoden eines FileInfo-Objekts | 380 |
7.2.6 Eigenschaften eines FileInfo-Objekts | 381 |
7.3 Operationen auf Verzeichnisebene | 381 |
7.3.1 Existenz eines Verzeichnisses/einer Datei feststellen | 381 |
7.3.2 Verzeichnisse erzeugen und löschen | 382 |
7.3.3 Verzeichnisse verschieben und umbenennen | 382 |
7.3.4 Aktuelles Verzeichnis bestimmen | 383 |
7.3.5 Unterverzeichnisse ermitteln | 383 |
7.3.6 Alle Laufwerke ermitteln | 383 |
7.3.7 Dateien kopieren und verschieben | 384 |
7.3.8 Dateien umbenennen | 385 |
7.3.9 Dateiattribute feststellen | 385 |
Attribute von Verzeichnissen und Dateien | 386 |
7.3.10 Verzeichnis einer Datei ermitteln | 387 |
7.3.11 Alle im Verzeichnis enthaltenen Dateien ermitteln | 387 |
7.3.12 Dateien und Unterverzeichnisse ermitteln | 387 |
7.4 Zugriffsberechtigungen | 388 |
7.4.1 ACL und ACE | 388 |
7.4.2 SetAccessControl-Methode | 389 |
7.4.3 Zugriffsrechte anzeigen | 389 |
7.5 Weitere wichtige Klassen | 390 |
7.5.1 Die Path-Klasse | 390 |
7.5.2 Die Klasse FileSystemWatcher | 391 |
7.6 Datei- und Verzeichnisdialoge | 392 |
7.6.1 OpenFileDialog und SaveFileDialog | 393 |
Anzeige und Auswertung | 393 |
Wichtige Eigenschaften | 393 |
Dateifilter | 394 |
7.6.2 FolderBrowserDialog | 394 |
Die SpecialFolder-Enumeration | 394 |
7.7 Praxisbeispiele | 395 |
7.7.1 Infos über Verzeichnisse und Dateien gewinnen | 395 |
Oberfläche | 395 |
Quelltext | 396 |
Test | 398 |
7.7.2 Eine Verzeichnisstruktur in die TreeView einlesen | 399 |
Oberfläche | 399 |
Quellcode | 399 |
Test | 400 |
7.7.3 Mit LINQ und RegEx Verzeichnisbäume durchsuchen | 401 |
Oberfläche | 401 |
Quellcode | 402 |
Test | 404 |
Bemerkungen | 405 |
8 Dateien lesen und schreiben | 406 |
8.1 Grundprinzip der Datenpersistenz | 406 |
8.1.1 Dateien und Streams | 406 |
8.1.2 Die wichtigsten Klassen | 407 |
8.1.3 Erzeugen eines Streams | 408 |
8.2 Dateiparameter | 408 |
8.2.1 FileAccess | 408 |
8.2.2 FileMode | 408 |
8.2.3 FileShare | 409 |
8.3 Textdateien | 409 |
8.3.1 Eine Textdatei beschreiben bzw. neu anlegen | 409 |
WriteAllLines/AppendAllText | 410 |
8.3.2 Eine Textdatei lesen | 411 |
ReadAllLines/ReadLines | 411 |
8.4 Binärdateien | 412 |
8.4.1 Lese-/Schreibzugriff | 412 |
8.4.2 Die Methoden ReadAllBytes und WriteAllBytes | 413 |
8.4.3 Erzeugen von BinaryReader/BinaryWriter | 413 |
8.5 Sequenzielle Dateien | 414 |
8.5.1 Lesen und schreiben von strukturierten Daten | 414 |
8.5.2 Serialisieren von Objekten | 415 |
8.6 Dateien verschlüsseln und komprimieren | 416 |
8.6.1 Das Methodenpärchen Encrypt/Decrypt | 416 |
8.6.2 Verschlüsseln unter Vista/Windows 7/Windows 8 | 416 |
8.6.3 Verschlüsseln mit der CryptoStream-Klasse | 417 |
8.6.4 Dateien komprimieren | 418 |
8.7 Memory Mapped Files | 419 |
8.7.1 Grundprinzip | 419 |
8.7.2 Erzeugen eines MMF | 420 |
CreateFromFile-Methode | 420 |
CreateNew-Methode | 421 |
8.7.3 Erstellen eines Map View | 421 |
8.8 Praxisbeispiele | 422 |
8.8.1 Auf eine Textdatei zugreifen | 422 |
Oberfläche | 422 |
Quellcode | 422 |
Test | 424 |
8.8.2 Einen Objektbaum persistent speichern | 425 |
Klassendiagramm | 425 |
Klasse CBestellung | 426 |
Klasse CPerson | 427 |
Klasse CKunde | 427 |
Klasse CFirma | 428 |
Klasse CPersistent | 428 |
Form1 | 429 |
Test | 431 |
Anzeige mit DataGridView | 431 |
8.8.3 Ein Memory Mapped File (MMF) verwenden | 432 |
Oberfläche | 432 |
Quellcode | 432 |
Test | 433 |
Bemerkungen | 434 |
9 Asynchrone Programmierung | 436 |
9.1 Übersicht | 436 |
9.1.1 Multitasking versus Multithreading | 437 |
9.1.2 Deadlocks | 438 |
9.1.3 Racing | 438 |
9.2 Programmieren mit Threads | 440 |
9.2.1 Einführungsbeispiel | 440 |
9.2.2 Wichtige Thread-Methoden | 441 |
9.2.3 Wichtige Thread-Eigenschaften | 443 |
9.2.4 Einsatz der ThreadPool-Klasse | 444 |
9.3 Sperrmechanismen | 446 |
9.3.1 Threading ohne lock | 446 |
9.3.2 Threading mit lock | 448 |
Ein anschauliches Beispiel | 449 |
9.3.3 Die Monitor-Klasse | 450 |
Wait und Pulse/PulseAll | 451 |
TryEnter | 453 |
9.3.4 Mutex | 453 |
9.3.5 Methoden für die parallele Ausführung sperren | 455 |
9.3.6 Semaphore | 455 |
9.4 Interaktion mit der Programmoberfläche | 457 |
9.4.1 Die Werkzeuge | 457 |
9.4.2 Einzelne Steuerelemente mit Invoke aktualisieren | 457 |
9.4.3 Mehrere Steuerelemente aktualisieren | 459 |
9.4.4 Ist ein Invoke-Aufruf nötig? | 459 |
9.4.5 Und was ist mit WPF? | 460 |
9.5 Timer-Threads | 461 |
9.6 Die BackgroundWorker-Komponente | 462 |
9.7 Asynchrone Programmier-Entwurfsmuster | 465 |
9.7.1 Kurzübersicht | 465 |
Begin...-Methode | 465 |
End...-Methode | 466 |
Die Rückrufmethode | 466 |
9.7.2 Polling | 466 |
9.7.3 Callback verwenden | 468 |
9.7.4 Callback mit Parameterübergabe verwenden | 469 |
9.7.5 Callback mit Zugriff auf die Programm-Oberfläche | 470 |
9.8 Asynchroner Aufruf beliebiger Methoden | 471 |
9.8.1 Die Beispielklasse | 471 |
9.8.2 Asynchroner Aufruf ohne Callback | 473 |
9.8.3 Asynchroner Aufruf mit Callback und Anzeigefunktion | 474 |
9.8.4 Aufruf mit Rückgabewerten (per Eigenschaft) | 475 |
9.8.5 Aufruf mit Rückgabewerten (per EndInvoke) | 475 |
9.9 Es geht auch einfacher – async und await | 476 |
9.9.1 Der Weg von Synchron zu Asynchron | 477 |
9.9.2 Achtung: Fehlerquellen! | 479 |
9.9.3 Eigene asynchrone Methoden entwickeln | 481 |
9.10 Praxisbeispiele | 483 |
9.10.1 Spieltrieb & Multithreading erleben | 483 |
Aufgabenstellung | 483 |
Oberfläche | 484 |
Quelltext LKW | 485 |
Quelltext Schiff | 487 |
Quelltext Controller | 490 |
Quelltext Global | 492 |
Quelltext Form1 | 492 |
Test | 495 |
Bemerkungen | 496 |
9.10.2 Prozess- und Thread-Informationen gewinnen | 496 |
Oberfläche | 496 |
Quellcode | 496 |
Test | 500 |
9.10.3 Ein externes Programm starten | 501 |
Oberfläche | 501 |
Quelltext | 501 |
Test | 502 |
Ergänzungen | 502 |
Bemerkung | 503 |
10 Die Task Parallel Library | 504 |
10.1 Überblick | 504 |
10.1.1 Parallel-Programmierung | 504 |
10.1.2 Möglichkeiten der TPL | 507 |
10.1.3 Der CLR-Threadpool | 507 |
10.2 Parallele Verarbeitung mit Parallel.Invoke | 508 |
10.2.1 Aufrufvarianten | 509 |
10.2.2 Einschränkungen | 510 |
10.3 Verwendung von Parallel.For | 510 |
10.3.1 Abbrechen der Verarbeitung | 512 |
10.3.2 Auswerten des Verarbeitungsstatus | 513 |
10.3.3 Und was ist mit anderen Iterator-Schrittweiten? | 514 |
10.4 Collections mit Parallel.ForEach verarbeiten | 514 |
10.5 Die Task-Klasse | 515 |
10.5.1 Einen Task erzeugen | 515 |
10.5.2 Den Task starten | 516 |
10.5.3 Datenübergabe an den Task | 518 |
10.5.4 Wie warte ich auf das Ende des Task? | 519 |
10.5.5 Tasks mit Rückgabewerten | 521 |
10.5.6 Die Verarbeitung abbrechen | 524 |
Abbruch per return | 524 |
Abbruch per CancellationToken | 525 |
10.5.7 Fehlerbehandlung | 527 |
10.5.8 Weitere Eigenschaften | 528 |
Task-Id | 528 |
Status | 529 |
IsCanceled, IsCompleted, IsFaulted | 529 |
TaskCreationOptions | 529 |
10.6 Zugriff auf das User-Interface | 529 |
10.6.1 Task-Ende und Zugriff auf die Oberfläche | 530 |
10.6.2 Zugriff auf das UI aus dem Task heraus | 531 |
10.7 Weitere Datenstrukturen im Überblick | 533 |
10.7.1 Threadsichere Collections | 533 |
10.7.2 Primitive für die Threadsynchronisation | 534 |
10.8 Parallel LINQ (PLINQ) | 534 |
10.9 Die Parallel Diagnostic Tools | 535 |
10.9.1 Fenster für parallele Aufgaben | 535 |
10.9.2 Fenster für parallele Stacks | 536 |
10.9.3 IntelliTrace | 537 |
10.10 Praxisbeispiel: Spieltrieb – Version 2 | 537 |
10.10.1 Aufgabenstellung | 537 |
10.10.2 Global-Klasse | 538 |
10.10.3 Controller-Klasse | 539 |
10.10.4 LKW-Klasse | 541 |
10.10.5 Schiff-Klasse | 542 |
10.10.6 Oberfläche | 545 |
11 Fehlersuche und Behandlung | 548 |
11.1 Der Debugger | 548 |
11.1.1 Allgemeine Beschreibung | 548 |
11.1.2 Die wichtigsten Fenster | 549 |
Befehlsfenster | 549 |
Direktfenster | 550 |
Lokal-Fenster | 550 |
Überwachungsfenster | 551 |
Autofenster | 551 |
Ausgabefenster | 551 |
11.1.3 Debugging-Optionen | 552 |
Einzelschritt-Modus | 553 |
Prozedurschritt-Modus | 553 |
Breakpoints | 553 |
11.1.4 Praktisches Debugging am Beispiel | 554 |
Haltepunkte setzen | 555 |
Abbruchbedingung setzen | 555 |
Trefferanzahl verwenden | 556 |
Einzelschritt-Modus | 556 |
Prozedurschritt | 557 |
Ausführen bis Rücksprung | 557 |
Auswerten von Ausdrücken | 557 |
11.2 Arbeiten mit Debug und Trace | 558 |
11.2.1 Wichtige Methoden von Debug und Trace | 558 |
Write, WriteLine, WriteIf und WriteLineIf | 558 |
IndentLevel, Indent, IndentSize und UnIndent | 560 |
Assert | 560 |
Fail | 561 |
11.2.2 Besonderheiten der Trace-Klasse | 562 |
11.2.3 TraceListener-Objekte | 562 |
TextWriterTraceListener | 562 |
App.config zur Definition verwenden | 563 |
EventLogTraceListener | 564 |
11.3 Caller Information | 565 |
11.3.1 Attribute | 565 |
11.3.2 Anwendung | 565 |
11.4 Fehlerbehandlung | 566 |
11.4.1 Anweisungen zur Fehlerbehandlung | 566 |
11.4.2 try-catch | 567 |
Ausnahmen über Fehlerklassen auswerten | 568 |
Spezifische Fehlerklassen auswerten | 568 |
Fehler erneut auslösen | 569 |
11.4.3 try-finally | 572 |
11.4.4 Das Standardverhalten bei Ausnahmen festlegen | 574 |
11.4.5 Die Exception-Klasse | 575 |
11.4.6 Fehler/Ausnahmen auslösen | 576 |
11.4.7 Eigene Fehlerklassen | 576 |
11.4.8 Exceptionhandling zur Entwurfszeit | 578 |
11.4.9 Code Contracts | 579 |
12 Einführung in WPF | 582 |
Und was ist mit Silverlight? | 583 |
12.1 Neues aus der Gerüchteküche | 583 |
12.1.1 Silverlight | 583 |
12.1.2 WPF | 583 |
12.2 Einführung | 584 |
12.2.1 Was kann eine WPF-Anwendung? | 584 |
12.2.2 Die eXtensible Application Markup Language | 586 |
Unsere erste XAML-Anwendung | 587 |
Probleme mit dem Stammelement | 588 |
Ein kleines Experiment | 589 |
Soll ich das alles von Hand eintippen? | 590 |
12.2.3 Verbinden von XAML und C#-Code | 590 |
App.xaml | 590 |
App.xaml.cs | 591 |
MainWindow.xaml | 592 |
MainWindow.xaml.cs | 593 |
Ein erster Ereignis-Handler | 593 |
Und wo ist mein Button-Objekt? | 594 |
Brauche ich unbedingt eine Trennung von Code und XAML? | 595 |
Kann ich Oberflächen auch per Code erzeugen? | 595 |
12.2.4 Zielplattformen | 596 |
12.2.5 Applikationstypen | 597 |
WPF-Anwendung | 597 |
WPF-Browseranwendungen | 597 |
12.2.6 Vor- und Nachteile von WPF-Anwendungen | 598 |
12.2.7 Weitere Dateien im Überblick | 598 |
Was sind .BAML-Dateien und was passiert damit? | 598 |
Worum handelt es sich bei den .G.CS-Dateien? | 599 |
12.3 Alles beginnt mit dem Layout | 601 |
12.3.1 Allgemeines zum Layout | 601 |
12.3.2 Positionieren von Steuerelementen | 603 |
Was sind das überhaupt für Maßangaben? | 603 |
Top/Left/Width/Height | 604 |
MinWidth/MaxWidth/MinHeight/MaxHeight | 604 |
Margin/Padding | 605 |
HorizontalAlignment/VerticalAligment | 606 |
12.3.3 Canvas | 607 |
12.3.4 StackPanel | 607 |
12.3.5 DockPanel | 609 |
12.3.6 WrapPanel | 611 |
12.3.7 UniformGrid | 611 |
12.3.8 Grid | 613 |
Definition des Grundlayouts | 613 |
Zuordnen von Kind-Elementen | 615 |
Verwendung des GridSplitters | 617 |
12.3.9 ViewBox | 618 |
12.3.10 TextBlock | 619 |
Textformatierungen | 620 |
Besonderheit von Leerzeichen/Zeilenumbrüchen | 621 |
Textausrichtung | 622 |
12.4 Das WPF-Programm | 622 |
12.4.1 Die App-Klasse | 622 |
12.4.2 Das Startobjekt festlegen | 623 |
12.4.3 Kommandozeilenparameter verarbeiten | 624 |
12.4.4 Die Anwendung beenden | 625 |
12.4.5 Auswerten von Anwendungsereignissen | 625 |
12.5 Die Window-Klasse | 626 |
12.5.1 Position und Größe festlegen | 626 |
12.5.2 Rahmen und Beschriftung | 627 |
12.5.3 Das Fenster-Icon ändern | 627 |
12.5.4 Anzeige weiterer Fenster | 628 |
12.5.5 Transparenz | 628 |
12.5.6 Abstand zum Inhalt festlegen | 629 |
12.5.7 Fenster ohne Fokus anzeigen | 629 |
12.5.8 Ereignisfolge bei Fenstern | 630 |
12.5.9 Ein paar Worte zur Schriftdarstellung | 630 |
TextOptions.TextFormattingMode | 631 |
TextOptions.TextRenderingMode | 632 |
12.5.10 Ein paar Worte zur Darstellung von Controls | 633 |
12.5.11 Wird mein Fenster komplett mit WPF gerendert? | 635 |
13 Übersicht WPF-Controls | 636 |
13.1 Allgemeingültige Eigenschaften | 636 |
13.2 Label | 638 |
13.3 Button, RepeatButton, ToggleButton | 639 |
13.3.1 Schaltflächen für modale Dialoge | 639 |
13.3.2 Schaltflächen mit Grafik | 640 |
13.4 TextBox, PasswordBox | 641 |
13.4.1 TextBox | 641 |
13.4.2 PasswordBox | 643 |
13.5 CheckBox | 644 |
13.6 RadioButton | 646 |
13.7 ListBox, ComboBox | 647 |
13.7.1 ListBox | 647 |
13.7.2 ComboBox | 650 |
13.7.3 Den Content formatieren | 652 |
13.8 Image | 653 |
13.8.1 Grafik per XAML zuweisen | 653 |
13.8.2 Grafik zur Laufzeit zuweisen | 654 |
13.8.3 Bild aus Datei laden | 655 |
13.8.4 Die Grafikskalierung beeinflussen | 656 |
13.9 MediaElement | 657 |
13.10 Slider, ScrollBar | 659 |
13.10.1 Slider | 659 |
13.10.2 ScrollBar | 660 |
13.11 ScrollViewer | 661 |
13.12 Menu, ContextMenu | 662 |
13.12.1 Menu | 662 |
13.12.2 Tastenkürzel | 663 |
13.12.3 Grafiken | 664 |
13.12.4 Weitere Möglichkeiten | 665 |
13.12.5 ContextMenu | 666 |
13.13 ToolBar | 667 |
Der ToolBarTray | 668 |
13.14 StatusBar, ProgressBar | 670 |
13.14.1 StatusBar | 670 |
13.14.2 ProgressBar | 672 |
13.15 Border, GroupBox, BulletDecorator | 673 |
13.15.1 Border | 673 |
13.15.2 GroupBox | 674 |
13.15.3 BulletDecorator | 675 |
13.16 RichTextBox | 677 |
13.16.1 Verwendung und Anzeige von vordefiniertem Text | 677 |
13.16.2 Neues Dokument zur Laufzeit erzeugen | 679 |
13.16.3 Sichern von Dokumenten | 679 |
13.16.4 Laden von Dokumenten | 681 |
13.16.5 Texte per Code einfügen/modifizieren | 682 |
13.16.6 Texte formatieren | 683 |
13.16.7 EditingCommands | 684 |
13.16.8 Grafiken/Objekte einfügen | 685 |
13.16.9 Rechtschreibkontrolle | 687 |
13.17 FlowDocumentPageViewer & Co. | 687 |
13.17.1 FlowDocumentPageViewer | 687 |
13.17.2 FlowDocumentReader | 688 |
13.17.3 FlowDocumentScrollViewer | 688 |
13.18 FlowDocument | 688 |
13.18.1 FlowDocument per XAML beschreiben | 689 |
13.18.2 FlowDocument per Code erstellen | 691 |
13.19 DocumentViewer | 692 |
13.20 Expander, TabControl | 693 |
13.20.1 Expander | 693 |
13.20.2 TabControl | 695 |
13.21 Popup | 696 |
13.22 TreeView | 698 |
13.23 ListView | 701 |
13.24 DataGrid | 702 |
13.25 Calendar/DatePicker | 703 |
DisplayMode | 703 |
DisplayDate, SelectedDate und SelectedDates | 703 |
Auswahlmodi | 704 |
Sperrtage | 705 |
Calendar skalieren | 706 |
13.26 InkCanvas | 707 |
13.26.1 Stift-Parameter definieren | 707 |
13.26.2 Die Zeichenmodi | 708 |
13.26.3 Inhalte laden und sichern | 709 |
13.26.4 Konvertieren in eine Bitmap | 709 |
13.26.5 Weitere Eigenschaften | 710 |
13.27 Ellipse, Rectangle, Line und Co. | 711 |
13.27.1 Ellipse | 711 |
13.27.2 Rectangle | 711 |
13.27.3 Line | 712 |
13.28 Browser | 712 |
13.29 Ribbon | 715 |
13.29.1 Allgemeine Grundlagen | 715 |
13.29.2 Download/Installation | 716 |
13.29.3 Erste Schritte | 717 |
13.29.4 Registerkarten und Gruppen | 718 |
13.29.5 Kontextabhängige Registerkarten | 719 |
13.29.6 Einfache Beschriftungen | 720 |
13.29.7 Schaltflächen | 720 |
Schaltflächen zusammenfassen | 722 |
13.29.8 Auswahllisten | 722 |
13.29.9 Optionsauswahl | 725 |
13.29.10 Texteingaben | 725 |
13.29.11 Screentips | 725 |
13.29.12 Symbolleiste für den Schnellzugriff | 726 |
13.29.13 Das RibbonWindow | 727 |
13.29.14 Menüs | 728 |
13.29.15 Anwendungsmenü | 730 |
13.29.16 Alternativen | 733 |
13.30 Chart | 733 |
13.31 WindowsFormsHost | 734 |
14 Wichtige WPF-Techniken | 738 |
14.1 Eigenschaften | 738 |
14.1.1 Abhängige Eigenschaften (Dependency Properties) | 738 |
14.1.2 Angehängte Eigenschaften (Attached Properties) | 740 |
14.2 Einsatz von Ressourcen | 740 |
14.2.1 Was sind eigentlich Ressourcen? | 740 |
14.2.2 Wo können Ressourcen gespeichert werden? | 740 |
14.2.3 Wie definiere ich eine Ressource? | 742 |
14.2.4 Statische und dynamische Ressourcen | 743 |
14.2.5 Wie werden Ressourcen adressiert? | 744 |
14.2.6 System-Ressourcen einbinden | 745 |
14.3 Das WPF-Ereignis-Modell | 745 |
14.3.1 Einführung | 745 |
14.3.2 Routed Events | 746 |
14.3.3 Direkte Events | 748 |
14.4 Verwendung von Commands | 749 |
14.4.1 Einführung zu Commands | 749 |
14.4.2 Verwendung vordefinierter Commands | 749 |
14.4.3 Das Ziel des Commands | 751 |
14.4.4 Welche vordefinierten Commands stehen zur Verfügung? | 752 |
14.4.5 Commands an Ereignismethoden binden | 753 |
14.4.6 Wie kann ich ein Command per Code auslösen? | 754 |
14.4.7 Command-Ausführung verhindern | 755 |
14.5 Das WPF-Style-System | 755 |
14.5.1 Übersicht | 755 |
14.5.2 Benannte Styles | 756 |
14.5.3 Typ-Styles | 757 |
14.5.4 Styles anpassen und vererben | 758 |
Styles anpassen (überschreiben) | 759 |
Style ersetzen | 759 |
Styles vererben | 760 |
Styleänderung per Code | 760 |
14.6 Verwenden von Triggern | 761 |
14.6.1 Eigenschaften-Trigger (Property Triggers) | 761 |
14.6.2 Ereignis-Trigger | 763 |
14.6.3 Daten-Trigger | 764 |
14.7 Einsatz von Templates | 765 |
14.7.1 Neues Template erstellen | 765 |
14.7.2 Template abrufen und verändern | 769 |
14.8 Transformationen, Animationen, StoryBoards | 772 |
14.8.1 Transformationen | 772 |
Drehen mit RotateTransform | 773 |
Skalieren mit ScaleTransform | 774 |
Verformen mit SkewTransform | 774 |
Verschieben mit TranslateTransform | 775 |
Und alles zusammen mit TransformGroup | 775 |
Hilfe durch den WPF-Editor | 777 |
14.8.2 Animationen mit dem StoryBoard realisieren | 778 |
Animation per C#-Code realisieren | 779 |
Animation per Code steuern | 779 |
Mehrere Animationen zusammenfassen | 782 |
14.9 Praxisbeispiel | 782 |
14.9.1 Arbeiten mit Microsoft Expression Blend | 782 |
Eine Animation realisieren | 783 |
Der XAML-Code | 784 |
Test | 785 |
Bemerkung | 785 |
15 WPF-Datenbindung | 788 |
15.1 Grundprinzip | 788 |
15.1.1 Bindungsarten | 789 |
15.1.2 Wann eigentlich wird die Quelle aktualisiert? | 790 |
15.1.3 Geht es auch etwas langsamer? | 791 |
15.1.4 Bindung zur Laufzeit realisieren | 792 |
15.2 Binden an Objekte | 794 |
15.2.1 Objekte im XAML-Code instanziieren | 794 |
15.2.2 Verwenden der Instanz im C#-Quellcode | 796 |
15.2.3 Anforderungen an die Quell-Klasse | 796 |
15.2.4 Instanziieren von Objekten per C#-Code | 798 |
15.3 Binden von Collections | 799 |
15.3.1 Anforderung an die Collection | 799 |
15.3.2 Einfache Anzeige | 800 |
15.3.3 Navigieren zwischen den Objekten | 801 |
15.3.4 Einfache Anzeige in einer ListBox | 803 |
Verwendung von DisplayMemberPath | 803 |
15.3.5 DataTemplates zur Anzeigeformatierung | 804 |
15.3.6 Mehr zu List- und ComboBox | 805 |
SelectedIndex | 805 |
SelectedItem/SelectedItems | 805 |
SelectedValuePath und SelectedValue | 806 |
15.3.7 Verwendung der ListView | 807 |
Einfache Bindung | 807 |
Sortieren der Einträge | 808 |
15.4 Noch einmal zurück zu den Details | 809 |
15.4.1 Navigieren in den Daten | 809 |
15.4.2 Sortieren | 811 |
15.4.3 Filtern | 811 |
15.4.4 Live Shaping | 812 |
15.5 Anzeige von Datenbankinhalten | 813 |
15.5.1 Datenmodell per LINQ to SQL-Designer erzeugen | 814 |
15.5.2 Die Programm-Oberfläche | 815 |
15.5.3 Der Zugriff auf die Daten | 816 |
15.6 Drag & Drop-Datenbindung | 817 |
15.6.1 Vorgehensweise | 817 |
15.6.2 Weitere Möglichkeiten | 820 |
15.7 Formatieren von Werten | 821 |
15.7.1 IValueConverter | 822 |
15.7.2 BindingBase.StringFormat-Eigenschaft | 824 |
15.8 Das DataGrid als Universalwerkzeug | 826 |
15.8.1 Grundlagen der Anzeige | 826 |
15.8.2 UI-Virtualisierung | 827 |
15.8.3 Spalten selbst definieren | 827 |
15.8.4 Zusatzinformationen in den Zeilen anzeigen | 829 |
15.8.5 Vom Betrachten zum Editieren | 830 |
15.9 Praxisbeispiele | 831 |
15.9.1 Collections in Hintergrundthreads füllen | 831 |
Oberfläche | 831 |
Das Problem | 831 |
Lösung (bis .NET 4.0) | 833 |
Test | 833 |
Lösung (ab .NET 4.5) | 833 |
Test | 834 |
15.9.2 Drag & Drop-Bindung bei 1:n-Beziehungen | 834 |
Oberfläche | 834 |
Quellcode (XAML) | 836 |
Quellcode (C#) | 837 |
Test | 838 |
16 Druckausgabe mit WPF | 840 |
16.1 Grundlagen | 840 |
16.1.1 XPS-Dokumente | 840 |
16.1.2 System.Printing | 841 |
16.1.3 System.Windows.Xps | 842 |
16.2 Einfache Druckausgaben mit dem PrintDialog | 842 |
16.3 Mehrseitige Druckvorschau-Funktion | 845 |
16.3.1 Fix-Dokumente | 845 |
Einsatzbeispiel | 845 |
Die Klasse FixedPrintManager | 849 |
16.3.2 Flow-Dokumente | 851 |
Einführungsbeispiel | 851 |
Die Klasse FlowPrintManager | 852 |
16.4 Druckerinfos, -auswahl, -konfiguration | 854 |
16.4.1 Die installierten Drucker bestimmen | 855 |
16.4.2 Den Standarddrucker bestimmen | 856 |
16.4.3 Mehr über einzelne Drucker erfahren | 856 |
16.4.4 Spezifische Druckeinstellungen vornehmen | 858 |
16.4.5 Direkte Druckausgabe | 860 |
17 Erste Schritte in WinRT | 864 |
17.1 Grundkonzepte und Begriffe | 864 |
17.1.1 Windows Runtime (WinRT) | 864 |
17.1.2 Windows Store Apps | 865 |
17.1.3 Fast and Fluid | 866 |
17.1.4 Process Sandboxing und Contracts | 867 |
17.1.5 .NET WinRT-Profil | 869 |
17.1.6 Language Projection | 869 |
17.1.7 Vollbildmodus | 871 |
17.1.8 Windows Store | 871 |
17.1.9 Zielplattformen | 872 |
17.2 Entwurfsumgebung | 873 |
17.2.1 Betriebssystem | 873 |
17.2.2 Windows-Simulator | 874 |
17.2.3 Remote-Debugging | 876 |
17.3 Ein (kleines) Einstiegsbeispiel | 877 |
17.3.1 Aufgabenstellung | 877 |
17.3.2 Quellcode | 877 |
17.3.3 Oberflächenentwurf | 880 |
17.3.4 Installation und Test | 882 |
17.3.5 Verbesserungen | 883 |
Persistenz | 884 |
Touchscreen | 885 |
17.3.6 Fazit | 886 |
17.4 Weitere Details zu WinRT | 888 |
17.4.1 Wo ist WinRT einzuordnen? | 888 |
17.4.2 Die WinRT-API | 889 |
Benutzerschnittstelle | 890 |
Daten & Kommunikation | 890 |
Geräte und Medien | 891 |
Anwendungsdienste | 891 |
17.4.3 Wichtige WinRT-Namespaces | 891 |
17.4.4 Der Unterbau | 892 |
Die Schnittstellen | 892 |
Language Projection | 893 |
Assemblies für WinRT | 894 |
17.5 Gedanken zum Thema "WinRT & Tablets" | 895 |
17.5.1 Windows 8-Oberfläche versus Desktop | 895 |
17.5.2 Tablets und Touchscreens | 895 |
17.6 Praxisbeispiel | 897 |
17.6.1 WinRT in Desktop-Applikationen nutzen | 897 |
Oberfläche | 897 |
Quellcode | 898 |
Test | 899 |
Bemerkung | 899 |
18 WinRT-Oberflächen entwerfen | 900 |
18.1 Grundkonzepte | 900 |
18.1.1 XAML (oder HTML 5) für die Oberfläche | 901 |
18.1.2 Die Page, der Frame und das Window | 902 |
18.1.3 Das Befehlsdesign | 903 |
App-Leisten | 904 |
Settingsbereich | 905 |
18.1.4 Die Navigationsdesigns | 905 |
18.1.5 Achtung: Fingereingabe! | 906 |
18.1.6 Verwendung von Schriftarten | 907 |
18.2 Projekttypen und Seitentemplates | 907 |
18.2.1 Leere App | 907 |
18.2.2 Geteilte App (Split App) | 909 |
18.2.3 Raster-App (Grid App) | 911 |
18.2.4 Leere Seite (Blank Page) | 912 |
18.2.5 Standardseite (Basic Page) | 913 |
18.2.6 Ein eigenes Grundlayout erstellen | 915 |
18.3 Seitenauswahl und -navigation | 916 |
18.3.1 Die Startseite festlegen | 916 |
18.3.2 Navigation und Parameterübergabe | 916 |
18.3.3 Den Seitenstatus erhalten | 917 |
18.4 Die vier App-Ansichten | 918 |
18.4.1 Vollbild quer und hochkant | 918 |
18.4.2 Angedockt und Füllmodus | 919 |
18.4.3 Reagieren auf die Änderung | 919 |
SizeChanged auswerten | 920 |
VisualStateManager | 921 |
18.4.4 Angedockten Modus aktiv beenden | 923 |
18.5 Skalieren von Apps | 923 |
18.6 Praxisbeispiele | 925 |
18.6.1 Seitennavigation und Parameterübergabe | 925 |
Oberfläche BasicPage1 | 925 |
Quellcode BasicPage1 | 926 |
Oberfläche BasicPage2 | 926 |
Quellcode BasicPage2 | 927 |
Test | 927 |
Bemerkung | 927 |
18.6.2 Auf Ansichtsänderungen reagieren | 927 |
Oberfläche & Quellcode MainPage | 927 |
Oberfläche & Quellcode BlankPage1 | 928 |
Oberfläche der beiden Frame-Seiten | 929 |
Oberfläche & Quellcode BasicPage2 | 930 |
18.7 Tipps & Tricks | 931 |
18.7.1 Symbole für WinRT-Oberflächen finden | 931 |
18.7.2 Wie werde ich das Grufti-Layout schnell los? | 932 |
19 Die wichtigsten Controls | 934 |
19.1 Einfache WinRT-Controls | 934 |
19.1.1 TextBlock, RichTextBlock | 934 |
19.1.2 Button, HyperlinkButton, RepeatButton | 937 |
19.1.3 CheckBox, RadioButton, ToggleButton, ToggleSwitch | 939 |
19.1.4 TextBox, PasswordBox, RichEditBox | 940 |
19.1.5 Image | 944 |
19.1.6 ScrollBar, Slider, ProgressBar, ProgressRing | 946 |
19.1.7 Border, Ellipse, Rectangle | 947 |
19.2 Layout-Controls | 948 |
19.2.1 Canvas | 948 |
19.2.2 StackPanel | 949 |
19.2.3 ScrollViewer | 949 |
19.2.4 Grid | 950 |
19.2.5 VariableSizedWrapGrid | 951 |
19.3 Listendarstellungen | 952 |
19.3.1 ComboBox, ListBox | 952 |
19.3.2 ListView | 956 |
19.3.3 GridView | 957 |
19.3.4 FlipView | 960 |
19.4 Sonstige Controls | 962 |
19.4.1 CaptureElement | 962 |
19.4.2 MediaElement | 963 |
19.4.3 Frame | 965 |
19.4.4 WebView | 965 |
19.4.5 ToolTip | 966 |
19.5 Praxisbeispiele | 968 |
19.5.1 Einen StringFormat-Konverter implementieren | 968 |
Quellcode Klasse StringFormatConverter | 968 |
Verwendung des Konverters | 969 |
Test | 970 |
19.5.2 Besonderheiten der TextBox kennen lernen | 970 |
Virtuelle Tastatur | 970 |
Tasteneingaben validieren/filtern | 972 |
19.5.3 Daten in der GridView gruppieren | 973 |
Oberfläche | 973 |
Quelltext | 975 |
Test | 975 |
Bemerkung | 976 |
19.5.4 Das SemanticZoom-Control verwenden | 978 |
Oberflächen | 979 |
Quellcode | 981 |
Test | 981 |
19.5.5 Die CollectionViewSource verwenden | 982 |
Oberfläche | 983 |
Quelltext | 984 |
Test | 985 |
19.5.6 Zusammenspiel ListBox/AppBar | 986 |
Oberfläche | 986 |
Quelltext | 987 |
Test | 989 |
19.5.7 Musikwiedergabe im Hintergrund realisieren | 989 |
Oberfläche | 989 |
Quelltext | 991 |
Test | 993 |
Bemerkung | 993 |
20 Apps im Detail | 994 |
20.1 Ein Windows Store App-Projekt im Detail | 994 |
20.1.1 Contracts und Extensions | 995 |
20.1.2 AssemblyInfo.cs | 996 |
20.1.3 Verweise | 997 |
20.1.4 App.xaml und App.xaml.cs | 998 |
20.1.5 Package.appxmanifest | 999 |
Anwendungsbenutzeroberfläche | 999 |
Funktionen | 1000 |
Deklarationen | 1002 |
Verpacken | 1003 |
20.1.6 Application1_TemporaryKey.pfx | 1003 |
20.1.7 MainPage.xaml & MainPage.xaml.cs | 1003 |
20.1.8 Datentyp-Konverter/Hilfsklassen | 1004 |
BooleanToVisibilityConverter.cs | 1004 |
BooleanNegationConverter.cs | 1004 |
RichTextColumns.cs | 1005 |
SuspensionManager.cs | 1005 |
LayoutAwarePage.cs | 1006 |
20.1.9 StandardStyles.xaml | 1006 |
20.1.10 Assets/Symbole | 1007 |
20.1.11 Nach dem Kompilieren | 1008 |
20.2 Der Lebenszyklus einer WinRT-App | 1008 |
20.2.1 Möglichkeiten der Aktivierung von Apps | 1010 |
20.2.2 Der Splash Screen | 1012 |
20.2.3 Suspending | 1012 |
20.2.4 Resuming | 1013 |
20.2.5 Beenden von Apps | 1014 |
20.2.6 Die Ausnahmen von der Regel | 1015 |
20.2.7 Debuggen | 1015 |
Verwendung einer Protokolldatei | 1015 |
Debuggen mit DebugView | 1017 |
Steuern der Programmzustände über Visual Studio | 1017 |
Debuggen von Contract-aktivierten Apps | 1018 |
20.3 Daten speichern und laden | 1019 |
20.3.1 Grundsätzliche Überlegungen | 1019 |
20.3.2 Worauf und wie kann ich zugreifen? | 1019 |
20.3.3 Das AppData-Verzeichnis | 1019 |
LocalFolder | 1020 |
RoamingFolder | 1021 |
TemporaryFolder | 1021 |
20.3.4 Das Anwendungs-Installationsverzeichnis | 1022 |
20.3.5 Das Downloads-Verzeichnis | 1023 |
20.3.6 Sonstige Verzeichnisse | 1024 |
20.3.7 Anwendungsdaten lokal sichern und laden | 1024 |
20.3.8 Daten in der Cloud ablegen/laden (Roaming) | 1026 |
20.3.9 Aufräumen | 1029 |
20.3.10 Sensible Informationen speichern | 1029 |
20.4 Praxisbeispiele | 1031 |
20.4.1 Unterstützung für den Search-Contract bieten | 1031 |
Oberfläche | 1032 |
Quelltext (App.xaml.cs) | 1033 |
Quelltext (SearchPage.xaml.cs) | 1036 |
Quelltext (DetailPage.xaml.cs) | 1036 |
Test | 1037 |
Erweiterungen | 1038 |
20.4.2 Die Auto-Play-Funktion unterstützen | 1038 |
Anpassen Package.appxmanifest | 1038 |
Quelltext | 1040 |
Oberfläche | 1041 |
Test | 1041 |
20.4.3 Einen zusätzlichen Splash Screen einsetzen | 1042 |
Oberfläche (ErsatzSplashscreen.xaml) | 1042 |
Quellcode (App.xaml.cs) | 1043 |
Quellcode (ErsatzSplashScreen.xaml.cs) | 1043 |
Test | 1044 |
20.4.4 Eine Dateiverknüpfung erstellen | 1044 |
Oberfläche | 1044 |
Quelltext (App.xaml.cs) | 1045 |
Quelltext (BasicPage1.xaml.cs) | 1046 |
Test | 1046 |
Ergänzungen | 1048 |
21 WinRT-Techniken | 1050 |
21.1 Arbeiten mit Dateien/Verzeichnissen | 1050 |
21.1.1 Verzeichnisinformationen auflisten | 1050 |
21.1.2 Unterverzeichnisse auflisten | 1053 |
21.1.3 Verzeichnisse erstellen/löschen | 1054 |
21.1.4 Dateien auflisten | 1056 |
21.1.5 Dateien erstellen/schreiben/lesen | 1058 |
Datei erstellen | 1058 |
Schreibzugriff mit FileIO | 1059 |
Schreibzugriff mit StreamWriter | 1060 |
Lesezugriff mit FileIO | 1061 |
Lesezugriff mit StreamReader | 1061 |
21.1.6 Dateien kopieren/umbenennen/löschen | 1062 |
21.1.7 Verwenden der Dateipicker | 1063 |
FileOpenPicker | 1064 |
FileSavePicker | 1067 |
FolderPicker | 1068 |
21.1.8 StorageFile-/StorageFolder-Objekte speichern | 1070 |
21.1.9 Verwenden der Most Recently Used-Liste | 1072 |
21.2 Datenaustausch zwischen Apps/Programmen | 1073 |
21.2.1 Zwischenablage | 1074 |
Texte kopieren und einfügen | 1075 |
Bilder kopieren und einfügen | 1076 |
Dateien kopieren/verschieben und abrufen | 1077 |
Zwischenablage überwachen | 1079 |
21.2.2 Teilen von Inhalten | 1081 |
Funktion "Teilen" programmgesteuert aufrufen | 1083 |
Sie möchten temporär keine Daten teilen | 1084 |
21.2.3 Eine App als Freigabeziel verwenden | 1084 |
21.2.4 Zugriff auf die Kontaktliste | 1085 |
21.3 Spezielle Oberflächenelemente | 1087 |
21.3.1 MessageDialog | 1087 |
Dialog mit Auswahl | 1087 |
Alternativen beim Auswerten der Tasten | 1089 |
Ergänzungen | 1090 |
21.3.2 Popup-Benachrichtigungen | 1090 |
Wann sollten Sie Popup-Benachrichtigungen einsetzen? | 1091 |
Was können Sie alles parametrieren? | 1093 |
Und wie funktioniert das alles? | 1093 |
Unser ToastNotification-"Bäckerei" | 1094 |
Prüfen auf Funktionsfähigkeit | 1098 |
21.3.3 PopUp/Flyouts | 1098 |
21.3.4 Das PopupMenu einsetzen | 1102 |
21.3.5 Eine AppBar verwenden | 1104 |
21.4 Datenbanken und Windows 8-Apps | 1109 |
21.4.1 Der Retter in der Not: SQLite! | 1109 |
21.4.2 Verwendung/Kurzüberblick | 1109 |
Was eigentlich ist SQLite? | 1109 |
Vorteile | 1110 |
Nachteile | 1110 |
21.4.3 Installation | 1111 |
21.4.4 Wie kommen wir zu einer neuen Datenbank? | 1113 |
21.4.5 Wie werden die Daten manipuliert? | 1117 |
21.5 Vertrieb der App | 1119 |
21.5.1 Verpacken der App | 1119 |
21.5.2 Windows App Certification Kit | 1121 |
21.5.3 App-Installation per Skript | 1123 |
21.6 Ein Blick auf die App-Schwachstellen | 1124 |
21.6.1 Quellcodes im Installationsverzeichnis | 1124 |
21.6.2 Zugriff auf den App-Datenordner | 1126 |
21.7 Praxisbeispiele | 1126 |
21.7.1 Ein Verzeichnis auf Änderungen überwachen | 1126 |
Oberfläche | 1127 |
Quellcode | 1127 |
Test | 1128 |
21.7.2 Eine App als Freigabeziel verwenden | 1129 |
Oberfläche | 1129 |
Registrieren der App als Freigabeziel | 1130 |
Quellcode (App.xaml.cs) | 1131 |
Quellcode (InsertPage.xaml.cs) | 1131 |
Test | 1133 |
21.7.3 ToastNotifications einfach erzeugen | 1134 |
Quellcode | 1135 |
Test | 1139 |
Index | 1150 |
Ergänzungsband | 1170 |
Zweites Vorwort | 1194 |
22 XML in Theorie und Praxis | 1198 |
22.1 XML – etwas Theorie | 1198 |
22.1.1 Übersicht | 1198 |
22.1.2 Der XML-Grundaufbau | 1201 |
22.1.3 Wohlgeformte Dokumente | 1202 |
22.1.4 Processing Instructions (PI) | 1205 |
22.1.5 Elemente und Attribute | 1205 |
22.1.6 Verwendbare Zeichensätze | 1207 |
22.2 XSD-Schemas | 1209 |
22.2.1 XSD-Schemas und ADO.NET | 1209 |
22.2.2 XML-Schemas in Visual Studio analysieren | 1211 |
Der XML-Schema-Explorer | 1212 |
Ausgangsansicht des XML-Schema-Designers | 1212 |
Inhaltsmodellansicht | 1213 |
XML-Editor | 1214 |
22.2.3 XML-Datei mit XSD-Schema erzeugen | 1214 |
22.2.4 XSD-Schema aus einer XML-Datei erzeugen | 1215 |
22.3 Verwendung des DOM unter .NET | 1216 |
22.3.1 Übersicht | 1216 |
22.3.2 DOM-Integration in C# | 1217 |
22.3.3 Laden von Dokumenten | 1217 |
22.3.4 Erzeugen von XML-Dokumenten | 1218 |
22.3.5 Auslesen von XML-Dateien | 1220 |
22.3.6 Direktzugriff auf einzelne Elemente | 1222 |
22.3.7 Einfügen von Informationen | 1222 |
22.3.8 Suchen in den Baumzweigen | 1225 |
22.4 XML-Verarbeitung mit LINQ to XML | 1228 |
22.4.1 Die LINQ to XML-API | 1228 |
22.4.2 Neue XML-Dokumente erzeugen | 1230 |
22.4.3 Laden und Sichern von XML-Dokumenten | 1232 |
22.4.4 Navigieren in XML-Daten | 1233 |
22.4.5 Auswählen und Filtern | 1235 |
22.4.6 Manipulieren der XML-Daten | 1235 |
Editieren der Daten | 1236 |
Hinzufügen von Daten | 1236 |
Löschen | 1237 |
22.4.7 XML-Dokumente transformieren | 1237 |
22.5 Weitere Möglichkeiten der XML-Verarbeitung | 1240 |
22.5.1 Die relationale Sicht mit XmlDataDocument | 1240 |
Laden von XML-Daten | 1240 |
Verwendung des DataSets | 1241 |
22.5.2 XML-Daten aus Objektstrukturen erzeugen | 1243 |
22.5.3 Schnelles Suchen in XML-Daten mit XPathNavigator | 1246 |
22.5.4 Schnelles Auslesen von XML-Daten mit XmlReader | 1249 |
22.5.5 Erzeugen von XML-Daten mit XmlWriter | 1251 |
22.5.6 XML transformieren mit XSLT | 1253 |
22.6 Praxisbeispiele | 1255 |
22.6.1 Mit dem DOM in XML-Dokumenten navigieren | 1255 |
Oberfläche | 1255 |
Quelltext | 1256 |
Test | 1257 |
Bemerkungen | 1258 |
22.6.2 XML-Daten in eine TreeView einlesen | 1258 |
Oberfläche | 1258 |
Quelltext | 1258 |
Test | 1260 |
Ergänzung | 1260 |
23 Einführung in ADO.NET | 1262 |
23.1 Eine kleine Übersicht | 1262 |
23.1.1 Die ADO.NET-Klassenhierarchie | 1262 |
23.1.2 Die Klassen der Datenprovider | 1263 |
.NET-Datenprovider | 1264 |
Weitere Datenprovider | 1264 |
Anzeige der installierten Datenprovider | 1265 |
23.1.3 Das Zusammenspiel der ADO.NET-Klassen | 1266 |
23.2 Das Connection-Objekt | 1267 |
23.2.1 Allgemeiner Aufbau | 1267 |
23.2.2 OleDbConnection | 1267 |
Parameter für OleDb-Zugriff | 1267 |
OleDb-Provider für Access Datenbank | 1268 |
23.2.3 Schließen einer Verbindung | 1269 |
23.2.4 Eigenschaften des Connection-Objekts | 1269 |
ConnectionString-Eigenschaft | 1269 |
Database- und DataSource-Eigenschaft | 1270 |
Provider-Eigenschaft | 1270 |
ServerVersion-Eigenschaft | 1270 |
ConnectionTimeout-Eigenschaft | 1271 |
State-Eigenschaft | 1271 |
23.2.5 Methoden des Connection-Objekts | 1271 |
Open- und Close-Methode | 1271 |
ChangeDatabase-Methode | 1272 |
CreateCommand-Methode | 1272 |
23.2.6 Der ConnectionStringBuilder | 1272 |
23.3 Das Command-Objekt | 1272 |
23.3.1 Erzeugen und Anwenden eines Command-Objekts | 1273 |
23.3.2 Erzeugen mittels CreateCommand-Methode | 1273 |
23.3.3 Eigenschaften des Command-Objekts | 1274 |
Connection- und CommandText-Eigenschaft | 1274 |
CommandTimeout-Eigenschaft | 1274 |
CommandType-Eigenschaft | 1275 |
23.3.4 Methoden des Command-Objekts | 1276 |
ExecuteNonQuery-Methode | 1276 |
ExecuteReader-Methode | 1276 |
ExecuteScalar-Methode | 1276 |
23.3.5 Freigabe von Connection- und Command-Objekten | 1277 |
23.4 Parameter-Objekte | 1278 |
23.4.1 Erzeugen und Anwenden eines Parameter-Objekts | 1278 |
23.4.2 Eigenschaften des Parameter-Objekts | 1279 |
ParameterName- und Value-Eigenschaft | 1279 |
DbType, OleDbType und SqlDbType-Eigenschaft | 1279 |
Direction-Eigenschaft | 1279 |
23.5 Das CommandBuilder-Objekt | 1280 |
23.5.1 Erzeugen | 1280 |
23.5.2 Anwenden | 1280 |
23.6 Das DataReader-Objekt | 1281 |
23.6.1 DataReader erzeugen | 1281 |
23.6.2 Daten lesen | 1282 |
23.6.3 Eigenschaften des DataReaders | 1283 |
Item-Eigenschaft | 1283 |
FieldCount-Eigenschaft | 1283 |
IsClosed-Eigenschaft | 1283 |
23.6.4 Methoden des DataReaders | 1283 |
Read-Methode | 1283 |
GetValue- und GetValues-Methode | 1283 |
GetOrdinal- und ähnliche Methoden | 1283 |
Bemerkungen | 1283 |
23.7 Das DataAdapter-Objekt | 1284 |
23.7.1 DataAdapter erzeugen | 1284 |
Konstruktor mit SELECT-String und Connection-Objekt | 1284 |
Konstruktor mit SelectCommand-Objekt | 1285 |
23.7.2 Command-Eigenschaften | 1285 |
23.7.3 Fill-Methode | 1286 |
Begrenzen der Datenmenge | 1286 |
23.7.4 Update-Methode | 1287 |
23.8 Praxisbeispiele | 1288 |
23.8.1 Wichtige ADO.NET-Objekte im Einsatz | 1288 |
Oberfläche | 1288 |
Quellcode | 1288 |
Test | 1289 |
Bemerkungen | 1289 |
23.8.2 Eine Aktionsabfrage ausführen | 1289 |
Oberfläche | 1290 |
Quellcode | 1290 |
Test | 1291 |
Bemerkungen | 1291 |
23.8.3 Eine Auswahlabfrage aufrufen | 1292 |
Oberfläche | 1292 |
Quellcode | 1292 |
Test | 1294 |
23.8.4 Die Datenbank aktualisieren | 1294 |
Oberfläche | 1295 |
Quellcode (Command-Objekte selbst programmiert) | 1295 |
Test | 1296 |
Bemerkungen | 1297 |
24 Das DataSet | 1298 |
24.1 Grundlegende Features des DataSets | 1298 |
24.1.1 Die Objekthierarchie | 1299 |
24.1.2 Die wichtigsten Klassen | 1299 |
24.1.3 Erzeugen eines DataSets | 1300 |
Copy-Methode | 1300 |
Clone-Methode | 1301 |
GetChanges-/HasChanges-Methode | 1301 |
24.2 Das DataTable-Objekt | 1301 |
24.2.1 DataTable erzeugen | 1302 |
24.2.2 Spalten hinzufügen | 1302 |
24.2.3 Zeilen zur DataTable hinzufügen | 1303 |
NewRow-Methode | 1303 |
ImportRow-Methode | 1303 |
24.2.4 Auf den Inhalt einer DataTable zugreifen | 1304 |
Columns- und Rows-Eigenschaften | 1304 |
TableName- und ColumnName-Eigenschaften | 1304 |
Find-Methode | 1305 |
Zeilen löschen | 1305 |
24.3 Die DataView | 1306 |
24.3.1 Erzeugen einer DataView | 1306 |
24.3.2 Sortieren und Filtern von Datensätzen | 1306 |
24.3.3 Suchen von Datensätzen | 1307 |
24.4 Typisierte DataSets | 1307 |
24.4.1 Ein typisiertes DataSet erzeugen | 1308 |
24.4.2 Das Konzept der Datenquellen | 1309 |
24.4.3 Typisierte DataSets und TableAdapter | 1310 |
Warum sollte man ein typisiertes DataSet einsetzen? | 1310 |
Der TableAdapter | 1311 |
24.5 Die Qual der Wahl | 1311 |
24.5.1 DataReader – der schnelle Lesezugriff | 1312 |
24.5.2 DataSet – die Datenbank im Hauptspeicher | 1312 |
Typisiertes versus untypisiertes DataSet | 1312 |
24.5.3 Objektrelationales Mapping – die Zukunft? | 1313 |
LINQ to SQL/LINQ to Entities | 1313 |
24.6 Praxisbeispiele | 1314 |
24.6.1 In der DataView sortieren und filtern | 1314 |
Oberfläche | 1314 |
Quellcode | 1314 |
Test | 1315 |
Bemerkungen | 1316 |
24.6.2 Suche nach Datensätzen | 1316 |
Oberfläche | 1316 |
Quellcode | 1316 |
Test | 1317 |
24.6.3 Ein DataSet in einen XML-String serialisieren | 1317 |
Konvertierungsmethoden | 1318 |
Testoberfläche Form1 | 1319 |
Quellcode Form1 | 1319 |
Erzeugen eines untypisierten DataSets als Testobjekt | 1320 |
Test | 1321 |
24.6.4 Untypisiertes in ein typisiertes DataSet konvertieren | 1322 |
Konvertierungscode | 1323 |
Normales DataSet erzeugen | 1323 |
Typisiertes DataSet erzeugen | 1324 |
Oberfläche | 1325 |
Test | 1326 |
Bemerkungen | 1327 |
24.6.5 Eine LINQ to SQL-Abfrage ausführen | 1327 |
Datenmodell per LINQ to SQL-Designer erzeugen | 1327 |
Datenquelle hinzufügen | 1328 |
Oberfläche | 1329 |
Test | 1330 |
Bemerkung | 1330 |
25 OOP-Spezial | 1332 |
25.1 Eine kleine Einführung in die UML | 1332 |
25.1.1 Use Case-Diagramm | 1332 |
25.1.2 Use Case-Dokumentation | 1334 |
USE CASE: Inbetriebnahme des Autos | 1334 |
USE CASE: Versuchter Diebstahl des Autos | 1335 |
25.1.3 Objekte identifizieren | 1335 |
25.1.4 Statisches Modell | 1336 |
25.1.5 Beziehungen zwischen den Klassen | 1337 |
25.1.6 Dynamisches Modell | 1337 |
Relevante Zustände identifizieren | 1337 |
Zustandsüberführungsdiagramm | 1338 |
25.1.7 Implementierung | 1338 |
Klasse CSchlüssel | 1339 |
Klasse CSchloss | 1340 |
Klasse CAuto | 1340 |
25.1.8 Test-Client | 1342 |
Test | 1344 |
Bemerkungen | 1345 |
25.2 Der Klassen-Designer | 1345 |
25.2.1 Ein neues Klassendiagramm erzeugen | 1346 |
25.2.2 Werkzeugkasten | 1347 |
25.2.3 Enumeration | 1348 |
25.2.4 Klasse | 1350 |
Klassendetails-Fenster | 1351 |
25.2.5 Struktur | 1352 |
25.2.6 Abstrakte Klasse | 1352 |
25.2.7 Schnittstelle | 1354 |
25.2.8 Delegate | 1356 |
25.2.9 Zuordnung | 1358 |
25.2.10 Vererbung | 1359 |
25.2.11 Diagramme anpassen | 1359 |
25.2.12 Wann lohnt sich der Klassen-Designer? | 1360 |
25.3 Praxisbeispiele | 1360 |
25.3.1 Implementierung einer Finite State Machine | 1360 |
Zustandsüberführungsmatrix | 1360 |
CAuto | 1364 |
Clientcode | 1365 |
Test | 1366 |
25.3.2 Modellierung des Bestellsystems einer Firma | 1366 |
Klassendiagramm | 1366 |
Klasse CBestellung | 1367 |
Klasse CPerson | 1369 |
Klasse CKunde | 1370 |
Klasse CFirma | 1373 |
Klasse Form1 | 1374 |
Abschlusstest | 1378 |
Bemerkungen | 1378 |
26 Das Microsoft Event Pattern | 1380 |
26.1 Einführung in Design Pattern | 1380 |
26.2 Aufbau und Bedeutung des Observer Pattern | 1381 |
26.2.1 Subjekt und Observer | 1381 |
26.2.2 Sequenzdiagramme | 1383 |
26.2.3 Die Registration-Sequenz | 1383 |
26.2.4 Die Notification-Sequenz | 1384 |
26.2.5 Die Unregistration-Sequenz | 1384 |
26.2.6 Bedeutung der Sequenzen für das Geschäftsmodell | 1385 |
26.2.7 Die Rolle des Containers | 1385 |
26.3 Implementieren mit Interfaces und Callbacks | 1386 |
26.3.1 Übersicht und Klassendiagramm | 1386 |
26.3.2 Die Schnittstellen IObserver und IObservable | 1388 |
26.3.3 Die Abstrakte Klasse Subject | 1388 |
26.3.4 Observer1 | 1389 |
26.3.5 Observer2 | 1390 |
26.3.6 Model | 1391 |
26.3.7 Form1 | 1392 |
26.3.8 Ein zweites Klassendiagramm | 1393 |
26.3.9 Testen | 1394 |
26.4 Implementierung mit Delegates und Events | 1395 |
26.4.1 Multicast-Events | 1396 |
26.4.2 IObserver, IObservable und Subject | 1396 |
26.4.3 Observer1 und Observer2 | 1397 |
26.4.4 Model | 1397 |
26.4.5 Form1 | 1398 |
26.4.6 Test und Vergleich | 1398 |
26.4.7 Klassendiagramm | 1399 |
26.5 Implementierung des Microsoft Event Pattern | 1400 |
26.5.1 Namensgebung für Ereignisse | 1400 |
26.5.2 Namensgebung und Signatur der Delegates | 1400 |
26.5.3 Hinzufügen einer das Ereignis auslösenden Methode | 1401 |
Neue Klasse NumberChangedEventArgs | 1401 |
26.5.4 Model | 1402 |
26.5.5 Observer1 | 1403 |
26.5.6 Form1 | 1404 |
26.6 Test und Vergleich | 1404 |
26.7 Klassendiagramm | 1404 |
26.8 Implementierung eines Event Pattern | 1405 |
26.9 Praxisbeispiel | 1407 |
26.9.1 Objekte beobachten sich gegenseitig | 1407 |
Oberfläche | 1407 |
NumberChangedEventArgs und MaximumChangedEventArgs | 1407 |
Model | 1408 |
Observer1 | 1410 |
Observer2 | 1411 |
Form1 | 1412 |
Test und Vergleich | 1414 |
Klassenzusammenstellung | 1415 |
Klassendiagramm | 1416 |
27 Verteilen von Anwendungen | 1418 |
27.1 ClickOnce-Deployment | 1419 |
27.1.1 Übersicht/Einschränkungen | 1419 |
27.1.2 Die Vorgehensweise | 1420 |
27.1.3 Ort der Veröffentlichung | 1420 |
27.1.4 Anwendungsdateien | 1421 |
27.1.5 Erforderliche Komponenten | 1421 |
27.1.6 Aktualisierungen | 1422 |
27.1.7 Veröffentlichungsoptionen | 1423 |
27.1.8 Veröffentlichen | 1424 |
27.1.9 Verzeichnisstruktur | 1424 |
27.1.10 Der Webpublishing-Assistent | 1426 |
27.1.11 Neue Versionen erstellen | 1427 |
27.2 InstallShield | 1427 |
27.2.1 Installation | 1427 |
27.2.2 Aktivieren | 1428 |
27.2.3 Ein neues Setup-Projekt | 1428 |
Anwendungseinstellungen | 1429 |
Installationsbedingungen | 1430 |
Optionales Setup | 1431 |
Anwendungsdateien | 1431 |
Startmenü und Verknüpfungen | 1432 |
Registrierungseinträge | 1432 |
Setup-Dialoge/Erscheinungsbild | 1433 |
Installationsdateien | 1435 |
27.2.4 Finaler Test | 1436 |
28 Weitere Techniken | 1438 |
28.1 Zugriff auf die Zwischenablage | 1438 |
28.1.1 Das Clipboard-Objekt | 1438 |
Kopieren | 1439 |
Einfügen | 1439 |
28.1.2 Zwischenablage-Funktionen für Textboxen | 1440 |
28.2 Arbeiten mit der Registry | 1440 |
28.2.1 Allgemeines | 1441 |
28.2.2 Registry-Unterstützung in .NET | 1443 |
28.3 .NET-Reflection | 1444 |
28.3.1 Übersicht | 1444 |
28.3.2 Assembly laden | 1444 |
28.3.3 Mittels GetType und Type Informationen sammeln | 1445 |
28.3.4 Dynamisches Laden von Assemblies | 1447 |
Beispiel | 1447 |
28.4 Das SerialPort-Control | 1450 |
28.4.1 Übersicht | 1450 |
Wichtige Eigenschaften | 1450 |
Wichtige Methoden | 1451 |
Wichtige Ereignisse | 1451 |
28.4.2 Einführungsbeispiele | 1451 |
SerialPortTalker | 1451 |
SerialPortListener | 1452 |
Test | 1453 |
28.4.3 Thread-Probleme bei Windows Forms-Anwendungen | 1454 |
28.4.4 Ein einfaches Terminalprogramm | 1457 |
Bedienoberfläche | 1458 |
Quellcode | 1458 |
Test | 1461 |
Bemerkungen zur Verarbeitung von Messdaten | 1461 |
28.5 Praxisbeispiele | 1462 |
28.5.1 Zugriff auf die Registry | 1462 |
Oberfläche | 1462 |
Quelltext | 1462 |
Test | 1464 |
28.5.2 Dateiverknüpfungen erzeugen | 1464 |
28.5.3 Betrachter für Manifestressourcen | 1466 |
Oberfläche | 1466 |
Quellcode Form1 | 1466 |
Test | 1468 |
28.5.4 Ressourcen mit Reflection auslesen | 1469 |
29 Konsolenanwendungen | 1472 |
29.1 Grundaufbau/Konzepte | 1472 |
29.1.1 Unser Hauptprogramm – Program.cs | 1473 |
static void Main() | 1474 |
29.1.2 Rückgabe eines Fehlerstatus | 1474 |
29.1.3 Parameterübergabe | 1475 |
29.1.4 Zugriff auf die Umgebungsvariablen | 1476 |
29.2 Die Kommandozentrale: System.Console | 1477 |
29.2.1 Eigenschaften | 1478 |
29.2.2 Methoden/Ereignisse | 1478 |
29.2.3 Textausgaben | 1479 |
29.2.4 Farbangaben | 1480 |
29.2.5 Tastaturabfragen | 1481 |
Modifiers-Eigenschaft und ConsoleModifiers-Enumeration | 1482 |
29.2.6 Arbeiten mit Streamdaten | 1482 |
29.3 Praxisbeispiel | 1484 |
29.3.1 Farbige Konsolenanwendung | 1484 |
29.3.2 Weitere Hinweise und Beispiele | 1486 |
30 Windows Forms-Anwendungen | 1490 |
30.1 Grundaufbau/Konzepte | 1490 |
30.1.1 Das Hauptprogramm – Program.cs | 1491 |
static void Main() | 1492 |
Application.EnableVisualStyles | 1493 |
Application.SetCompatibleTextRenderingDefault(false) | 1493 |
Application.Run(new Form1()) | 1493 |
30.1.2 Die Oberflächendefinition – Form1.Designer.cs | 1495 |
30.1.3 Die Spielwiese des Programmierers – Form1.cs | 1496 |
30.1.4 Die Datei AssemblyInfo.cs | 1497 |
30.1.5 Resources.resx/Resources.Designer.cs | 1498 |
30.1.6 Settings.settings/Settings.Designer.cs | 1499 |
30.1.7 Settings.cs | 1500 |
30.2 Ein Blick auf die Application-Klasse | 1501 |
30.2.1 Eigenschaften | 1501 |
30.2.2 Methoden | 1502 |
30.2.3 Ereignisse | 1504 |
30.3 Allgemeine Eigenschaften von Komponenten | 1504 |
30.3.1 Font | 1505 |
30.3.2 Handle | 1507 |
30.3.3 Tag | 1508 |
30.3.4 Modifiers | 1508 |
30.4 Allgemeine Ereignisse von Komponenten | 1509 |
30.4.1 Die Eventhandler-Argumente | 1509 |
30.4.2 Sender | 1509 |
30.4.3 Der Parameter e | 1511 |
30.4.4 Mausereignisse | 1511 |
Tastaturereignisse | 1512 |
30.4.5 KeyPreview | 1513 |
30.4.6 Weitere Ereignisse | 1514 |
30.4.7 Validätsprüfungen | 1514 |
30.4.8 SendKeys | 1515 |
30.5 Allgemeine Methoden von Komponenten | 1516 |
31 Windows Forms-Formulare | 1518 |
31.1 Übersicht | 1518 |
31.1.1 Wichtige Eigenschaften des Form-Objekts | 1519 |
Controls-Auflistung | 1520 |
31.1.2 Wichtige Ereignisse des Form-Objekts | 1521 |
31.1.3 Wichtige Methoden des Form-Objekts | 1522 |
31.2 Praktische Aufgabenstellungen | 1523 |
31.2.1 Fenster anzeigen | 1523 |
Nichtmodale Fenster | 1524 |
Modale Fenster (Dialoge) | 1524 |
31.2.2 Splash Screens beim Anwendungsstart anzeigen | 1526 |
31.2.3 Eine Sicherheitsabfrage vor dem Schließen anzeigen | 1529 |
31.2.4 Ein Formular durchsichtig machen | 1529 |
31.2.5 Die Tabulatorreihenfolge festlegen | 1530 |
31.2.6 Ausrichten von Komponenten im Formular | 1531 |
Dock | 1531 |
Anchor | 1532 |
31.2.7 Spezielle Panels für flexible Layouts | 1533 |
SplitContainer | 1534 |
FlowLayoutPanel | 1534 |
TableLayoutPanel | 1534 |
31.2.8 Menüs erzeugen | 1535 |
MenuStrip | 1535 |
ContextMenuStrip | 1537 |
Weitere Eigenschaften von Menüeinträgen | 1538 |
31.3 MDI-Anwendungen | 1539 |
31.3.1 "Falsche" MDI-Fenster bzw. Verwenden von Parent | 1539 |
31.3.2 Die echten MDI-Fenster | 1540 |
31.3.3 Die Kindfenster | 1541 |
31.3.4 Automatisches Anordnen der Kindfenster | 1542 |
31.3.5 Zugriff auf die geöffneten MDI-Kindfenster | 1543 |
31.3.6 Zugriff auf das aktive MDI-Kindfenster | 1544 |
31.3.7 Mischen von Kindfenstermenü/MDIContainer-Menü | 1544 |
AllowMerge | 1544 |
MergeAction und MergeIndex | 1545 |
31.4 Praxisbeispiele | 1545 |
31.4.1 Informationsaustausch zwischen Formularen | 1545 |
Überblick | 1545 |
Bedienoberfläche Form1 (Hauptformular) | 1546 |
Bedienoberfläche Form2 ... Form5 (untergeordnete Formulare) | 1546 |
Allgemeiner Code für Form1 | 1547 |
Variante 1: Übergabe der Formular-Referenz im Konstruktor | 1548 |
Variante 2: Übergabe der Formular-Referenz als Eigenschaft | 1549 |
Variante 3: Übergabe der Formular-Referenz als globale Variable | 1550 |
Variante 4: Übergabe der Formular-Referenz als Ownership | 1551 |
Bemerkungen | 1552 |
31.4.2 Ereigniskette beim Laden/Entladen eines Formulars | 1552 |
Bedienoberfläche (Form1 und Form2) | 1553 |
Änderung des Startformulars | 1553 |
Quellcode von Form1 | 1554 |
Quellcode von Form2 | 1556 |
Test | 1556 |
Bemerkungen | 1557 |
32 Windows Forms-Komponenten | 1558 |
32.1 Allgemeine Hinweise | 1558 |
32.1.1 Hinzufügen von Komponenten | 1558 |
32.1.2 Komponenten zur Laufzeit per Code erzeugen | 1559 |
32.2 Allgemeine Steuerelemente | 1561 |
32.2.1 Label | 1561 |
32.2.2 LinkLabel | 1562 |
Wichtige Eigenschaften | 1562 |
Hyperlink einfügen | 1562 |
32.2.3 Button | 1563 |
32.2.4 TextBox | 1564 |
Mehrzeilige Textboxen | 1564 |
Markieren von Text | 1565 |
PasswordChar | 1566 |
Automatisches Vervollständigen | 1566 |
32.2.5 MaskedTextBox | 1567 |
32.2.6 CheckBox | 1568 |
32.2.7 RadioButton | 1570 |
32.2.8 ListBox | 1570 |
32.2.9 CheckedListBox | 1572 |
32.2.10 ComboBox | 1572 |
32.2.11 PictureBox | 1573 |
32.2.12 DateTimePicker | 1574 |
32.2.13 MonthCalendar | 1574 |
32.2.14 HScrollBar, VScrollBar | 1575 |
32.2.15 TrackBar | 1576 |
32.2.16 NumericUpDown | 1576 |
32.2.17 DomainUpDown | 1577 |
32.2.18 ProgressBar | 1577 |
32.2.19 RichTextBox | 1578 |
32.2.20 ListView | 1579 |
ListViewItem | 1579 |
ImageList | 1580 |
Übersichten zur ListView | 1580 |
32.2.21 TreeView | 1585 |
Knoten zur Laufzeit erzeugen | 1586 |
Auswerten des aktiven Knotens | 1587 |
Wichtige Eigenschaften von TreeView | 1588 |
Wichtige Methoden von TreeView | 1589 |
Wichtige Ereignisse von TreeView | 1589 |
Wichtige Eigenschaften von TreeNode | 1589 |
Wichtige Methoden von TreeNode | 1590 |
32.2.22 WebBrowser | 1590 |
32.3 Container | 1591 |
32.3.1 FlowLayout/TableLayout/SplitContainer | 1591 |
32.3.2 Panel | 1591 |
Oberflächen gestalten | 1591 |
32.3.3 GroupBox | 1592 |
32.3.4 TabControl | 1593 |
Wichtige Eigenschaften | 1594 |
Wichtige Ereignisse | 1594 |
32.3.5 ImageList | 1595 |
32.4 Menüs & Symbolleisten | 1596 |
32.4.1 MenuStrip und ContextMenuStrip | 1596 |
32.4.2 ToolStrip | 1596 |
32.4.3 StatusStrip | 1596 |
32.4.4 ToolStripContainer | 1597 |
32.5 Daten | 1597 |
32.5.1 DataSet | 1597 |
32.5.2 DataGridView/DataGrid | 1598 |
32.5.3 BindingNavigator/BindingSource | 1598 |
32.5.4 Chart | 1598 |
32.6 Komponenten | 1600 |
32.6.1 ErrorProvider | 1600 |
32.6.2 HelpProvider | 1600 |
32.6.3 ToolTip | 1600 |
32.6.4 BackgroundWorker | 1600 |
32.6.5 Timer | 1600 |
32.6.6 SerialPort | 1601 |
32.7 Drucken | 1601 |
32.7.1 PrintPreviewControl | 1601 |
32.7.2 PrintDocument | 1601 |
32.8 Dialoge | 1601 |
32.8.1 OpenFileDialog/SaveFileDialog/FolderBrowserDialog | 1601 |
32.8.2 FontDialog/ColorDialog | 1602 |
32.9 WPF-Unterstützung mit dem ElementHost | 1602 |
32.10 Praxisbeispiele | 1602 |
32.10.1 Mit der CheckBox arbeiten | 1602 |
Oberfläche | 1602 |
Quellcode | 1603 |
Test | 1603 |
32.10.2 Steuerelemente per Code selbst erzeugen | 1604 |
Oberfläche | 1604 |
Quellcode | 1604 |
Test | 1606 |
Bemerkungen | 1606 |
32.10.3 Controls-Auflistung im TreeView anzeigen | 1606 |
Oberfläche | 1607 |
Quellcode | 1608 |
Test | 1609 |
32.10.4 WPF-Komponenten mit dem ElementHost anzeigen | 1610 |
Oberfläche (WPF-Control) | 1611 |
Oberfläche (Windows Forms) | 1613 |
33 Grundlagen Grafikausgabe | 1614 |
33.1 Übersicht und erste Schritte | 1614 |
33.1.1 GDI+ – Ein erster Einblick für Umsteiger | 1615 |
Ein zentrales Grafikausgabe-Objekt | 1615 |
Die Grafikausgabe ist zustandslos | 1615 |
Prinzipieller Ablauf | 1615 |
Wichtige Features | 1616 |
33.1.2 Namespaces für die Grafikausgabe | 1616 |
System.Drawing | 1616 |
System.Drawing.Drawing2D | 1617 |
System.Drawing.Imaging | 1617 |
System.Drawing.Printing | 1617 |
System.Drawing.Design | 1618 |
System.Drawing.Text | 1618 |
33.2 Darstellen von Grafiken | 1618 |
33.2.1 Die PictureBox-Komponente | 1618 |
33.2.2 Das Image-Objekt | 1619 |
33.2.3 Laden von Grafiken zur Laufzeit | 1620 |
33.2.4 Sichern von Grafiken | 1620 |
Spezielle Einstellungen | 1621 |
33.2.5 Grafikeigenschaften ermitteln | 1621 |
Breite und Höhe der Grafik | 1621 |
Auflösung | 1621 |
Grafiktyp | 1622 |
Interner Bitmap-Aufbau | 1622 |
33.2.6 Erzeugen von Vorschaugrafiken (Thumbnails) | 1622 |
33.2.7 Die Methode RotateFlip | 1623 |
33.2.8 Skalieren von Grafiken | 1624 |
33.3 Das .NET-Koordinatensystem | 1625 |
33.3.1 Globale Koordinaten | 1626 |
33.3.2 Seitenkoordinaten (globale Transformation) | 1627 |
Translation (Verschiebung) | 1627 |
Skalierung (Vergrößerung/Verkleinerung) | 1627 |
Rotation | 1628 |
33.3.3 Gerätekoordinaten (Seitentransformation) | 1629 |
33.4 Grundlegende Zeichenfunktionen von GDI+ | 1630 |
33.4.1 Das zentrale Graphics-Objekt | 1630 |
Wie erzeuge ich ein Graphics-Objekt? | 1631 |
Die Invalidate-Methode | 1632 |
Die Eigenschaft ResizeRedraw | 1632 |
33.4.2 Punkte zeichnen/abfragen | 1633 |
33.4.3 Linien | 1634 |
33.4.4 Kantenglättung mit Antialiasing | 1635 |
33.4.5 PolyLine | 1636 |
33.4.6 Rechtecke | 1636 |
DrawRectangle | 1636 |
FillRectangle | 1637 |
DrawRectangles/FillRectangles | 1637 |
33.4.7 Polygone | 1638 |
33.4.8 Splines | 1639 |
33.4.9 Bézierkurven | 1640 |
33.4.10 Kreise und Ellipsen | 1641 |
33.4.11 Tortenstück (Segment) | 1641 |
Kuchendiagramme | 1642 |
33.4.12 Bogenstück | 1643 |
33.4.13 Wo sind die Rechtecke mit den runden Ecken? | 1644 |
33.4.14 Textausgabe | 1645 |
Texteigenschaften | 1646 |
Ausgabe von mehrzeiligem Text | 1646 |
Textattribute | 1647 |
Ausgabequalität | 1647 |
Und wo bleibt eine Methode zum Drehen von Text? | 1648 |
33.4.15 Ausgabe von Grafiken | 1649 |
Skalieren | 1650 |
33.5 Unser Werkzeugkasten | 1650 |
33.5.1 Einfache Objekte | 1650 |
Point, FPoint | 1650 |
Size, FSize | 1651 |
Rectangle, FRectangle | 1651 |
33.5.2 Vordefinierte Objekte | 1652 |
Vordefinierte Pinsel | 1652 |
Vordefinierte Stifte | 1652 |
Vordefinierte Farben | 1653 |
Vordefinierte Icons | 1653 |
33.5.3 Farben/Transparenz | 1654 |
ARGB-Farben | 1654 |
Was ist mit dem höchstwertigen Byte? | 1654 |
33.5.4 Stifte (Pen) | 1655 |
Einfarbige Stifte | 1656 |
Stifte mit Füllung | 1657 |
33.5.5 Pinsel (Brush) | 1658 |
33.5.6 SolidBrush | 1659 |
33.5.7 HatchBrush | 1659 |
33.5.8 TextureBrush | 1660 |
33.5.9 LinearGradientBrush | 1661 |
33.5.10 PathGradientBrush | 1662 |
33.5.11 Fonts | 1663 |
33.5.12 Path-Objekt | 1664 |
Füllen | 1665 |
Fillmode | 1666 |
33.5.13 Clipping/Region | 1667 |
Regions | 1668 |
Clipping | 1670 |
33.6 Standarddialoge | 1671 |
33.6.1 Schriftauswahl | 1671 |
33.6.2 Farbauswahl | 1672 |
33.7 Praxisbeispiele | 1674 |
33.7.1 Ein Graphics-Objekt erzeugen | 1674 |
Variante 1: Verwendung des Paint-Events | 1674 |
Test | 1674 |
Variante 2: Überschreiben der OnPaint-Methode | 1675 |
Test | 1675 |
Variante 3: Graphics-Objekt mit CreateGraphics erzeugen | 1675 |
Test | 1676 |
Variante 4: Verwendung des Graphics-Objekts einer PictureBox | 1676 |
33.7.2 Zeichenoperationen mit der Maus realisieren | 1676 |
Oberfläche | 1676 |
Quelltext | 1677 |
Test | 1679 |
34 Druckausgabe | 1680 |
34.1 Einstieg und Übersicht | 1680 |
34.1.1 Nichts geht über ein Beispiel | 1680 |
34.1.2 Programmiermodell | 1682 |
34.1.3 Kurzübersicht der Objekte | 1683 |
34.2 Auswerten der Druckereinstellungen | 1683 |
34.2.1 Die vorhandenen Drucker | 1683 |
34.2.2 Der Standarddrucker | 1684 |
34.2.3 Verfügbare Papierformate/Seitenabmessungen | 1685 |
34.2.4 Der eigentliche Druckbereich | 1686 |
34.2.5 Die Seitenausrichtung ermitteln | 1687 |
34.2.6 Ermitteln der Farbfähigkeit | 1687 |
34.2.7 Die Druckauflösung abfragen | 1687 |
34.2.8 Ist beidseitiger Druck möglich? | 1688 |
34.2.9 Einen "Informationsgerätekontext" erzeugen | 1688 |
34.2.10 Abfragen von Werten während des Drucks | 1689 |
34.3 Festlegen von Druckereinstellungen | 1690 |
34.3.1 Einen Drucker auswählen | 1690 |
34.3.2 Drucken in Millimetern | 1690 |
34.3.3 Festlegen der Seitenränder | 1691 |
34.3.4 Druckjobname | 1692 |
34.3.5 Anzahl der Kopien | 1693 |
34.3.6 Beidseitiger Druck | 1693 |
34.3.7 Seitenzahlen festlegen | 1694 |
34.3.8 Druckqualität verändern | 1697 |
34.3.9 Ausgabemöglichkeiten des Chart-Controls nutzen | 1698 |
34.4 Die Druckdialoge verwenden | 1698 |
34.4.1 PrintDialog | 1699 |
34.4.2 PageSetupDialog | 1700 |
Probleme mit den Rändern | 1701 |
34.4.3 PrintPreviewDialog | 1702 |
34.4.4 Ein eigenes Druckvorschau-Fenster realisieren | 1703 |
34.5 Drucken mit OLE-Automation | 1704 |
34.5.1 Kurzeinstieg in die OLE-Automation | 1704 |
Programmieren der OLE-Automation | 1705 |
34.5.2 Drucken mit Microsoft Word | 1706 |
34.6 Praxisbeispiele | 1708 |
34.6.1 Den Drucker umfassend konfigurieren | 1708 |
Oberfläche (Hauptformular Form1) | 1708 |
Oberfläche (Druckvorschau Form2) | 1709 |
Quelltext (Form1) | 1710 |
Quelltext (Form2) | 1715 |
Test | 1716 |
34.6.2 Diagramme mit dem Chart-Control drucken | 1718 |
Oberfläche | 1718 |
Quelltext | 1718 |
Test | 1719 |
34.6.3 Druckausgabe mit Word | 1720 |
Oberfläche | 1720 |
Quelltext | 1721 |
Test | 1723 |
Anmerkung ab .NET 4.0 | 1724 |
35 Windows Forms-Datenbindung | 1726 |
35.1 Prinzipielle Möglichkeiten | 1726 |
35.2 Manuelle Bindung an einfache Datenfelder | 1727 |
35.2.1 BindingSource erzeugen | 1727 |
35.2.2 Binding-Objekt | 1728 |
35.2.3 DataBindings-Collection | 1728 |
Bemerkungen | 1728 |
35.3 Manuelle Bindung an Listen und Tabellen | 1728 |
35.3.1 DataGridView | 1729 |
35.3.2 Datenbindung von ComboBox und ListBox | 1729 |
35.4 Entwurfszeit-Bindung an typisierte DataSets | 1729 |
35.5 Drag & Drop-Datenbindung | 1731 |
35.6 Navigations- und Bearbeitungsfunktionen | 1731 |
35.6.1 Navigieren zwischen den Datensätzen | 1731 |
35.6.2 Hinzufügen und Löschen | 1731 |
35.6.3 Aktualisieren und Abbrechen | 1732 |
35.6.4 Verwendung des BindingNavigators | 1732 |
35.7 Die Anzeigedaten formatieren | 1733 |
35.8 Praxisbeispiele | 1733 |
35.8.1 Einrichten und Verwenden einer Datenquelle | 1733 |
Assistent zum Konfigurieren von Datenquellen | 1733 |
Verwenden der Datenquelle | 1735 |
Test | 1736 |
Abfragemethoden hinzufügen | 1736 |
35.8.2 Eine Auswahlabfrage im DataGridView anzeigen | 1737 |
Oberfläche | 1738 |
Quellcode | 1738 |
Test | 1739 |
35.8.3 Master-Detailbeziehungen im DataGrid anzeigen | 1740 |
Oberfläche | 1740 |
Quellcode | 1740 |
Test | 1741 |
35.8.4 Datenbindung Chart-Control | 1741 |
Oberfläche | 1742 |
Quellcode | 1744 |
Test | 1744 |
36 Erweiterte Grafikausgabe | 1746 |
36.1 Transformieren mit der Matrix-Klasse | 1746 |
36.1.1 Übersicht | 1746 |
36.1.2 Translation | 1747 |
36.1.3 Skalierung | 1747 |
36.1.4 Rotation | 1748 |
36.1.5 Scherung | 1748 |
36.1.6 Zuweisen der Matrix | 1749 |
36.2 Low-Level-Grafikmanipulationen | 1749 |
36.2.1 Worauf zeigt Scan0? | 1750 |
36.2.2 Anzahl der Spalten bestimmen | 1751 |
36.2.3 Anzahl der Zeilen bestimmen | 1752 |
36.2.4 Zugriff im Detail (erster Versuch) | 1752 |
36.2.5 Zugriff im Detail (zweiter Versuch) | 1754 |
Weiter optimieren | 1755 |
36.2.6 Invertieren | 1756 |
36.2.7 In Graustufen umwandeln | 1757 |
36.2.8 Heller/Dunkler | 1758 |
36.2.9 Kontrast | 1760 |
36.2.10 Gamma-Wert | 1761 |
36.2.11 Histogramm spreizen | 1761 |
36.2.12 Ein universeller Grafikfilter | 1764 |
Beispiel: Eine universelle Filter-Klasse entwickeln | 1764 |
Die Klasse GrafikFilter im Einsatz | 1767 |
36.3 Fortgeschrittene Techniken | 1768 |
36.3.1 Flackerfrei dank Double Buffering | 1768 |
Eine Puffer-Bitmap erzeugen | 1768 |
Und was ist mit der PictureBox? | 1769 |
36.3.2 Animationen | 1770 |
Vorbereiten des Ausgabeobjekts | 1770 |
Styles bei Controls setzen | 1771 |
Die eigentliche Grafikausgabe | 1771 |
Bemerkungen | 1773 |
36.3.3 Animated GIFs | 1773 |
Wie lernen die Bilder das Laufen? | 1774 |
36.3.4 Auf einzelne GIF-Frames zugreifen | 1775 |
Wiedergabe einzelner Frames | 1776 |
Erzeugen eines Bitmap-Strips | 1776 |
36.3.5 Transparenz realisieren | 1777 |
36.3.6 Eine Grafik maskieren | 1778 |
36.3.7 JPEG-Qualität beim Sichern bestimmen | 1780 |
36.4 Grundlagen der 3D-Vektorgrafik | 1781 |
36.4.1 Datentypen für die Verwaltung | 1781 |
36.4.2 Eine universelle 3D-Grafik-Klasse | 1782 |
36.4.3 Grundlegende Betrachtungen | 1783 |
Drehwinkel | 1784 |
Darstellungsmöglichkeiten | 1784 |
36.4.4 Translation | 1786 |
36.4.5 Streckung/Skalierung | 1787 |
36.4.6 Rotation | 1788 |
36.4.7 Die eigentlichen Zeichenroutinen | 1790 |
Ausgabe einer Linie | 1790 |
Ausgabe eines Koordinatensystems | 1790 |
36.5 Und doch wieder GDI-Funktionen ... | 1792 |
36.5.1 Am Anfang war das Handle ... | 1792 |
36.5.2 Gerätekontext (Device Context Types) | 1795 |
Formular-DC über Graphics-Objekt erzeugen | 1795 |
Formular-DC mit GetDC erzeugen | 1796 |
36.5.3 Koordinatensysteme und Abbildungsmodi | 1797 |
36.5.4 Zeichenwerkzeuge/Objekte | 1801 |
Erzeugen und Parametrieren der Objekte | 1802 |
36.5.5 Bitmaps | 1803 |
Bitmaps kopieren | 1805 |
Bitmaps skalieren | 1806 |
36.6 Praxisbeispiele | 1807 |
36.6.1 Die Transformationsmatrix verstehen | 1807 |
Oberfläche | 1807 |
Quelltext | 1807 |
Test | 1809 |
36.6.2 Eine 3D-Grafikausgabe in Aktion | 1810 |
Oberfläche | 1810 |
Quelltext | 1810 |
Test/Bemerkungen | 1812 |
36.6.3 Einen Fenster-Screenshot erzeugen | 1813 |
Oberfläche | 1813 |
Quelltext | 1813 |
Test | 1814 |
Bemerkung | 1815 |
37 Ressourcen/Lokalisierung | 1816 |
37.1 Manifestressourcen | 1816 |
37.1.1 Erstellen von Manifestressourcen | 1816 |
37.1.2 Zugriff auf Manifestressourcen | 1818 |
Namensgebung eingebetteter Ressourcen | 1818 |
Auflisten aller eingebetteten Ressourcen | 1818 |
Die Inhalte eingebetteter Ressourcen auslesen | 1819 |
37.2 Typisierte Ressourcen | 1820 |
37.2.1 Erzeugen von .resources-Dateien | 1820 |
37.2.2 Hinzufügen der .resources-Datei zum Projekt | 1820 |
37.2.3 Zugriff auf die Inhalte von .resources-Dateien | 1821 |
Bemerkungen zum Zugriff auf .resources-Dateien | 1821 |
37.2.4 ResourceManager einer .resources-Datei erzeugen | 1821 |
Bemerkungen | 1822 |
37.2.5 Was sind .resx-Dateien? | 1822 |
37.3 Streng typisierte Ressourcen | 1822 |
37.3.1 Erzeugen streng typisierter Ressourcen | 1823 |
37.3.2 Verwenden streng typisierter Ressourcen | 1823 |
37.3.3 Streng typisierte Ressourcen per Reflection auslesen | 1824 |
37.4 Anwendungen lokalisieren | 1826 |
37.4.1 Localizable und Language | 1826 |
37.4.2 Beispiel "Landesfahnen" | 1826 |
37.4.3 Einstellen der aktuellen Kultur zur Laufzeit | 1829 |
Bemerkungen | 1830 |
38 Komponentenentwicklung | 1832 |
38.1 Überblick | 1832 |
38.2 Benutzersteuerelement | 1833 |
38.2.1 Entwickeln einer Auswahl-ListBox | 1833 |
Oberflächendesign | 1834 |
Implementieren der Programmlogik | 1834 |
38.2.2 Komponente verwenden | 1835 |
38.3 Benutzerdefiniertes Steuerelement | 1836 |
38.3.1 Entwickeln eines BlinkLabels | 1836 |
Oberflächendesign | 1837 |
Festlegen des Typs des Vorfahren | 1837 |
Implementieren der Programmlogik | 1838 |
38.3.2 Verwenden der Komponente | 1839 |
38.4 Komponentenklasse | 1839 |
38.5 Eigenschaften | 1840 |
38.5.1 Einfache Eigenschaften | 1840 |
38.5.2 Schreib-/Lesezugriff (Get/Set) | 1840 |
38.5.3 Nur Lese-Eigenschaft (ReadOnly) | 1841 |
38.5.4 Nur-Schreibzugriff (WriteOnly) | 1842 |
38.5.5 Hinzufügen von Beschreibungen | 1842 |
38.5.6 Ausblenden im Eigenschaftenfenster | 1842 |
38.5.7 Einfügen in Kategorien | 1843 |
38.5.8 Default-Wert einstellen | 1843 |
38.5.9 Standard-Eigenschaft (Indexer) | 1844 |
38.5.10 Wertebereichsbeschränkung und Fehlerprüfung | 1844 |
38.5.11 Eigenschaften von Aufzählungstypen | 1846 |
38.5.12 Standard Objekt-Eigenschaften | 1847 |
38.5.13 Eigene Objekt-Eigenschaften | 1847 |
38.6 Methoden | 1849 |
38.6.1 Konstruktor | 1850 |
38.6.2 Class-Konstruktor | 1851 |
38.6.3 Destruktor | 1852 |
38.6.4 Aufruf des Basisklassen-Konstruktors | 1852 |
38.6.5 Aufruf von Basisklassen-Methoden | 1853 |
38.7 Ereignisse (Events) | 1853 |
38.7.1 Ereignis mit Standardargument definieren | 1854 |
38.7.2 Ereignis mit eigenen Argumenten | 1855 |
38.7.3 Ein Default-Ereignis festlegen | 1856 |
38.7.4 Mit Ereignissen auf Windows-Messages reagieren | 1856 |
38.8 Weitere Themen | 1858 |
38.8.1 Wohin mit der Komponente? | 1858 |
38.8.2 Assembly-Informationen festlegen | 1859 |
38.8.3 Assemblies signieren | 1862 |
Erstellen eines AssemblyKey-File | 1862 |
38.8.4 Komponenten-Ressourcen einbetten | 1862 |
38.8.5 Der Komponente ein Icon zuordnen | 1863 |
Icon erstellen | 1863 |
38.8.6 Den Designmodus erkennen | 1864 |
38.8.7 Komponenten lizenzieren | 1864 |
Verwendung der LicFileLicenseProvider-Klasse | 1865 |
Ableiten der LicFileLicenseProvider-Klasse | 1866 |
Bemerkung | 1868 |
38.9 Praxisbeispiele | 1868 |
38.9.1 AnimGif – Anzeige von Animationen | 1868 |
Oberfläche/Ressourcen | 1868 |
Quelltext | 1869 |
Test | 1871 |
38.9.2 Eine FontComboBox entwickeln | 1871 |
Quelltext | 1871 |
Test | 1873 |
38.9.3 Das PropertyGrid verwenden | 1873 |
Oberfläche | 1873 |
Quelltext | 1873 |
Test | 1875 |
39 Einführung in ASP.NET | 1878 |
39.1 ASP.NET für Ein- und Umsteiger | 1878 |
39.1.1 ASP – Ein kurzer Blick zurück | 1878 |
39.1.2 Was ist bei ASP.NET anders? | 1879 |
39.1.3 Was gibt es noch in ASP.NET? | 1881 |
39.1.4 Vorteile von ASP.NET gegenüber ASP | 1882 |
39.1.5 Voraussetzungen für den Einsatz von ASP.NET | 1883 |
39.1.6 Und was hat das alles mit C# zu tun? | 1883 |
Grundsätzlicher Projektaufbau | 1884 |
39.2 Unsere erste Web-Anwendung | 1886 |
39.2.1 Visueller Entwurf der Bedienoberfläche | 1886 |
39.2.2 Zuweisen der Objekteigenschaften | 1889 |
39.2.3 Verknüpfen der Objekte mit Ereignissen | 1890 |
39.2.4 Programm kompilieren und testen | 1891 |
39.3 Die ASP.NET-Projektdateien | 1892 |
39.3.1 Die ASP.NET-Projekttypen | 1893 |
ASP.NET-Website | 1894 |
ASP.NET-Web-Anwendungen | 1894 |
39.3.2 ASPX-Datei(en) | 1895 |
39.3.3 Die aspx.cs-Datei(en) | 1897 |
39.3.4 Die Datei Global.asax | 1898 |
39.3.5 Das Startformular | 1899 |
39.3.6 Die Datei Web.config | 1899 |
39.3.7 Masterpages (master-Dateien) | 1902 |
39.3.8 Sitemap (Web.sitemap) | 1902 |
39.3.9 Benutzersteuerelemente (ascx-Dateien) | 1903 |
39.3.10 Die Web-Projekt-Verzeichnisse | 1903 |
39.4 Lernen am Beispiel | 1904 |
39.4.1 Erstellen des Projekts | 1904 |
39.4.2 Oberflächengestaltung | 1905 |
Formular-Titel setzen | 1906 |
39.4.3 Ereignisprogrammierung | 1906 |
39.4.4 Ein Fehler, was nun? | 1908 |
Einfache Fehlerbehandlung | 1909 |
39.4.5 Ereignisse von Textboxen | 1909 |
39.4.6 Ein gemeinsamer Ereignis-Handler | 1910 |
39.4.7 Eingabefokus setzen | 1910 |
39.4.8 Ausgaben in einer Tabelle | 1911 |
39.4.9 Scrollen der Anzeige | 1913 |
39.4.10 Zusammenspiel mehrerer Formulare | 1914 |
Globale Variablen? | 1914 |
Das Page_Load-Ereignis | 1914 |
39.4.11 Umleiten bei Direktaufruf | 1915 |
39.4.12 Ärger mit den Cookies | 1916 |
39.4.13 Export auf den IIS | 1918 |
39.5 Tipps & Tricks | 1919 |
39.5.1 Nachinstallieren IIS 7 bzw. 7.5 (Windows 7) | 1919 |
Nachinstallieren | 1919 |
ASP.NET registrieren | 1920 |
39.5.2 Nachinstallieren IIS8 (Windows 8) | 1920 |
40 Übersicht ASP.NET-Controls | 1922 |
40.1 Einfache Steuerelemente im Überblick | 1922 |
40.1.1 Label | 1922 |
AccessKey/AssociatedControlID | 1923 |
Datenbindung | 1923 |
40.1.2 TextBox | 1924 |
40.1.3 Button, ImageButton, LinkButton | 1925 |
Click-Ereignis | 1925 |
OnClientClick-Eigenschaft | 1925 |
PostbackUrl-Eigenschaft | 1926 |
40.1.4 CheckBox, RadioButton | 1926 |
40.1.5 CheckBoxList, BulletList, RadioButtonList | 1927 |
Datenbindung | 1927 |
BulletList | 1928 |
40.1.6 Table | 1928 |
40.1.7 Hyperlink | 1930 |
40.1.8 Image, ImageMap | 1930 |
40.1.9 Calendar | 1932 |
40.1.10 Panel | 1933 |
40.1.11 HiddenField | 1933 |
40.1.12 Substitution | 1934 |
40.1.13 XML | 1935 |
Die XML-Daten | 1935 |
Die Transformationsdateien | 1936 |
Verwendung und Test | 1937 |
40.1.14 FileUpload | 1937 |
40.1.15 AdRotator | 1938 |
40.2 Steuerelemente für die Seitennavigation | 1939 |
40.2.1 Mehr Übersicht mit Web.Sitemap | 1939 |
40.2.2 Menu | 1941 |
Datenbindung an eine SiteMap | 1942 |
Menü ohne Datenbindung | 1943 |
40.2.3 TreeView | 1944 |
TreeView ohne Datenbindung | 1945 |
40.2.4 SiteMapPath | 1947 |
40.2.5 MultiView, View | 1948 |
40.2.6 Wizard | 1949 |
40.3 Webseitenlayout/-design | 1951 |
40.3.1 Masterpages | 1951 |
Masterpage | 1952 |
Content Seiten | 1953 |
40.3.2 Themes/Skins | 1954 |
Zuweisen des aktiven Theme | 1955 |
Skin-Datei | 1955 |
StyleSheet | 1956 |
Grafiken | 1956 |
40.3.3 Webparts | 1957 |
40.4 Die Validator-Controls | 1958 |
40.4.1 Übersicht | 1958 |
40.4.2 Wo findet die Fehlerprüfung statt? | 1959 |
40.4.3 Verwendung | 1959 |
40.4.4 RequiredFieldValidator | 1960 |
40.4.5 CompareValidator | 1961 |
40.4.6 RangeValidator | 1963 |
40.4.7 RegularExpressionValidator | 1963 |
40.4.8 CustomValidator | 1964 |
Clientseitige Validierung | 1965 |
Serverseitige Validierung | 1965 |
40.4.9 ValidationSummary | 1967 |
40.4.10 Weitere Möglichkeiten | 1968 |
Validierung zeitweise verhindern | 1968 |
ValidationGroup bilden | 1968 |
Eingabefokus setzen | 1968 |
40.5 Praxisbeispiele | 1968 |
40.5.1 Themes und Skins verstehen | 1968 |
Oberfläche | 1969 |
Projekt | 1969 |
Skin bearbeiten | 1970 |
Style Sheet bearbeiten | 1970 |
Quelltext | 1971 |
Test | 1972 |
40.5.2 Masterpages verwenden | 1973 |
Oberfläche (Masterpage) | 1973 |
Oberfläche (Contentpage) | 1974 |
Quelltext | 1974 |
Test | 1975 |
40.5.3 Webparts verwenden | 1976 |
Vorbereiten der Portalseite | 1976 |
User Control programmieren | 1976 |
Inhalte für die Webzones definieren | 1977 |
Programmieren des Werkzeugkastens | 1978 |
41 Datenbindung unter ASP.NET | 1982 |
41.1 Einstiegsbeispiel | 1982 |
41.1.1 Erstellen der ASP.NET-Website | 1982 |
Datenbank hinzufügen | 1983 |
GridView hinzufügen | 1984 |
GridView an Datenquelle anbinden | 1984 |
Test | 1986 |
41.2 Einführung | 1987 |
41.2.1 Konzept | 1987 |
41.2.2 Übersicht über die DataSource-Steuerelemente | 1988 |
41.3 SQLDataSource | 1989 |
41.3.1 Datenauswahl mit Parametern | 1991 |
41.3.2 Parameter für INSERT, UPDATE und DELETE | 1992 |
41.3.3 Methoden | 1994 |
41.3.4 Caching | 1995 |
41.3.5 Aktualisieren/Refresh | 1996 |
41.4 AccessDataSource | 1996 |
41.5 ObjectDataSource | 1996 |
41.5.1 Verbindung zwischen Objekt und DataSource | 1996 |
41.5.2 Ein Beispiel sorgt für Klarheit | 1998 |
41.5.3 Geschäftsobjekte in einer Session verwalten | 2002 |
41.6 SitemapDataSource | 2004 |
41.7 LinqDataSource | 2005 |
41.7.1 Bindung von einfachen Collections | 2005 |
41.7.2 Bindung eines LINQ to SQL-DataContext | 2006 |
41.8 EntityDataSource | 2008 |
41.8.1 Entity Data Model erstellen | 2008 |
41.8.2 EntityDataSource anbinden | 2011 |
41.8.3 Datenmenge filtern | 2014 |
41.9 XmlDataSource | 2014 |
41.10 QueryExtender | 2016 |
41.10.1 Grundlagen | 2016 |
41.10.2 Suchen | 2017 |
41.10.3 Sortieren | 2019 |
41.11 GridView | 2020 |
41.11.1 Auswahlfunktion (Zeilenauswahl) | 2020 |
41.11.2 Auswahl mit mehrspaltigem Index | 2021 |
41.11.3 Hyperlink-Spalte für Detailansicht | 2021 |
41.11.4 Spalten erzeugen | 2022 |
41.11.5 Paging realisieren | 2023 |
41.11.6 Edit, Update, Delete | 2025 |
41.11.7 Keine Daten, was tun? | 2025 |
41.12 DetailsView | 2025 |
41.13 FormView | 2027 |
Datenbindung im Detail | 2029 |
41.14 DataList | 2030 |
41.14.1 Bearbeitungsfunktionen implementieren | 2031 |
41.14.2 Layout verändern | 2032 |
41.15 Repeater | 2033 |
41.16 ListView | 2034 |
41.17 Typisierte Datenbindung | 2034 |
41.18 Model Binding | 2035 |
41.19 Chart | 2037 |
42 ASP.NET-Objekte/-Techniken | 2040 |
42.1 Wichtige ASP.NET-Objekte | 2040 |
42.1.1 HTTPApplication | 2040 |
42.1.2 Application | 2043 |
42.1.3 Session | 2044 |
Session-Variablen | 2044 |
Beenden einer Session | 2045 |
Ereignisse | 2045 |
42.1.4 Page | 2046 |
Eigenschaften | 2046 |
Methoden | 2047 |
Ereignisse | 2048 |
42.1.5 Request | 2049 |
Informationen über den Browser ermitteln | 2049 |
QueryString-Parameter auslesen | 2051 |
42.1.6 Response | 2052 |
Eigenschaften | 2052 |
Methoden | 2052 |
Textausgabe | 2053 |
Bilder/Dateien zum Client senden | 2053 |
Dynamisch erzeugte Grafiken senden | 2054 |
Neue Seiten aufrufen | 2055 |
Wir geben zur Protokoll ... | 2056 |
42.1.7 Server | 2056 |
MapPath | 2056 |
MachineName | 2057 |
Transfer | 2057 |
Execute | 2057 |
42.1.8 Cookies verwenden | 2057 |
User | 2060 |
42.2 Fehlerbehandlung unter ASP.NET | 2060 |
42.2.1 Fehler beim Entwurf | 2060 |
42.2.2 Laufzeitfehler | 2060 |
42.2.3 Eine eigene Fehlerseite | 2062 |
42.2.4 Fehlerbehandlung im Web Form | 2063 |
42.2.5 Fehlerbehandlung in der Anwendung | 2064 |
42.2.6 Alternative Fehlerseite einblenden | 2065 |
42.2.7 Lokale Fehlerbehandlung | 2066 |
42.2.8 Seite nicht gefunden – was nun? | 2067 |
42.3 E-Mail-Versand in ASP.NET | 2067 |
42.3.1 Übersicht | 2068 |
42.3.2 Mail-Server bestimmen | 2068 |
42.3.3 Einfache Text-E-Mails versenden | 2070 |
Variante 1 | 2070 |
Variante 2 | 2070 |
42.3.4 E-Mails mit Dateianhang | 2071 |
42.4 Sicherheit von Webanwendungen | 2072 |
42.4.1 Authentication | 2072 |
Anonyme Anmeldung | 2072 |
Forms Authentication | 2073 |
Windows Authentication | 2073 |
42.4.2 Forms Authentication realisieren | 2073 |
Login-Dialog | 2074 |
Die Änderungen in der Web.config | 2075 |
Test | 2076 |
Weitere Möglichkeiten der Authentifizierung | 2077 |
42.4.3 Impersonation | 2077 |
42.4.4 Authorization | 2078 |
File Authorization | 2078 |
URL Authorization | 2078 |
42.4.5 Administrieren der Website | 2080 |
Voraussetzung | 2080 |
ASP.NET-Konfigurationsoberfläche | 2081 |
Auswahl des Authentifizierungstyps | 2082 |
Neuen Nutzer erstellen | 2082 |
Rechte einschränken | 2083 |
42.4.6 Steuerelemente für das Login-Handling | 2084 |
Login | 2084 |
LoginStatus | 2085 |
LoginName | 2085 |
LoginView | 2085 |
PasswortRecovery | 2086 |
CreateUserWizard | 2087 |
ChangePasswort | 2088 |
42.4.7 Programmieren der Sicherheitseinstellungen | 2088 |
42.5 AJAX in ASP.NET-Anwendungen | 2090 |
42.5.1 Was ist AJAX und was kann es? | 2090 |
42.5.2 Die AJAX-Controls | 2091 |
ScriptManager | 2092 |
UpdatePanel | 2092 |
UpdateProgress | 2094 |
Timer | 2094 |
42.5.3 AJAX-Control-Toolkit | 2095 |
42.6 User Controls/Webbenutzersteuerelemente | 2096 |
User Controls | 2096 |
Custom Controls | 2096 |
42.6.1 Ein simples Einstiegsbeispiel | 2097 |
Entwurf | 2097 |
Quellcode | 2098 |
Einbindung | 2099 |
Test | 2099 |
Eigene Eigenschaften definieren | 2099 |
Fazit | 2100 |
42.6.2 Dynamische Grafiken im User Control anzeigen | 2100 |
Dynamisches Senden der Grafik | 2101 |
Entwurf des Controls | 2101 |
Verwendung und Test | 2103 |
42.6.3 Grafikausgaben per User Control realisieren | 2105 |
Das User Control | 2105 |
Einbindung/Programmierung | 2106 |
Test | 2107 |
43 Silverlight-Entwicklung | 2110 |
43.1 Einführung | 2110 |
43.1.1 Zielplattformen | 2111 |
43.1.2 Silverlight-Applikationstypen | 2111 |
Silverlight-Anwendung | 2112 |
Silverlight-Navigationsanwendung | 2112 |
Silverlight Out-of-Browser-Anwendung | 2113 |
43.1.3 Wichtige Unterschiede zu den WPF-Anwendungen | 2113 |
Einschränkungen durch das Silverlight-Konzept | 2113 |
Unterschiede durch unterschiedliche Codebasis | 2114 |
43.1.4 Vor- und Nachteile von Silverlight-Anwendungen | 2115 |
WPF-ClickOnce-Anwendungen | 2115 |
ASP.NET/AJAX | 2115 |
FLASH | 2116 |
Fazit | 2116 |
Updates/Deinstallation | 2118 |
43.2 Die Silverlight-Anwendung im Detail | 2118 |
43.2.1 Ein kleines Beispielprojekt | 2119 |
43.2.2 Das Application Package und das Test-Web | 2121 |
.xap-Package | 2121 |
Silverlight.js | 2121 |
...TestPage.aspx & ...TestPage.html | 2122 |
43.3 Die Projektdateien im Überblick | 2124 |
43.3.1 Projektverwaltung mit App.xaml & App.xaml.cs | 2125 |
Startup | 2126 |
Exit | 2127 |
UnhandledException | 2127 |
Weitere Eigenschaften und Methoden der Application-Klasse | 2127 |
43.3.2 MainPage.xaml & MainPage.xaml.cs | 2127 |
43.3.3 AssemblyInfo.cs | 2128 |
43.4 Fenster und Seiten in Silverlight | 2128 |
43.4.1 Das Standardfenster | 2129 |
43.4.2 Untergeordnete Silverlight-Fenster | 2130 |
43.4.3 UserControls für die Anzeige von Detaildaten | 2132 |
Ein-/Ausblenden von UserControls | 2132 |
Hinzufügen/Entfernen von UserControls | 2132 |
43.4.4 Echte Windows | 2133 |
43.4.5 Navigieren in Silverlight-Anwendungen | 2134 |
Projekt erzeugen | 2134 |
Die Page-Klasse | 2135 |
Der Navigations-Frame | 2137 |
43.5 Datenbanken/Datenbindung | 2139 |
43.5.1 ASP.NET-Webdienste/WCF-Dienste | 2140 |
Einfügen der SQL Server-Datenbank | 2140 |
Erstellen des EDM-Datenmodells | 2141 |
Erstellen des ASP.NET Webdienstes | 2142 |
Alternative: Erstellen eines WCF Dienstes | 2144 |
Einbinden der Dienste in das Silverlight-Projekt | 2145 |
Konfigurieren der Silverlight-Oberfläche | 2146 |
Abrufen der Daten | 2147 |
Zusammenfassung | 2148 |
43.5.2 WCF Data Services | 2149 |
Grundlagen | 2149 |
Einfügen der SQL Server-Datenbank | 2152 |
Erstellen des Entity Data Models | 2152 |
Erstellen des WCF Data Service | 2153 |
Einbinden des WCF Data Service in das Silverlight-Projekt | 2155 |
Konfigurieren der Silverlight-Oberfläche | 2155 |
Abrufen der Daten | 2156 |
Bearbeiten der Daten | 2157 |
Arbeiten mit LINQ und Erweiterungsmethoden | 2158 |
43.6 Isolierter Speicher | 2160 |
43.6.1 Grundkonzept | 2160 |
43.6.2 Das virtuelle Dateisystem verwalten | 2161 |
Wieviel Platz ist verfügbar? | 2161 |
Ich will mehr! | 2162 |
Unterverzeichnisse erzeugen | 2162 |
Anzeige von Dateien und Verzeichnissen | 2162 |
Dateien/Verzeichnisse löschen | 2163 |
43.6.3 Arbeiten mit Dateien | 2164 |
Schreiben | 2164 |
Lesen von Dateien | 2164 |
43.7 Fulltrust-Anwendungen | 2165 |
43.8 Praxisbeispiele | 2168 |
43.8.1 Eine Out-of-Browser-Applikation realisieren | 2168 |
Vorgehensweise | 2168 |
Installation | 2170 |
Bemerkungen | 2171 |
43.8.2 Out-of-Browser-Anwendung aktualisieren | 2172 |
Quellcode | 2172 |
43.8.3 Testen auf aktive Internetverbindung | 2173 |
Quellcode | 2173 |
43.8.4 Auf Out-of-Browser-Anwendung testen | 2174 |
Quellcode | 2174 |
43.8.5 Den Browser bestimmen | 2174 |
Quellcode | 2174 |
Test | 2175 |
43.8.6 Parameter an das Plug-in übergeben | 2175 |
Oberfläche | 2175 |
Quellcode (MainPage.xaml.cs) | 2175 |
Quellcode (App.xaml.cs) | 2176 |
Quellcode der umgebenden HTML-Seite | 2176 |
Test | 2177 |
43.8.7 Auf den QueryString zugreifen | 2177 |
Oberfläche | 2177 |
Quellcode | 2177 |
Test | 2178 |
43.8.8 Timer in Silverlight nutzen | 2178 |
Oberfläche | 2178 |
Quellcode | 2178 |
Test | 2179 |
43.8.9 Dateien lokal speichern | 2179 |
Oberfläche | 2179 |
Quellcode | 2180 |
Bemerkung | 2180 |
43.8.10 Drag & Drop realisieren | 2181 |
Oberfläche | 2181 |
Quelltext | 2181 |
Test | 2182 |
43.8.11 Auf die Zwischenablage zugreifen | 2182 |
Oberfläche | 2182 |
Quelltext | 2183 |
Test | 2183 |
43.8.12 Weitere Fenster öffnen | 2184 |
Oberfläche (MainPage) | 2184 |
Quellcode (MainPage.xaml.cs) | 2185 |
Oberfläche (SilverlightControl1) | 2186 |
Quellcode (SilverlightControl1.xaml.cs) | 2186 |
Test | 2186 |
Bemerkungen | 2186 |
Index | 2188 |