Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
1.1 Warum .NET?
1.1.1 Ein paar Worte zu diesem Buch
1.1.2 Die Beispielprogramme
1.2 .NET unter die Lupe genommen
1.2.1 Das Entwicklerdilemma
1.2.2 .NET – Ein paar allgemeine Eigenschaften
1.2.3 Das Sprachenkonzept
1.2.4 Die »Common Language Specification« (CLS)
1.2.5 Das »Common Type System« (CTS)
1.2.6 Das .NET Framework
1.2.7 Die »Common Language Runtime« (CLR)
1.2.8 Die .NET-Klassenbibliothek
1.2.9 Das Konzept der Namespaces
1.3 Assemblys
1.3.1 Die Metadaten
1.3.2 Das Manifest
1.4 Die Entwicklungsumgebung
1.4.1 Editionen von Visual Studio 2012
1.4.2 Hard- und Softwareanforderungen
1.4.3 Die Installation
1.4.4 Die Entwicklungsumgebung von Visual Studio 2012
2 Grundlagen der Sprache C#
2.1 Konsolenanwendungen
2.1.1 Allgemeine Anmerkungen
2.1.2 Ein erstes Konsolenprogramm
2.2 Grundlagen der C#-Syntax
2.2.1 Kennzeichnen, dass eine Anweisung abgeschlossen ist
2.2.2 Anweisungs- und Gliederungsblöcke
2.2.3 Kommentare
2.2.4 Die Groß- und Kleinschreibung
2.2.5 Die Struktur einer Konsolenanwendung
2.3 Variablen und Datentypen
2.3.1 Variablendeklaration
2.3.2 Der Variablenbezeichner
2.3.3 Der Zugriff auf eine Variable
2.3.4 Ein- und Ausgabemethoden der Klasse »Console«
2.3.5 Die einfachen Datentypen
2.3.6 Typkonvertierung
2.4 Operatoren
2.4.1 Arithmetische Operatoren
2.4.2 Vergleichsoperatoren
2.4.3 Logische Operatoren
2.4.4 Bitweise Operatoren
2.4.5 Zuweisungsoperatoren
2.4.6 Stringverkettung
2.4.7 Sonstige Operatoren
2.4.8 Operator-Vorrangregeln
2.5 Datenfelder (Arrays)
2.5.1 Die Deklaration und Initialisierung eines Arrays
2.5.2 Der Zugriff auf die Array-Elemente
2.5.3 Mehrdimensionale Arrays
2.5.4 Festlegen der Array-Größe zur Laufzeit
2.5.5 Bestimmung der Array-Obergrenze
2.5.6 Die Gesamtanzahl der Array-Elemente
2.5.7 Verzweigte Arrays
2.6 Kontrollstrukturen
2.6.1 Die »if«-Anweisung
2.6.2 Das »switch«-Statement
2.7 Programmschleifen
2.7.1 Die »for«-Schleife
2.7.2 Die »foreach«-Schleife
2.7.3 Die »do«- und die »while«-Schleife
3 Das Klassendesign
3.1 Einführung in die Objektorientierung
3.2 Die Klassendefinition
3.2.1 Klassen im Visual Studio anlegen
3.2.2 Das Projekt »GeometricObjectsSolution«
3.2.3 Die Deklaration von Objektvariablen
3.2.4 Zugriffsmodifizierer einer Klasse
3.2.5 Splitten einer Klassendefinition mit »partial«
3.2.6 Arbeiten mit Objektreferenzen
3.3 Referenz- und Wertetypen
3.3.1 Werte- und Referenztypen nutzen
3.4 Die Eigenschaften eines Objekts
3.4.1 Öffentliche Felder
3.4.2 Datenkapselung mit Eigenschaftsmethoden sicherstellen
3.4.3 Die Ergänzung der Klasse »Circle«
3.4.4 Lese- und schreibgeschützte Eigenschaften
3.4.5 Sichtbarkeit der Accessoren »get« und »set«
3.4.6 Unterstützung von Visual Studio 2012
3.4.7 Automatisch implementierte Eigenschaften
3.5 Methoden eines Objekts
3.5.1 Methoden mit Rückgabewert
3.5.2 Methoden ohne Rückgabewert
3.5.3 Methoden mit Parameterliste
3.5.4 Methodenüberladung
3.5.5 Variablen innerhalb einer Methode (lokale Variablen)
3.5.6 Referenz- und Wertparameter
3.5.7 Besondere Aspekte einer Parameterliste
3.5.8 Zugriff auf private Daten
3.5.9 Die Trennung von Daten und Code
3.5.10 Namenskonflikte mit »this« lösen
3.5.11 Methode oder Eigenschaft?
3.5.12 Umbenennen von Methoden und Eigenschaften
3.6 Konstruktoren
3.6.1 Konstruktoren bereitstellen
3.6.2 Die Konstruktoraufrufe
3.6.3 Definition von Konstruktoren
3.6.4 »public«- und »internal«-Konstruktoren
3.6.5 »private«-Konstruktoren
3.6.6 Konstruktorenaufrufe umleiten
3.6.7 Vereinfachte Objektinitialisierung
3.7 Der Destruktor
3.8 Konstanten in einer Klasse
3.8.1 Konstanten mit dem Schlüsselwort »const«
3.8.2 Schreibgeschützte Felder mit »readonly«
3.9 Statische Klassenkomponenten
3.9.1 Statische Eigenschaften
3.9.2 Statische Methoden
3.9.3 Statische Klasseninitialisierer
3.9.4 Statische Klassen
3.9.5 Statische Klasse oder Singleton-Pattern?
3.10 Namensräume (Namespaces)
3.10.1 Zugriff auf Namespaces
3.10.2 Die »using«-Direktive
3.10.3 Globaler Namespace
3.10.4 Vermeiden von Mehrdeutigkeiten
3.10.5 Namespaces festlegen
3.10.6 Der »::«-Operator
3.10.7 Unterstützung von Visual Studio 2012 bei den Namespaces
3.11 Stand der Klasse »Circle«
4 Vererbung, Polymorphie und Interfaces
4.1 Die Vererbung
4.1.1 Basisklassen und abgeleitete Klassen
4.1.2 Die Ableitung einer Klasse
4.1.3 Klassen, die nicht abgeleitet werden können
4.1.4 Konstruktoren in abgeleiteten Klassen
4.1.5 Der Zugriffsmodifizierer »protected«
4.1.6 Die Konstruktorverkettung in der Vererbung
4.2 Der Problemfall geerbter Methoden
4.2.1 Geerbte Methoden mit »new« verdecken
4.2.2 Abstrakte Methoden
4.2.3 Virtuelle Methoden
4.3 Typumwandlung und Typuntersuchung von Objektvariablen
4.3.1 Die implizite Typumwandlung von Objektreferenzen
4.3.2 Die explizite Typumwandlung von Objektreferenzen
4.3.3 Typuntersuchung mit dem »is«-Operator
4.3.4 Typumwandlung mit dem »as«-Operator
4.4 Polymorphie
4.4.1 Die »klassische« Methodenimplementierung
4.4.2 Abstrakte Methoden
4.4.3 Virtuelle Methoden
4.5 Weitere Gesichtspunkte der Vererbung
4.5.1 Versiegelte Methoden
4.5.2 Überladen einer Basisklassenmethode
4.5.3 Statische Member und Vererbung
4.5.4 Geerbte Methoden ausblenden?
4.6 Das Projekt »GeometricObjectsSolution« ergänzen
4.6.1 Die Klasse »GeometricObject«
4.7 Eingebettete Klassen (Nested Classes)
4.8 Interfaces (Schnittstellen)
4.8.1 Einführung in die Schnittstellen
4.8.2 Die Schnittstellendefinition
4.8.3 Die Schnittstellenimplementierung
4.8.4 Die Interpretation der Schnittstellen
4.8.5 Änderungen am Projekt »GeometricObjects«
4.9 Das Zerstören von Objekten – der »Garbage Collector«
4.9.1 Die Arbeitsweise des Garbage Collectors
4.9.2 Expliziter Aufruf des Garbage Collectors
4.9.3 Der Destruktor
4.9.4 Die »IDisposable«-Schnittstelle
4.9.5 Die Ergänzungen in den Klassen »Circle« und »Rectangle«
5 Delegates und Ereignisse
5.1 Delegates
5.1.1 Einführung in das Prinzip der Delegates
5.1.2 Verwendung von Delegates
5.1.3 Vereinfachter Delegatenaufruf
5.1.4 Multicast-Delegates
5.1.5 Anonyme Methoden
5.1.6 Kovarianz und Kontravarianz mit Delegaten
5.2 Ereignisse eines Objekts
5.2.1 Ereignisse bereitstellen
5.2.2 Die Reaktion auf ein ausgelöstes Ereignis
5.2.3 Allgemeine Betrachtungen der Ereignishandler-Registrierung
5.2.4 Wenn der Ereignisempfänger ein Ereignis nicht behandelt
5.2.5 Ereignisse mit Übergabeparameter
5.2.6 Ereignisse in der Vererbung
5.2.7 Hinter die Kulissen des Schlüsselworts »event« geblickt
5.2.8 Die Schnittstelle »INotifyPropertyChanged«
5.3 Änderungen im Projekt »GeometricObjects«
5.3.1 Überarbeitung des Events »InvalidMeasure«
5.3.2 Weitere Ereignisse
6 Strukturen und Enumerationen
6.1 Strukturen – eine Sonderform der Klassen
6.1.1 Die Definition einer Struktur
6.1.2 Initialisieren einer Strukturvariablen
6.1.3 Konstruktoren in Strukturen
6.1.4 Änderung im Projekt »GeometricObjects«
6.2 Enumerationen (Aufzählungen)
6.2.1 Wertzuweisung an enum-Mitglieder
6.2.2 Alle Mitglieder einer Aufzählung durchlaufen
6.3 Boxing und Unboxing
7 Fehlerbehandlung und Debugging
7.1 Laufzeitfehler behandeln
7.1.1 Laufzeitfehler erkennen
7.1.2 Die »try...catch«-Anweisung
7.1.3 Behandlung mehrerer Exceptions
7.1.4 Die Reihenfolge der »catch«-Zweige
7.1.5 Ausnahmen in einer Methodenaufrufkette
7.1.6 Ausnahmen werfen oder weiterleiten
7.1.7 Die »finally«-Anweisung
7.1.8 Die Klasse »Exception«
7.1.9 Benutzerdefinierte Ausnahmen
7.2 Debuggen mit Programmcode
7.2.1 Einführung
7.2.2 Die Klasse »Debug«
7.2.3 Die Klasse »Trace«
7.2.4 Bedingte Kompilierung
7.3 Fehlersuche mit Visual Studio 2012
7.3.1 Debuggen im Haltemodus
7.3.2 Das »Direktfenster«
7.3.3 Weitere Alternativen, um Variableninhalte zu prüfen
8 Auflistungsklassen (Collections)
8.1 Grundlagen
8.2 Collections im Namespace »System.Collections«
8.2.1 Die elementaren Schnittstellen der Auflistungsklassen
8.3 Die Klasse »ArrayList«
8.3.1 Einträge hinzufügen
8.3.2 Datenaustausch zwischen einem Array und einer »ArrayList«
8.3.3 Die Elemente einer »ArrayList« sortieren
8.3.4 Sortieren von Arrays mit »ArrayList.Adapter«
8.4 Die Klasse »Hashtable«
8.4.1 Methoden und Eigenschaften der Schnittstelle »IDictionary«
8.4.2 Beispielprogramm zur Klasse »Hashtable«
8.5 Die Klassen »Queue« und »Stack«
8.5.1 Die Klasse »Stack«
8.5.2 Die Klasse »Queue«
8.6 Eigene Auflistungen mit »yield« durchlaufen
9 Generics – Generische Datentypen
9.1 Problembeschreibung
9.2 Bereitstellen einer generischen Klasse
9.2.1 Mehrere generische Typparameter
9.2.2 Vorteile der Generics
9.3 Bedingungen (Constraints) festlegen
9.3.1 Constraints mit der »where«-Klausel
9.3.2 Typparameter auf Klassen oder Strukturen beschränken
9.3.3 Mehrere Constraints definieren
9.3.4 Der Konstruktor-Constraint »new()«
9.3.5 Das Schlüsselwort »default«
9.4 Generische Methoden
9.4.1 Methoden und Constraints
9.5 Generics und Vererbung
9.5.1 Virtuelle generische Methoden
9.6 Konvertierung von Generics
9.7 Generische Delegates
9.7.1 Generische Delegates und Constraints
9.7.2 Anpassung des Beispiels »GeometricObjects«
9.8 Nullable-Typen
9.8.1 Konvertierungen mit Nullable-Typen
9.9 Generische Collections
9.9.1 Die Interfaces der generischen Auflistungsklassen
9.9.2 Die generische Auflistungsklasse »List<T>«
9.9.3 Vergleiche mit Hilfe des Delegaten »Comparison<T>«
9.10 Kovarianz und Kontravarianz generischer Typen
9.10.1 Kovarianz mit Interfaces
9.10.2 Kontravarianz mit Interfaces
9.10.3 Zusammenfassung
9.10.4 Generische Delegaten mit varianten Typparametern
10 Weitere C#-Sprachfeatures
10.1 Implizit typisierte Variablen
10.2 Anonyme Typen
10.3 Lambda-Ausdrücke
10.3.1 Projektion und Prädikat
10.4 Erweiterungsmethoden
10.5 Partielle Methoden
10.5.1 Wo partielle Methoden eingesetzt werden
10.6 Operatorüberladung
10.6.1 Einführung
10.6.2 Die Syntax der Operatorüberladung
10.6.3 Die Operatorüberladungen im Projekt »GeometricObjectsSolution«
10.6.4 Die Operatoren »true« und »false« überladen
10.6.5 Benutzerdefinierte Konvertierungen
10.7 Indexer
10.7.1 Überladen von Indexern
10.7.2 Parameterbehaftete Eigenschaften
10.8 Attribute
10.8.1 Das »Flags«-Attribut
10.8.2 Benutzerdefinierte Attribute
10.8.3 Attribute auswerten
10.8.4 Festlegen der Assembly-Eigenschaften in »Assembly-Info.cs«
10.9 Dynamisches Binden
10.9.1 Eine kurze Analyse
10.9.2 Dynamische Objekte
10.10 Unsicherer (unsafe) Programmcode – Zeigertechnik in C#
10.10.1 Einführung
10.10.2 Das Schlüsselwort »unsafe«
10.10.3 Die Deklaration von Zeigern
10.10.4 Die »fixed«-Anweisung
10.10.5 Zeigerarithmetik
10.10.6 Der Operator »->«
11 LINQ
11.1 Was ist LINQ?
11.1.1 Verzögerte Ausführung
11.1.2 LINQ-Erweiterungsmethoden an einem Beispiel
11.2 LINQ to Objects
11.2.1 Musterdaten
11.2.2 Die allgemeine LINQ-Syntax
11.3 Die Abfrageoperatoren
11.3.1 Übersicht der Abfrageoperatoren
11.3.2 Die »from«-Klausel
11.3.3 Mit »where« filtern
11.3.4 Die Projektionsoperatoren
11.3.5 Die Sortieroperatoren
11.3.6 Gruppieren mit »GroupBy«
11.3.7 Verknüpfungen mit »Join«
11.3.8 Die Set-Operatoren-Familie
11.3.9 Die Familie der Aggregatoperatoren
11.3.10 Quantifizierungsoperatoren
11.3.11 Aufteilungsoperatoren
11.3.12 Die Elementoperatoren
11.3.13 Die Konvertierungsoperatoren
12 Arbeiten mit Dateien und Streams
12.1 Einführung
12.2 Namespaces der Ein- bzw. Ausgabe
12.2.1 Das Behandeln von Ausnahmen bei E/A-Operationen
12.3 Laufwerke, Verzeichnisse und Dateien
12.3.1 Die Klasse »File«
12.3.2 Die Klasse »FileInfo«
12.3.3 Die Klassen »Directory« und »DirectoryInfo«
12.3.4 Die Klasse »Path«
12.3.5 Die Klasse »DriveInfo«
12.4 Die »Stream«-Klassen
12.4.1 Die abstrakte Klasse »Stream«
12.4.2 Die von »Stream« abgeleiteten Klassen im Überblick
12.4.3 Die Klasse »FileStream«
12.5 Die Klassen »TextReader« und »TextWriter«
12.5.1 Die Klasse »StreamWriter«
12.5.2 Die Klasse »StreamReader«
12.6 Die Klassen »BinaryReader« und »BinaryWriter«
12.6.1 Komplexe binäre Dateien
13 Binäre Serialisierung
13.1 Einführung in die Serialisierung
13.1.1 Serialisierungsverfahren
13.2 Serialisierung mit »BinaryFormatter«
13.2.1 Die Deserialisierung
13.2.2 Serialisierung mehrerer Objekte
14 XML
14.1 Grundlagen
14.2 XML-Dokumente
14.2.1 Wohlgeformte und gültige XML-Dokumente
14.2.2 Die Regeln eines wohlgeformten XML-Codes
14.2.3 Kommentare
14.2.4 Verarbeitungsanweisungen
14.2.5 Reservierte Zeichen in XML
14.2.6 CDATA-Abschnitte
14.2.7 Namensräume (Namespaces)
14.3 Die Gültigkeit eines XML-Dokuments
14.3.1 XML Schema Definition (XSD)
14.3.2 Ein XML-Dokument mit einem XML-Schema verknüpfen
14.3.3 Die Struktur eines XML-Schemas
14.4 Die Klasse »XmlReader«
14.4.1 XML-Dokumente mit einem »XmlReader«-Objekt lesen
14.4.2 Validieren eines XML-Dokuments
14.5 Eigenschaften und Methoden der Klasse »XmlReader«
14.6 Die Klasse »XmlWriter«
14.6.1 Die Methoden der Klasse »XmlWriter«
14.7 Navigation durch XML (XPath)
14.7.1 Die Klasse »XPathNavigator«
14.7.2 XPath-Ausdrücke
14.7.3 Der Kontextknoten
14.7.4 Beispiele mit XPath-Ausdrücken
14.7.5 Knotenmengen mit der »Select«-Methode
14.7.6 Auswerten von XPath-Ausdrücken
14.8 Das Document Object Model (DOM)
14.8.1 Allgemeines
14.8.2 Arbeiten mit »XmlDocument«
14.8.3 »XmlDocument« und »XPathNavigator«
14.8.4 Die Klasse »XmlNode« (Operationen mit Knoten)
14.8.5 Manipulieren einer XML-Struktur
14.8.6 Ändern eines Knotens
14.8.7 Löschen in einem XML-Dokument
14.9 Serialisierung mit »XmlSerializer«
14.9.1 XML-Serialisierung mit Attributen steuern
14.10 LINQ to XML
14.10.1 Allgemeines
14.10.2 Die Klassenhierarchie von LINQ to XML
14.10.3 Die Klasse »XElement«
14.10.4 Die Klasse »XDocument«
14.10.5 Navigation im XML-Dokument
14.10.6 Änderungen am XML-Dokument vornehmen
15 Multithreading und die Task Parallel Library (TPL)
15.1 Überblick
15.2 Multithreading mit der Klasse »Thread«
15.2.1 Einführung in das Multithreading
15.2.2 Threadzustände und Prioritäten
15.2.3 Zusammenspiel mehrerer Threads
15.2.4 Die Entwicklung einer einfachen Multithreading-Anwendung
15.2.5 Die Klasse »Thread«
15.2.6 Threadpools nutzen
15.2.7 Die Synchronisation von Threads
15.2.8 Der »Monitor« zur Synchronisation
15.2.9 Das Attribut »MethodImpl«
15.2.10 Das Synchronisationsobjekt »Mutex«
15.2.11 Grundlagen asynchroner Methodenaufrufe
15.2.12 Asynchroner Methodenaufruf
15.2.13 Asynchroner Aufruf mit Rückgabewerten
15.2.14 Eine Klasse mit asynchronen Methodenaufrufen
15.3 Die TPL (Task Parallel Library)
15.3.1 Allgemeines zur Parallelisierung mit der TPL
15.3.2 Die Klasse »Parallel«
15.3.3 Die Klasse »Task«
15.4 Asynchrone Programmierung mit »async« und »await«
16 Einige wichtige .NET-Klassen
16.1 Die Klasse »Object«
16.1.1 Referenzvergleiche mit »Equals« und »ReferenceEquals«
16.1.2 »ToString« und »GetType«
16.1.3 Die Methode »MemberwiseClone« und das Problem des Klonens
16.2 Die Klasse »String«
16.2.1 Das Erzeugen eines Strings
16.2.2 Die Eigenschaften von »String«
16.2.3 Die Methoden der Klasse »String«
16.2.4 Zusammenfassung der Klasse »String«
16.3 Die Klasse »StringBuilder«
16.3.1 Allgemeines
16.3.2 Die Kapazität eines »StringBuilder«-Objekts
16.3.3 Die Konstruktoren der Klasse »StringBuilder«
16.3.4 Die Eigenschaften der Klasse »StringBuilder«
16.3.5 Die Methoden der Klasse »StringBuilder«
16.3.6 Allgemeine Anmerkungen
16.4 Der Typ »DateTime«
16.4.1 Die Zeitspanne »Tick«
16.4.2 Die Konstruktoren von »DateTime«
16.4.3 Die Eigenschaften von »DateTime«
16.4.4 Die Methoden der Klasse »DateTime«
16.5 Die Klasse »TimeSpan«
16.6 Ausgabeformatierung
16.6.1 Formatierung mit der Methode »String.Format«
16.6.2 Formatierung mit der Methode »ToString«
16.6.3 Benutzerdefinierte Formatierung
17 Projektmanagement und Visual Studio 2012
17.1 Der Projekttyp »Klassenbibliothek«
17.1.1 Mehrere Projekte in einer Projektmappe verwalten
17.1.2 Die Zugriffsmodifizierer »public« und »internal«
17.1.3 Friend Assemblys
17.1.4 Einbinden einer Klassenbibliothek
17.2 Assemblys
17.2.1 Ein Überblick über das Konzept der Assemblys
17.2.2 Allgemeine Beschreibung privater und globaler Assemblys
17.2.3 Die Struktur einer Assembly
17.2.4 Globale Assemblys
17.3 Konfigurationsdateien
17.3.1 Die verschiedenen Konfigurationsdateien
17.3.2 Die Struktur einer Anwendungskonfigurationsdatei
17.3.3 Eine Anwendungskonfigurationsdatei mit Visual Studio 2012 bereitstellen
17.3.4 Einträge der Anwendungskonfigurationsdatei auswerten
17.3.5 Editierbare, anwendungsbezogene Einträge mit <appSettings>
17.4 Versionsumleitung in einer Konfigurationsdatei
17.4.1 Die Herausgeberrichtliniendatei
17.5 XML-Dokumentation
17.5.1 Das Prinzip der XML-Dokumentation
17.5.2 Die XML-Kommentartags
17.5.3 Generieren der XML-Dokumentationsdatei
17.6 Der Klassendesigner (Class Designer)
17.6.1 Ein typisches Klassendiagramm
17.6.2 Hinzufügen und Ansicht von Klassendiagrammen
17.6.3 Die Toolbox des Klassendesigners
17.6.4 Das Fenster »Klassendetails«
17.6.5 Klassendiagramme als Bilder exportieren
17.7 Refactoring
17.7.1 Methode extrahieren
17.7.2 Bezeichner umbenennen
17.7.3 Felder einkapseln
17.8 Code-Snippets (Codeausschnitte)
17.8.1 Codeausschnitte einfügen
17.8.2 Die Anatomie eines Codeausschnitts
17.9 »ClickOnce«-Verteilung
17.9.1 Allgemeine Beschreibung
17.9.2 Erstellen einer ClickOnce-Anwendung
17.9.3 Die Installation einer ClickOnce-Anwendung
18 Einführung in die WPF und XAML
18.1 Die Merkmale einer WPF-Anwendung
18.1.1 Anwendungstypen
18.1.2 Eine WPF-Anwendung und deren Dateien
18.1.3 Ein erstes WPF-Beispiel
18.1.4 Wichtige WPF-Features
18.1.5 Der logische und der visuelle Elementbaum
18.2 XAML (Extended Application Markup Language)
18.2.1 Die Struktur einer XAML-Datei
18.2.2 Eigenschaften eines XAML-Elements in Attributschreibweise festlegen
18.2.3 Eigenschaften im Eigenschaftsfenster festlegen
18.2.4 Die Eigenschaft-Element-Syntax
18.2.5 Inhaltseigenschaften
18.2.6 Typkonvertierung
18.2.7 Markup-Erweiterungen (Markup Extensions)
18.2.8 XML-Namespaces
18.2.9 XAML-Spracherweiterungen
19 WPF-Layout-Container
19.1 Die Container-Steuerelemente
19.1.1 Gemeinsame Eigenschaften der Layout-Container
19.1.2 Das »Canvas«
19.1.3 Das »StackPanel«
19.1.4 Das »WrapPanel«
19.1.5 Das »DockPanel«
19.1.6 Das »Grid«-Steuerelement
19.1.7 Das »UniformGrid«
19.2 Verschachteln der Layout-Container
20 Fenster in der WPF
20.1 Hosts der WPF
20.2 Fenster vom Typ »Window«
20.2.1 Mehrere Fenster in einer Anwendung
20.3 Fenster vom Typ »NavigationWindow«
20.3.1 Das »Page«-Element
20.4 Hosts vom Typ »Frame«
20.5 Navigation zwischen den Seiten
20.5.1 Navigation mit »HyperLink«
20.5.2 Der Verlauf der Navigation – das Journal
20.5.3 Navigation mit »NavigationService«
20.5.4 Navigation im Internet
20.5.5 Navigieren mit dem Ereignis »RequestNavigate« des »HyperLink«-Elements
20.6 Datenübergabe zwischen den Seiten
20.6.1 Datenübergabe mit der Methode »Navigate«
20.7 Nachrichtenfenster mit »MessageBox«
20.7.1 Die Methode »MessageBox.Show«
21 WPF-Steuerelemente
21.1 Die Hierarchie der WPF-Komponenten
21.2 Allgemeine Eigenschaften der WPF-Steuerelemente
21.2.1 Den Außenrand mit der Eigenschaft »Margin« festlegen
21.2.2 Den Innenrand mit der Eigenschaft »Padding« festlegen
21.2.3 Die Eigenschaft »Content«
21.2.4 Die Größe einer Komponente
21.2.5 Die Ausrichtung einer Komponente
21.2.6 Die Sichtbarkeit eines Steuerelements
21.2.7 Die Farbeinstellungen
21.2.8 Die Schriften
21.3 Die unterschiedlichen Schaltflächen
21.3.1 Die Basisklasse »ButtonBase«
21.3.2 Das Steuerelement »Button«
21.3.3 Das Steuerelement »ToggleButton«
21.3.4 Das Steuerelement »RepeatButton«
21.3.5 Das Steuerelement »Checkbox«
21.3.6 Das Steuerelement »RadioButton«
21.4 Einfache Eingabesteuerelemente
21.4.1 Das Steuerelement »Label«
21.4.2 Das Steuerelement »TextBox«
21.4.3 Das Steuerelement »PasswordBox«
21.4.4 Das Steuerelement »TextBlock«
21.5 WPF-Listenelemente
21.5.1 Das Steuerelement »ListBox«
21.5.2 Die »ComboBox«
21.5.3 Das Steuerelement »ListView«
21.5.4 Das Steuerelement »TreeView«
21.5.5 Das Steuerelement »TabControl«
21.5.6 Die Menüleiste
21.5.7 Das Kontextmenü
21.5.8 Symbolleisten
21.5.9 Die Statusleiste
21.6 Weitere Steuerelemente
21.6.1 Das Steuerelement »ToolTip«
21.6.2 Die »Progressbar«
21.6.3 Das Steuerelement »Slider«
21.6.4 Das »GroupBox«-Steuerelement
21.6.5 Das Steuerelement »ScrollViewer«
21.6.6 Das Steuerelement »Expander«
21.6.7 Das Steuerelement »Border«
21.6.8 Die »Image«-Komponente
21.6.9 »Calendar« und »DatePicker« zur Datumsangabe
21.6.10 Das Steuerelement »InkCanvas«
21.7 Das »Ribbon«-Steuerelement
21.7.1 Voraussetzungen für den Zugriff auf das »Ribbon«-Control
21.7.2 Ein kurzer Überblick
21.7.3 Der XAML-Code
21.8 FlowDocuments
21.8.1 Allgemeine Beschreibung eines FlowDocuments
21.8.2 Eigenschaften eines »FlowDocuments«
21.8.3 Die Blöcke eines »FlowDocuments«
21.8.4 Inline-Elemente
21.8.5 »FlowDocuments« mit Code erzeugen
21.8.6 Speichern und Laden eines »FlowDocuments«
21.9 Das Element »FlowDocumentViewer«
21.9.1 Das Anzeigeelement »FlowDocumentScrollViewer«
21.9.2 Das Anzeigeelement »FlowDocumentPageViewer«
21.9.3 Das Anzeigeelement »FlowDocumentReader«
21.10 XPS-Dokumente mit »DocumentViewer«
21.10.1 Allgemeines zum XPS-Format
21.10.2 Beispielprogramm
21.11 Das Steuerelement »RichTextBox«
22 Elementbindungen
22.1 Einführung in die Bindungstechnik
22.1.1 Ein einfaches Bindungsbeispiel
22.2 Die Klasse »Binding«
22.2.1 Die Bindungsrichtung festlegen
22.2.2 Aktualisierung der Bindung
22.2.3 Die Ereignisse »SourceUpdated« und »TargetUpdated«
22.2.4 Beenden einer Bindung
22.3 Bindungsalternativen
22.3.1 Die Eigenschaft »Source«
22.3.2 Anbindung an relative Datenquellen
22.3.3 Die Bindung an »DataContext«
23 Konzepte von WPF
23.1 Anwendungsspezifische Ressourcen
23.2 Anwendungsübergreifende Ressourcen
23.2.1 Mehrere Ressourcenwörterbücher
23.2.2 Die Suche nach einer Ressource
23.3 Logische Ressourcen
23.3.1 Statische Ressourcen
23.3.2 Dynamische Ressourcen
23.3.3 Ressourcen mit C#-Code bearbeiten
23.3.4 Abrufen von Systemressourcen
23.4 Styles
23.4.1 Einfache Styles
23.4.2 Typisierte Styles
23.4.3 Erweitern von Styles
23.4.4 EventSetter
23.5 Trigger
23.5.1 Eigenschaftstrigger
23.5.2 Datentrigger
23.5.3 Ereignistrigger
23.6 Templates
23.6.1 Allgemeines zu »ControlTemplates«
23.6.2 Definition innerhalb eines Styles
23.7 Ermitteln des visuellen Elementbaums
23.7.1 Das Tool »Expression Blend«
23.7.2 Standard-Template mit Code abfragen
24 Datenbindung
24.1 Bindung benutzerdefinierter Objekte
24.1.1 Ein Objekt mit XAML-Code erzeugen und binden
24.1.2 Ein Objekt mit C#-Code erzeugen und binden
24.1.3 Aktualisieren benutzerdefinierter Objekte
24.2 Auflistungen binden
24.2.1 Allgemeine Gesichtspunkte
24.2.2 Anbindung an eine »ListBox«
24.2.3 Änderungen der Collection an die bindenden Elemente weiterleiten
24.3 Validieren von Bindungen
24.3.1 Die Validierung im Datenobjekt
24.3.2 Eine benutzerdefinierte »ValidationRule«
24.3.3 Validierung mit der Schnittstelle »IDataErrorInfo«
24.3.4 Fehlerhinweise individuell anzeigen
24.3.5 Ereignisauslösung bei einem Validierungsfehler
24.4 Daten konvertieren
24.4.1 Mehrfachbindungen und Konverterklassen
24.5 Datenbindung an ADO.NET- und LINQ-Datenquellen
24.5.1 Das Binden an ADO.NET-Objekte
24.5.2 Das Binden an LINQ-Ausdrücke
25 Weitere Möglichkeiten der Datenbindung
25.1 »ItemsControl«-Steuerelemente anpassen
25.1.1 Den Style eines »ListBoxItem«-Elements ändern
25.1.2 DataTemplates festlegen
25.1.3 »DataTemplates« mit Trigger
25.2 Alternative Datenbindungen
25.2.1 Die Klasse »ObjectDataProvider«
25.3 Navigieren, Filtern, Sortieren und Gruppieren
25.3.1 Navigieren
25.3.2 Sortieren
25.3.3 Filtern
25.3.4 Gruppieren
25.4 Das Steuerelement »DataGrid«
25.4.1 Elementare Eigenschaften des »DataGrid«
25.4.2 Spalten definieren
25.4.3 Details einer Zeile anzeigen
26 Dependency Properties
26.1 Die Charakteristik von Abhängigkeitseigenschaften
26.2 Den Wert einer Abhängigkeitseigenschaft bilden
26.3 Definition einer Dependency Property
26.3.1 Registrieren einer Abhängigkeitseigenschaft
26.3.2 Der Eigenschaftswrapper
26.3.3 Die Eigenschaftsmetadaten
26.3.4 Freigabe des spezifischen Eigenschaftswertes
26.3.5 Vererbung von Abhängigkeitseigenschaften
26.4 Validieren einer Abhängigkeitseigenschaft
26.4.1 Validieren mit »ValidateValueCallback«
26.4.2 Validieren mit »CoerceValueCallback«
26.5 Angehängte Eigenschaften (Attached Property)
26.5.1 Angehängte Eigenschaften zur Laufzeit ändern
27 Ereignisse in der WPF
27.1 Ereignishandler bereitstellen
27.2 Routing-Strategien
27.2.1 Der durchlaufene Elementbaum
27.2.2 Beispielanwendung
27.2.3 Sonderfall der Mausereignisse
27.3 Der Ereignishandler
27.3.1 Die Klasse »RoutedEventArgs«
27.3.2 Die Quelle des Routing-Prozesses
27.3.3 Die Eigenschaft »Handled«
27.3.4 Registrieren und Deregistrieren eines Ereignishandlers mit Code
27.4 Definition eines Routed Events
27.4.1 Ereignisauslösung
27.4.2 Das Ereignis als Attached Event verwenden
27.4.3 Unterdrückte Ereignisse
27.5 Mausereignisse in der WPF
27.5.1 Ziehen der Maus
27.5.2 Auswerten der Mausklicks
27.5.3 Capturing
28 WPF-Commands
28.1 Allgemeine Beschreibung
28.1.1 Ein einführendes Beispiel
28.2 Vordefinierte WPF-Commands
28.3 Commands verwenden
28.3.1 Command-Bindungen einrichten
28.3.2 Lokalität der Befehlsbindung
28.3.3 Befehlsbindung mit Programmcode
28.3.4 Das Befehlsziel mit »CommandTarget« angeben
28.3.5 Zusätzliche Daten bereitstellen
28.3.6 Befehle mit Maus oder Tastatur aufrufen
28.4 Die Anatomie eines »Command«-Objekts
28.4.1 Das Interface »ICommand«
28.4.2 Die Klassen »RoutedCommand« und »RoutedUICommand«
28.4.3 Das Interface »ICommandSource«
28.5 Das MVVM-Pattern
28.5.1 Ein simples Beispielprogramm
29 Benutzerdefinierte Controls
29.1 Erstellen eines benutzerdefinierten Steuerelements
29.2 Der XAML-Code
29.3 Die Programmlogik des Steuerelements
29.3.1 Die Eigenschaften
29.3.2 Ein Ereignis bereitstellen
29.3.3 Das Steuerelement um einen »Command« ergänzen
29.4 Testanwendung
30 2D-Grafik
30.1 Shapes
30.1.1 Allgemeine Beschreibung
30.1.2 Line-Elemente
30.1.3 Ellipse- und Rectangle-Elemente
30.1.4 Polygon- und Polyline-Elemente
30.1.5 Darstellung der Linien
30.2 Path-Elemente
30.2.1 GeometryGroup
30.2.2 CombinedGeometry
30.2.3 PathGeometry
30.3 Brush-Objekte
30.3.1 SolidColorBrush
30.3.2 LinearGradientBrush
30.3.3 RadialGradientBrush
30.3.4 TileBrush
30.3.5 ImageBrush
30.3.6 VisualBrush
30.3.7 DrawingBrush
31 ADO.NET – Verbindungsorientierte Objekte
31.1 Allgemeines
31.2 Die Datenprovider
31.3 Die Verbindung zu einer Datenbank herstellen
31.3.1 Das Connection-Objekt
31.3.2 Die Verbindungszeichenfolge
31.3.3 Die Verbindung mit einer SQL Server-Instanz aufbauen
31.3.4 Öffnen und Schließen einer Verbindung
31.3.5 Das Verbindungspooling
31.3.6 Die Ereignisse eines »Connection«-Objekts
31.3.7 Verbindungszeichenfolgen aus einer Konfigurationsdatei abrufen
31.3.8 Verbindungen mit dem OleDb-Datenprovider
32 ADO.NET – Das Command-Objekt
32.1 Die Datenbankabfrage
32.2 Das SqlCommand-Objekt
32.2.1 Erzeugen eines SqlCommand-Objekts
32.2.2 Die Methode »CreateCommand« des Connection-Objekts
32.2.3 Ausführen des SqlCommand-Objekts
32.2.4 Die Eigenschaft »CommandTimeout« des SqlCommand-Objekts
32.3 Aktionsabfragen absetzen
32.3.1 Datensätze hinzufügen
32.3.2 Datensätze löschen
32.3.3 Datensätze ändern
32.3.4 Abfragen, die genau ein Ergebnis liefern
32.4 Das SqlDataReader-Objekt
32.4.1 Datensätze einlesen
32.4.2 Schließen des SqlDataReader-Objekts
32.4.3 MARS (Multiple Active Resultsets)
32.4.4 Batchabfragen mit »NextResult« durchlaufen
32.4.5 Das Schema eines SqlDataReader-Objekts untersuchen
32.5 Parametrisierte Abfragen
32.5.1 Parametrisierte Abfragen mit dem SqlClient-Datenprovider
32.5.2 Die Klasse »SqlParameter«
32.5.3 Asynchrone Abfragen
32.5.4 Gespeicherte Prozeduren (Stored Procedures)
33 ADO.NET – Der SqlDataAdapter
33.1 Was ist ein DataAdapter?
33.2 Die Konstruktoren der Klasse DataAdapter
33.3 Arbeiten mit dem SqlDataAdapter
33.3.1 Die Eigenschaft »SelectCommand«
33.3.2 Den lokalen Datenspeicher mit »Fill« füllen
33.3.3 Öffnen und Schließen von Verbindungen
33.3.4 Doppelter Aufruf der Fill-Methode
33.3.5 Mehrere DataAdapter-Objekte aufrufen
33.3.6 Die Spalten- und der Tabellenbezeichner einer DataTable
33.3.7 Paging mit der Fill-Methode
33.4 Tabellenzuordnung mit der Klasse »TableMappings«
33.4.1 Spaltenzuordnungen in einem DataSet
33.4.2 Spaltenzuordnungen einer DataTable
33.4.3 Die Eigenschaft »MissingMappingAction« des DataAdapters
33.5 Das Ereignis »FillError« des SqlDataAdapters
34 ADO.NET – Daten im lokalen Speicher
34.1 Allgemeines
34.2 Verwenden des DataSet-Objekts
34.2.1 Ein DataSet-Objekt erzeugen
34.2.2 Die Anatomie einer DataTable
34.2.3 Der Zugriff auf eine Tabelle im DataSet
34.2.4 Der Zugriff auf die Ergebnisliste
34.2.5 Dateninformationen in eine XML-Datei schreiben
34.3 Gültigkeitsprüfung im DataSet
34.3.1 Dem DataSet Schemainformationen übergeben
34.3.2 Eigenschaften einer DataColumn, die der Gültigkeitsprüfung dienen
34.3.3 Die Constraints-Klassen einer »DataTable«
34.3.4 Das Schema mit Programmcode erzeugen
34.3.5 Schemainformationen mit SqlDataAdapter abrufen
34.4 Änderungen in einer DataTable vornehmen
34.4.1 Editieren einer DataRow
34.4.2 Löschen einer Datenzeile
34.4.3 Eine neue Datenzeile hinzufügen
34.4.4 Der Sonderfall: Autoinkrementspalten
34.4.5 Was bei einer Änderung einer Datenzeile passiert
34.4.6 Manuelles Steuern der Eigenschaft »DataRowState«
34.5 Mit mehreren Tabellen arbeiten
34.5.1 Der Weg über JOIN-Abfragen
34.5.2 Mehrere Tabellen in einem DataSet
34.5.3 Eine DataRelation erzeugen
34.5.4 DataRelations und Einschränkungen
34.5.5 In Beziehung stehende Daten suchen
34.5.6 Ergänzung zum Speichern von Schemainformationen in einer XML-Schemadatei
34.6 Filtern und suchen in einer DataTable
34.6.1 Die Methode »Find«
34.6.2 Die Methode »Select«
34.7 Objekte vom Typ »DataView«
34.7.1 Einen »DataView« erzeugen
34.7.2 Auf die Datenzeilen in einem »DataView« zugreifen
34.7.3 Die Eigenschaft »Sort« und die Methode »Find«
34.7.4 Die Methode »FindRows«
34.7.5 Die Eigenschaft »RowFilter«
34.7.6 Die Eigenschaft »RowStateFilter«
34.7.7 Änderungen an einem »DataView«-Objekt
34.7.8 Aus einem »DataView« eine »DataTable« erzeugen
35 ADO.NET – Aktualisieren der Datenbank
35.1 Aktualisieren mit dem »CommandBuilder«
35.1.1 Die von »SqlCommandBuilder« generierten Aktualisierungsstatements
35.1.2 Konfliktsteuerung in einer Mehrbenutzerumgebung
35.1.3 Die Eigenschaft »ConflictOption« des »SqlCommandBuilders«
35.1.4 Die Eigenschaft »SetAllValues«
35.2 Manuell gesteuerte Aktualisierung
35.2.1 Eigene Aktualisierungslogik
35.2.2 Das Beispielprogramm
35.3 Konfliktanalyse
35.3.1 Den Benutzer über fehlgeschlagene Aktualisierungen informieren
35.3.2 Konfliktverursachende Datenzeilen bei der Datenbank abfragen
35.4 Neue Autoinkrementwerte abrufen
36 Stark typisierte DataSets
36.1 Ein stark typisiertes DataSet erzeugen
36.1.1 Typisierte DataSets mit dem Visual Studio Designer erstellen
36.1.2 Das Kommandozeilentool XSD.exe
36.2 Die Anatomie eines typisierten DataSets
36.2.1 Die Datenzeilen einer Tabelle ausgeben
36.2.2 Datenzeilen hinzufügen
36.2.3 Datenzeilen bearbeiten
36.2.4 Datenzeilen suchen
36.2.5 NULL-Werte im typisierten DataSet
36.2.6 Die Daten in einem hierarchischen DataSet
36.3 Typisierte DataSets manuell im Designer erzeugen
36.3.1 Eine »DataTable« manuell erzeugen
36.3.2 Der »DataTable« Spalten hinzufügen
36.3.3 Beziehungen zwischen den Tabellen erstellen
36.4 Weiter gehende Betrachtungen
36.5 Der »TableAdapter«
36.5.1 Einen »TableAdapter« mit Visual Studio erzeugen
36.5.2 Die Methode »Fill« des »TableAdapters«
36.5.3 Die Methode »GetData«
36.5.4 Die Methode »Update«
36.5.5 Aktualisieren mit den DBDirect-Methoden
36.5.6 TableAdapter mit mehreren Abfragen
36.5.7 Änderungen an einem »TableAdapter« vornehmen
36.6 Fazit: Typisierte oder nicht typisierte DataSets?
37 Einführung in das ADO.NET Entity Framework
37.1 Kritische Betrachtung von ADO.NET
37.2 Ein erstes Entity Data Model (EDM) erstellen
37.3 Das Entity Data Model im Designer
37.3.1 Die übergeordneten Eigenschaften einer Entität
37.3.2 Eigenschaften eines Entitätsobjekts
37.3.3 Assoziationen im Entity Data Model
37.3.4 Der Kontext der Entitäten
37.4 Der Aufbau des Entity Data Models
37.5 Die Klassen des Entity Data Models (EDM)
37.5.1 Die Entitätsklassen
37.5.2 Der ObjectContext
37.6 Die Architektur des Entity Frameworks
37.6.1 Object Services
37.6.2 Die Schichten des Entity Frameworks
38 Datenabfragen des Entity Data Models (EDM)
38.1 Abfragen mit LINQ to Entities
38.1.1 Allgemeine Begriffe in LINQ
38.1.2 Einfache Abfragen
38.1.3 Navigieren in Abfragen
38.1.4 Aggregatmethoden
38.1.5 Joins in LINQ definieren
38.1.6 In Beziehung stehende Daten laden
38.2 Abfragen mit Entity SQL
38.2.1 Ein erstes Beispiel mit Entity SQL
38.2.2 Die fundamentalen Regeln der Entity-SQL-Syntax
38.2.3 Filtern mit Entity SQL
38.2.4 Parametrisierte Abfragen
38.3 Der EntityClient-Provider
38.3.1 Verbindungen mit »EntityConnection«
38.3.2 Die Klasse »EntityCommand«
38.4 Abfrage-Generator-Methoden (QueryBuilder-Methoden)
38.5 SQL-Direktabfragen
39 Entitätsaktualisierung und Zustandsverwaltung
39.1 Aktualisieren von Entitäten
39.1.1 Entitäten ändern
39.1.2 Hinzufügen neuer Entitäten
39.1.3 Löschen einer Entität
39.2 Der Lebenszyklus einer Entität im Objektkontext
39.2.1 Der Zustand einer Entität
39.2.2 Das Team der Objekte im Überblick
39.2.3 Neue Entitäten im Objektkontext
39.2.4 Die Zustände einer Entität
39.2.5 Zusätzliche Entitäten in den Datencache laden
39.2.6 Die Zustandsverfolgung mit »MergeOption« steuern
39.3 Das »ObjectStateEntry«-Objekt
39.3.1 Die Current- und Originalwerte abrufen
39.3.2 Die Methode »TryGetObjectStateEntry«
39.3.3 Abrufen bestimmter Gruppen
39.3.4 Die Methode »GetModifiedProperties«
39.4 Die Klasse »EntityKey«
39.4.1 Die Methoden »GetObjectByKey« und »TryGetObjectByKey«
39.5 Komplexere Szenarien
39.5.1 Die Methode »ChangeState«
39.5.2 Die Methoden »ApplyCurrentChanges« und »ApplyOriginalChanges«
40 Konflikte behandeln
40.1 Allgemeine Betrachtungen
40.1.1 Das pessimistische Sperren
40.1.2 Das optimistische Sperren
40.2 Konkurrierende Zugriffe mit dem Entity Framework
40.2.1 Das Standardverhalten des Entity Frameworks
40.2.2 Das Aktualisierungsverhalten mit »Fixed« beeinflussen
40.2.3 Auf die Ausnahme »OptimisticConcurrencyException« reagieren
40.2.4 Das »ClientWins«-Szenario
40.2.5 Das »StoreWins«-Szenario
41 Plain Old CLR Objects (POCOs)
41.1 Ein erstes Projekt mit POCO-Klassen
41.1.1 Erstellen einfacher POCO-Klassen
41.1.2 Erstellen des Objektkontextes
41.2 Datenabfrage mit Hilfe der POCOs
41.2.1 In Beziehung stehende Daten laden
41.3 Änderungen verfolgen
41.3.1 Die Methode »DetectChanges«
41.3.2 In Beziehung stehende POCOs aktualisieren
Stichwortverzeichnis
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.