Eine Umgebung für die Entwicklung und Ausführung von Anwendungen. Es verwaltet alle Aspekte der Programmausführung.
Es besteht im Wesentlichen aus zwei Teilen: der Common Language Runtime (CLR) und der .NET Framework Class Library.
Das .NET Framework gewährleistet eine programmiersprachenübergreifende Kompatibilität, so dass Komponenten aus verschiedenen Sprachen zusammenarbeiten können. Zu dieser Interoperabilität gehört auch die Vererbung. Dies wird möglich, da beim Kompilieren der Quellcode in die Intermediate Language (IL) übersetzt wird. Alle .NET exe- und dll-Dateien enthalten IL Code, wodurch beliebige Kooperation ermöglicht wird.
.NET Framework Configuration Tool
Starten: Systemsteuerung > Verwaltung > Microsoft .NET Framework 1.1 Configuration.

Ermöglicht folgende Arbeiten:
Abstrakte Klassen sind eine Mischung aus Klasse und Interface. Es handelt sich um Klassen bei welchen mindestens ein Member abstrakt (= nicht implementiert und mit abstract deklariert) ist und die abgeleitet werden müssen, da sie nicht selbst instanziierbar sind. Es ist aber möglich, Variablen dieses Typs zu erzeugen. Die ableitende Klasse muss Implementationen für alle abstrakten Member liefern, es sei denn sie ist selbst abstrakt. Abstrakte Klassen können auch implementierte Member haben, die von der Kindklasse so geerbt werden oder überschrieben werden können. Abstrakte Klassen und Member werden mit dem Schlüsselwort abstract definiert.
Implementieren abstrakte Klassen Interfaces, müssen sie nicht Implementationen für die Member des Interfaces liefern. Die Member des Interfaces müssen aber (mit abstract) deklariert werden.
| Access-Typ | OleDbType | Length |
|---|---|---|
| Datum/Uhrzeit | OleDbType.DBDate | 0 |
| Hyperlink | OleDbType.VarWChar | 0 |
Unter Accessibility versteht man behindertengerechter Entwurf von Software.
Zu den entsprechenden Prinzipien gehören:
Anforderungen an eine behindertengerechte Applikation:
Standardeinstellungen des System müssen unterstützt werden
Die Einstellungen des Systems für Grösse, Farbe, Schrift und Eingabe sollten übernommen werden. Dies kann mit Klassen aus dem Namespace System implementiert werden. Legt man eine Schritftgrösse fest, muss diese mindestens 10 sein.
...
Eigenschften von Windows Forms-Steuerelementen vereinfachten Zugriff:
| Eigenschaft | Beschreibung |
|---|---|
| AccessibleDescription | Beschreibung welche an Eingabehilfen gemeldet wird. |
| AccessibleName | Name welcher an Eingabehilfen gemeldet wird. |
| AccessibleRole | Rolle des Steuerelements welche an Eingabehilfen gemeldet wird. |
| AccessibilityObject | Instanz von AccessibleObject, welche Bedienungshilfen Informationen über das Steuerelement gibt. |
| AccessibleDefaultActionDescription | Beschreibt Standardaktion des Steuerelements, kann nur im Code zugewiesen werden. |
Eine verbesserte und erweiterte Version der ActiveX Data Objects (ADO). Die Klassen von ADO.NET befinden sich im Namespace System.Data. In ADO.NET gibt es keine Redordsets mehr, statt dessen DataAdapter und DataSets, welche auch verbindungslosen Zugriff und Datenoperationen ermöglichen. Der Hauptgrund für verbindungslosen Zugriff ist das Internet. Bei Web-Anwendungen ist eine permanente Verbindung nicht möglich. Verbindungsloser Zugriff hat die Vorteile, dass ressourcensparender gearbeitet werden kann und die Anwendungen besser skalierbar sind.
Namespace: System. Stellt eine Anwendungsdomäne dar.
| Member | Beschreibung |
|---|---|
| static AppDomain CurrentDomain [get] | Ruft die Anwendungsdomäne für den Thread ab. |
Namespace: System.Windows.Forms. Ist für das Managen einer Windows-Applikation zuständig. Alle Member sind statisch.
| Member | Beschreibung |
|---|---|
| static string ExecutablePath | Der Pfad des exe-Files welches die Applikation startete. |
| static void Exit() | Beendet die Anwendung. |
| static void Run() | Überladen. Sendet das Formular in einen Message-Loop um auf Benutzeraktionen reagieren zu können. |
AppSettingsReader (System.Configuration)
Wird benutzt um Einstellungen aus der Konfigurationsdatei zu lesen.
| Member | Beschreibung |
|---|---|
| string GetValue(string key, Type type) | Instanzenmethode. type ist der Typ des zurückzugebenden Wertes. |
Beispiel für eine .config-Datei
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="HelpPath" value="C:\TrainerHLP\Trainer.chm" />
</appSettings>
</configuration>
Die .config-Datei muss im gleichen Verzeichnis wie die .exe-Datei liegen und den selben Namen wie diese zuzüglich ".config" haben.
Ein Array ist eine Serie von Variablen gleichen Typs auf welche mit einem Index zugegriffen werden kann.
Definition:
int[] meineInts;
meineInts = new int[4];
Hiermit wird ein Array mit 4 Elementen mit den Indizes 0 - 3 erzeugt. Deklaration und Initialisierung sind auch in einer Linie möglich: int[] meineInts = new int[4];
Die Arraygrösse kann zur Laufzeit durch Neuinitialisierung verändert werden, dabei gehen aber alle Daten verloren:
int[] meineInts = new int[32]; meineInts = new int[38];
Erzeugt und initialisiert man einen Array von Verweistypen, wird der Array nicht automatisch mit Instanzen dieses Typs gefüllt, er enthält lediglich null-Referenzen.
int[ , ] meineInts = new int[4, 8];
Ein jagged Array ist ein Array von Arrays, welche nicht alle die selbe Länge haben müssen.
Definition:
string[][] Schüler = new string[3][]; Schüler[0] = new string[] {"Stefan", "Erika", "Thomas", "Lukas"}; Schüler[1] = new string[] {"Philip", "Maria", "Sebastian"}; Schüler[2] = new string[] {"Karin", "Sandra"};
ArrayList (System.Collections)
Eine Collection-Klasse die allgemeine Auflistungsfunktionalität bietet. Elemente werden mit der Methode Add() hinzugefügt, welche einen Parameter vom Typ object entgegennimmt. Auf die Elemente einer ArrayList kann dank Indexern mit der Array-Syntax zugegriffen werden.
Beispiel:
ArrayList myList = new ArrayList(); Ding ding1 = new Ding(); Ding ding2 = new Ding(); myList.Add(ding1); myList.Add(ding2); object obj = myList[1]; // obj wird ding2 zugewiesen
Mit den Methoden Remove() und RemoveAt() können Elemente wieder aus der Auflistung entfernt werden. Remove() benötigt als Parameter einen Verweis auf das zu entfernende Objekt, RemoveAt() den entsprechenden Index. Beim Entfernen von Elementen werden die Indizes der dahinter liegenden Objekte um 1 reduziert, damit die Indizes weiterhin fortlaufend sind. Versucht man ein nicht existierendes Objekt zu entfernen erzeugt dies keinen Fehler.
Die Eigenschaft Count gibt immer die Anzahl Objekte zurück.
Wird verwendet, um Typkonvertierungen durchzuführen. Im Gegensatz zu expliziten Casts mit "(<neuer_Typ>)" löst as niemals eine Ausnahme aus. Ist keine Konvertierung möglich, ist die zurückgegebene Referenz vom Wert null. Man bezeichnet dies auch als Save-Cast.
Beispiel:
KlasseB b = new KlasseB(); KlasseA a = b as KlasseA; // Löst sicher keine Ausnahme aus
Die Grundheinheit einer .NET Anwendung. Es handelt sich um eine sich selbst beschreibende Sammlung von Ressourcen und Metadaten.
Assemblies bestehen aus:
Jede Assembly hat genau ein Manifest, welches folgende Informationen (Metadaten) über den Inhalt der Assembly zur Verfügung stellt. Diese Informationen werden von der CLR gelesen.
Sowohl die Assembly als auch das Manifest enthalten Metadaten. Das Assemblymanifest kann in einer separaten Datei oder in einem Modul enthalten sein. Assemblys enthalten ein oder mehrere Module welche den Code und Metadaten enthalten. Weiter enthalten Assemblies IL-Code und Ressourcendateien. Vereinfacht gesagt ist eine Assembly ein Projekt welches in eine .exe oder .dll-Datei kompiliert wird.
Das Assemblymanifest wird automatisch kompiliert und der CLR zugänglich gemacht. Die Metadaten welche die Identität beschreiben müssen aber vom Entwickler explizit festgelegt werden.
Assemblies ermöglichen Wiederverwendung, Versionskontrolle, Sicherheit und Codeweitergabe.
Werden standardmässig benutzt und machen dem Entwickler am wenigsten Ärger. Sie können nur von einer einzigen Anwendung verwendet werden. Fügt man einem Projekt einen Verweis auf eine private Assembly hinzu, wird eine Kopie davon erstellt und im Anwendungsordner gespeichert.
Existieren auf dem Computer nur einmal, mehrere Anwendung können sie benutzen. Eine Assembly wird freigegeben, indem man sie im GAC (Global Assembly Cache) installiert. Freigegebene Assemblies müssen über einen starken Namen verfügen.
Ressourcen sind Daten die in eine Anwendung eingebettet, aber nicht ausführbar sind. Ressourcenassemblies sind Assemblies welche nur Ressourcen enthalten, dies ermöglicht, Ressourcen umzustellen ohne die Anwendung neu kompilieren zu müssen.
Eine Ressourcenassembly erstellt man indem man ein neues Projekt mit der Vorlage "Klassenbibliothek" erstellt. Diesem fügt man lediglich Ressourcendateien hinzu (die Xxxx.cs-Datei kann man löschen).
Ermöglichen, dass von mehreren Ressourcendateien automatisch die zur CurrentUICulture passende geladen wird. Dafür müssen die Ressourcendateien über einen entsprechenden Namen verfügen (sie in seperate Assemblies zu kompilieren ist nicht notwendig:
Bsp. für deutschsprachige Benutzeroberflächen: MyResource.de.resx
Bsp. für luxemburgisches Deutsch: MyResource.de-LU.resx
Beim Laden der Ressourcen mit der Klasse ResourceManager muss man als zweites Argument die aktuelle CultureInfo übergeben.
Bsp, falls Ressourcenfiles in der gleichen Assembly:
ResourceManager resMan;
resMan = new ResourceManager("<namespace>.<Ressourcenname>",
this.GetType().Assembly);
string resString = resMan.GetString("<Stringname>",
System.Threading.Thread.CurrentThread.CurrentCulture);
In dieser Datei liegt (zum Entwicklungszeitpunkt) die Identität der Assembly. Sie enthält für diverse Identitätsattribute den Standardwert null.
Eine Möglichkeit für Programmierer, neue Arten deklarativier Informationen zu erfinden. Attribute können verschiedenen Programmeinheiten zugeordnet werden und die Informationen sind zur Laufzeit abrufbar.
Attribute werden durch die Deklaration von Attributsklassen definiert. Sie sind von der abstrakten Klasse System.Attribute abgeleitet und stellen positionale Parameter und benannte Parameter zur Verfügung. Der Konvention folgend besitzen Attributsklassen das Suffix Attribute. Bei ihrer Verwendung kann dieses jedoch weggelassen werden.
Jeder öffentliche Instanzenkonstruktor einer Attributsklasse definiert eine gültige Folge von positionalen Parametern für das Attribut.
Jedes öffentliche nicht-statische Feld und jede Eigenschaft mit Schreib- und Leseberechtigung definiert einen benannten Parameter.
Ein Doppelklick auf einen Fehler in der Aufgabenliste führt dazu, dass der betreffende Code hervorgehoben wird. Benötigt man weitere Informationen, kann man mit der Taste F1 zum hervorgehobenen Element Hilfe anfordern. Siehe auch TODO:

Auflistungen (Collections) bieten Funktionalität zur Verwaltung einer Gruppe von Objekten. Wie bei Arrays können die Member mit einem Index angesprochen werden, im Gegensatz zu Arrays ist es möglich, die Grösse ohne Datenverlust dynamisch zu ändern.
Einige Collections aus dem Namensraum System.Collection:
| Klasse | Beschreibung |
|---|---|
| ArrayList | |
| BitArray | Verwaltet einen Array von Bits. |
| CollectionBase | Dient als Oberklasse für die Implementierung eigener Auflistungen. |
| Hashtable | Ist eine Auflistung von Schlüssel/Wert-Paaren. Diese sind nach den Hashcodes der Schlüssel organisiert. |
| Queue | Verwaltet Objekte nach dem FIFO-Prinzip. |
| SortedList | Eine sortierte Gruppe von Objekten, auf welche mit Index oder Schlüssel zugegriffen werden kann. |
| Stack | Verwaltet Objekte nach dem Stapelprinzip. |
Auflistungen geben den Typ object zurück, was meist eine explizite Konvertierung notwendig macht. Die Indizes beginnen immer mit 0 und sind fortlaufend.
Um alle Objekte einer Auflistung oder eines Arrays zu durchlaufen verwendet man am besten die foreach-Anweisung, sie ist aber viel langsamer als eine for-Schleife.
Ausnahmen sind Instanzen von Klassen die von System.Exception abgeleitetet wurden. Sie werden ausgelöst wenn ein Laufzeitfehler auftritt und verfügen über Funktionalität zur Diagnose und Behandlung von Fehlern. Sie ermöglichen es, dass sich verschiedene Anwendungsteile über Fehlerzustände benachrichtigen können. Benutzerdefinierte Ausnahmen können durch das Ableiten von System.ApplicationException erstellt werden. ApplicationException kapselt die für Ausnahmen notwendige Funktionalität, z.B. die Eigenschaften Message, StackTrace und InnerException.
Beim Ableiten von ApplicationException sollten drei Konstruktoren geschrieben werden. Eine ohne Parameter, eine mit string Message und eine mit string Message, Exception InnerException.
Beim Auftreten eines Laufzeitfehlers erzeugt das Programm eine Instanz der passenden Exception und übergibt sie in der Aufrufliste nach oben bis eine Struktur zur Ausnahmebehandlung (Exception Handling) gefunden wird. Ist kein Fehlerbehandlungsmechanismus vorhanden, wird der Standardfehlerbehandler aufgerufen, welcher in einem Meldungsfeld den Ausnahmetyp sowie weitere Informationen anzeigt. Die Anwendung wird beendet ohne dass der Benutzer Gelegenheit zum Speichern zu geben und ohne den Versuch, sich vom Fehler zu "erholen".
Es ist möglich, sämtliche Ausnahmen abzufangen, auch solche die durch COM-Code oder sogar nicht COM-Code geworfen werden.
Methoden die Ausnahmen auslösen könnten, sollten einen geeigneten Ausnahmehandler haben. Die Syntax zur Ausnahmebehandlung gliedert sich in einen try-, einen oder mehrere catch- und ev. einen finally-Block.
try-Block
Enthält den Code, welcher eine Exception auslösen könnte.
catch-Blöcke
Enthalten den Code zur Behandlung der Ausnahme. Sie können generisch sein und alle Exceptions auffangen oder spezifisch nur die Ausnahme einer bestimmten Exception-Klasse. Verwendet man mehrere catch-Blöcke müssen diese vom Spezifisten zum Allgemeinsten geordnet sein.
Bei generischen catch-Blöcken fehlen die runden Klammern mit der Deklaration einer Ausnahme. Sie fangen alle Ausnahmen ab.
Stellt ein catch-Block fest, dass er eine Ausnahme nicht, oder nur teilweise behandeln kann, kann er sie mit throw <expeption>;
oder throw; erneut auslösen (throw
in einem catch-Block wirft immer die "gecatchte" Exception). Beim erneuten Auslösen resp. Weiterreichen kann man die Ausnahme auch in eine neue einhüllen, welche eine weitere oder detailliertere Problembeschreibung enthält. Die Eigenschaft InnerException wird im Konstruktor der neuen Ausnahme als zweiter Parameter zugewiesen.
finally-Block
Enthält Code, der in jedem Fall ausgeführt werden muss, egal ob ein Ausnahme
geworfen wurde oder nicht, resp. sie von einem catch-Block aufgefangen wurde oder nicht.
Will man eine Ausnahme nicht behandeln, sonder sie an den Aufrufer weiterreichen, schreibt man trotzdem einen try und einen finally-Block, lässt aber die catch-Blöcke weg.
Sollten nur verwendet werden, wenn es nicht anders geht, da sie zu hohen Performance-Einbussen führen.
Durch das Voranstellen von "base." kann man in einer abgeleiteten Klasse Member der Vaterklasse ansprechen.
An erster Stelle im Code kann man mit #define <symbol> bestimmte Symbole setzen.
Code welcher zwischen #if <symbol> und #endif steht, wird nur kompiliert falls dieses Symbol gesetzt ist.
Kompiliert man im DEBUG-Modus, sind die Symbole DEBUG und TRACE automatisch gesetzt, im RELEASE-Modus lediglich TRACE.
Mit #undef <symbol> kann man ein Symbol ausschalten. Setzt man die Direktive #undef DEBUG in den Code und kompiliert im DEBUG-Modus, wird das Projekt wie im RELEASE-Modus kompiliert.
Startet man den C#-Kompiler von der Kommandozeile, kann man mit der Option /define (/d als Abk.) Symbole setzen.
Mit dem Conditional-Attribut kann man ganze Methoden bedingt kompilieren.
Beispiel:
[Conditional("DEBUG")]
private void bedingteMethode() {...}
Mehrere vorhandene Steuerelemente werden in einem Container zusammengefügt und dieser verhält sich wie ein einzelnes Steuerelement. Benutzersteuerelemente werden von System.Windows.Forms.UserControl abgeleitet können zur Toolbox hinzugefügt werden.
Um ein neues Benutzersteuerelement zu erzeugen geht man zum Menu Datei|Neues Element hinzufügen... und wahlt im Dialog "Benutzersteuerelement".
Bei der Verwendung von Code aus anderen Programmiersprachen kann es vorkommen, dass Bezeichner vorkommen welche C# Schlüsselwörtern entsprechen. Diesen Bezeichnern stellt man im C#-Code ein @ voran.
Namespace: System.Windows.Forms.
Oberklasse: System.Object.
Repräsentiert die einfache Datenbindung zwischen einer Eigenschaft eines Objekts und einer Eigenschaft eines Steuerelements.
| Member | Beschreibung |
|---|---|
| Control Control [get] | Das Steuerelement das gebunden ist. |
| ConvertEventHandler Format | Tritt ein, wenn Daten aus der Datenquelle an das Steuerelement gesendet werden als auch wenn das Steuerlement Daten an die Datenquelle sendet. |
| ConvertEventHandler Parse | Tritt ein, wenn der Wert einer gebundenen Eigenschaft eines Steuerelements geändert wird. |
| object DataSource [get] | Ruft die Datenquelle ab. Mögliche Datenquellen sind DataSet, DataTable, DataView, DataViewManager, Objekt welches IList implementiert, oder auch ein beliebiges Objekt. |
| string PropertyName [get] | Der Name der gebundenen Eigenschaft des Steuerelements. |
Die beiden Ereignisse Format und Parse übergeben ein Argument vom Typ System.Windows.Forms.ConvertEventArgs. Es verfügt unter anderem über die Member DesiredType und Value.
Das Format -Ereignis und das Parse -Ereignis ermöglichen das Erstellen benutzerdefinierter Formate für die Anzeige von Daten. Wenn die Daten in einer Tabelle z. B. vom Typ Decimal sind, können Sie diese im lokalen Währungsformat anzeigen lassen, indem Sie die Value -Eigenschaft des ConvertEventArgs -Objekts im Format -Ereignis auf den formatierten Wert festlegen. Sie müssen die Formatierung des angezeigten Wertes folglich im Parse -Ereignis aufheben.
Namespace: System.Windows.Forms
Oberklasse: object
Unterklassen: CurrencyManager,
PropertyManager
Wird von Form.BindingContext[] zurückgegeben.
Namespace: System.Drawing. Ist von der abstrakten Klasse Image abgeleitet. Dem Konstruktor kann ein Filename übergeben werden. Mögliche Dateiformate sind u.a. .jpg, .png, .bmp, .gif, .tif. Ein Bitmap kann z.B. mit Graphics.DrawImage ausgegeben werden.
| Member | Beschreibung |
|---|---|
| Size Size [get] | Die Grösse des Bildes (in der Datei). |
Die implizite Konvertierung eines Werttyps in einen Verweistyp. Wird beispielsweise eine der Methoden Equals, GetHashCode, GetType oder ToString aufgerufen wird, erzeugt die Laufzeitumgebung automatisch eine temporäre Referenz um den Wert als Verweistyp behandeln zu können. Von Unboxing spricht man, wenn die geboxte Variable wieder in den ursprünglichen Typ zurückverwandelt wird. Dies muss explizit erfolgen.
System.ComponentModel.CancelEventArgs. Eine Instanz dieser Klasse wird z.B. dem Event Form.Closing übergeben. Setzt man Cancel auf true, kann man das Schliessen des Formulars verhindern.
Namespace: System.
Ein char-Literal wird in einfache Hochkommata eingeschlossen.
Beispiel:
char myChar = 'ü';
Ein Unicode-Zeichen kann mit einer vierstelligen Hexadezimalziffer mit vorangestelltem \u zugewiesen werden.
Beispiel:
char myChar = '\u01fc';
| Member | Beschreibung |
|---|---|
| static bool IsDigit(char c) | Gibt zurück, ob das übergebene Unicode-Zeichen als Dezimalzahl klassifiziert ist. |
| static bool IsLetter(char c) | Gibt zurück, ob das übergebene Unicode-Zeichen als Buchstabe klassifiziert ist. |
| static bool IsUpper(char c) | Gibt zurück, ob es sich um einen Grossbuchstaben handelt. |
Code Access Security (Codezugriffssicherheit). Verwaltet die Sicherheit von .NET Quellcode. Ein Subsystem der CLR welches die Zugangskontrolle für geschützte Ressourcen verwaltet.
Funktionen der CAS im .NET-Framework:
weiteres: Lektion 12 Folie 30
Siehe auch Role-based security (Rollenbasierte Autorisierung/Sicherheit).
Code Access Security kontrolliert, was Code auf einem Computer tun kann. CAS involviert Permissions um Ressourcen zu nützen.
Code Access Security POLicy Tool. Ermöglicht, die Sicherheitsrichtlinien auf den Ebenen Organisation, Computer und Benutzer zu ändern.
| Member | Beschreibung |
|---|---|
| Appearance Appearance | Setzt man diese Eigenschaft auf Appearance.Button, wird die CheckBox als Button welcher gedrückt sein kann oder nicht dargestellt. |
| CheckState CheckState | Die Enumeration CheckState verfügt über die Werte Checked, Unchecked und Indeterminate. Indeterminate (Haken erscheint auf grauem Grund) kann nur eintreten, wenn ThreeState auf true gesetzt ist. |
| bool Checked | Ist auch dann true, wenn CheckState auf Indeterminate gesetzt ist. |
| CheckStateChanged | Tritt jedesmal ein, wenn sich der Wert von CheckState geändert hat. |
| bool ThreeState | Ist ThreeState auf true gesetzt, kann CheckState auch den Wert CheckState.Indeterminate annehmen. |
checked und unchecked dienen zur Steuerung des Überlaufüberprüfungskontexts und können als Anweisung oder als Operator verwendet werden. Bei der Verwendung als Operator steht checked resp. unchecked vor einem Ausdruck in runden Klammern, z.B: checked (x = a * 100);. Bei der Verwendung als Anweisung steht checked resp. unchecked vor einem Block.
Folgende Operatoren werden durch den Überlaufüberprüfungskontext beeinflusst:
Führt im checked-Kontext eine Operation zu einem Ergebnis, das für den Zieltyp zu gross ist, kommt es zu einem Compilierungsfehler, falls es sich um einen konstanten Ausdruck handelt, oder sonst zur Laufzeit zu einer System.OverflowException.
Im unchecked-Kontext wird das Ergebnis durch Verwerfen aller Höherwertigen Bits gekürzt.
Namespace: System.Windows.Forms. Diese versiegelte nicht instanziierbare Klasse stellt statische Methoden für die Arbeit mit der Zwischenablage bereit.
| Member | Beschreibung |
|---|---|
| void SetDataObject(object data) | Das Object data muss serialisierbar sein. |
| void SetDataObject(object data, bool copy) | Übergibt man als copy den Wert true, bleibt der Inhalt in der Zwischenablage vorhanden nachdem die Applikation geschlossen wird, da das übergebene Objekt geklont wird. Übergibt man für copy den Wert false, wird lediglich eine Referenz auf data übergeben. |
| IDataObject GetDataObject() |
Eine Codegruppe ist ein Set von Assemblies, welche sich den gleichen Sicherheitskontext teilen. Eine Assembly kann allerdings Mitglied mehrerer Codegruppen sein. In diesem Fall erhält diese Assembly die Übermenge aller Berechtigungen der Codegruppen bei welchen sie Mitglied ist.
Codegruppen gibt es auf verschiedenen Sicherheitsebenen. Bei der Evaluation der Berechtigungen einer Assembly beginnt die CLR bei der obersten (Enterprise Level), die Assembly erhält die Übermenge der Berechtigungen aller Codegruppen bei welchen sie Mitglied ist. Das gleiche wird auch für die unteren Sicherheitsebenen Machine und User gemacht. Danach erhält die Assembly die Schnittmenge der Berechtigungen der verschiedenen Sicherheitsebenen.
Enthält eine der Sicherheitsebenen das LevelFinal Property, werden die unteren Ebenen nicht mehr ausgewertet.
Namespace: System.Collections. Dient als Basisklasse für das Erstellen eigener Auflistungsklassen. Sie verfügt bereits über eine Clear-Methode und die Count-Eigenschaft sowie die protected Eigenschaft List vom Typ IList. Add, Remove und der Indexer für den Zugriff auf die Objekte müssen selbst implementiert werden.
Namespace: System.Drawing. Repräsentiert eine Farbe. Siehe auch SystemColors.
| Member | Beschreibung |
|---|---|
| static Color FromArgb(int red, int green, int blue) | Erzeut eine Farbe mit entsprechenden rot, grün und blau-Anteilen. |
| static Color FromArgb(int alpha, Color color) | alpha definiert die Opazität ("undurchsichtigkeit"). |
| static Color FromArgb(int alpha, int red, int green, int blue) | |
| static Color FromKnownColor(KnownColor color) | KnownColor ist eine Enumeration aus System.Drawing. |
Namespace: System.Windows.Forms.
| Member | Beschreibung |
|---|---|
| DialogResult ShowDialog() | Zeigt den Farbdialog an. Ist der Rückgabewert DialogResult.OK, hat der Benutzer eine Farbe ausgewählt und OK angeklickt. |
| Color Color | Die vom Benutzer ausgewählte Farbe. |
| Member | Beschreibung |
|---|---|
| DropDownStyle DropDownStyle | DropDown: (default) Eingabe neuer Werte
möglich. DropDownList: Gleiche Darstellung, keine Eingabe neuer Werte möglich. Simple: Ganze Liste sichtbar, Eingabe neuer Werte möglich. |
System.Data.SqlClient.SqlCommand, System.Data.OleDb.OleDbCommand, System.Data.Odbc.OdbcCommand. Werden benötigt um in der DB SQL-Anweisungen auszuführen oder Stored-Procedures aufzurufen. Command-Objekte verfügen über alle notwendigen Informationen um das Kommando auszuführen und bieten eine sehr effiziente Möglichkeit mit der Datenbank zu interagieren. Die Auflistung Parameters speichert die Parameter für die Datenbankoperation, diese sind meist erst zur Laufzeit bekannt.
| Member | Beschreibung |
|---|---|
| XxxCommand(string text, XxxConnection conn, XxxTransaction) | Ein Konstruktor, text enthält den SQL-String oder den Namen der Stored-Procedure falls CommandType auf CommandType.StoredProcedure gesetzt ist. |
| int CommandTimeout [get, set] | In Sekunden, Standardwert ist 30. |
| XxxParameter CreateParameter() | Erzeugt einen Parameter der äquivalent zu new XxxParameter() ist und fügt ihn der Parameters-Auflistung hinzu. |
| int ExecuteNonQuery() | Für Kommandos ohne Rückgabewert (UPDATE, INSERT oder DELETE). |
| object ExecuteScalar() | Um einen einzelnen Wert aus einer Query abzurufen. |
| Connection Connection [get, set] | Die zu verwendende Connection (muss offen sein). |
| string CommandText [get, set] | Der auszuführende SQL-String. |
| CommandType CommandType [get, set] | Ein Wert aus der Enumeration System.Data.CommandTypes. Standardwert ist CommandType.Text. |
| Parameters.Add(string name, OleDbType typ) | Fügt einen Parameter mit entsprechendem Namen und Typ hinzu. |
| Parameters.Add(OleDbParameter parameter) | Fügt parameter der Auflistung hinzu. |
| DataReader ExceuteReader() | Gibt ein DataReader-Objekt zurück. |
Beispiel:
OleDbCommand cmd = new OleDbCommand(); cmd.Connection = oleDbConnection1; cmd.CommandText = "SELECT Vorname, Nachname FROM Adressen;"; oleDbConnection1.Open(); OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { ... } reader.Close(); oleDbConnection1.Close();
Einige Exceptions im Zusammenhang mit Command-Objekten
| Exception | Beschreibung |
|---|---|
| System.InvalidOperationException | Wird geworfen, wenn Connection auf null gesetzt ist oder die Connection nicht geöffnet ist. |
System.Data.SqlClient.SqlCommandBuilder, System.Data.OleDb.OleDbCommandBuilder, System.Data.Odbc.OdbcCommandBuilder. Wird verwendet um das InsertCommand, UpdateCommand und DeleteCommand von DataAdaptern zu generieren. CommandBuilder kann nur verwendet werden, wenn die DataTable Daten aus einer einzlnen Tabelle der Datenbank enthält. Die Feldnamen dürfen keine Sonderzeichen oder Leerzeichen (den Feldnamen in [] zu setzen nützt auch nichts) enthalten. Die DataTable darf nicht mit anderen Tabellen im DataSet verknüpft sein resp. diese Verknüpfungen werden ignoriert.
Bevor CommandBuilder benutzt werden kann, muss man das SelectCommand des DataAdapters setzen. Der Primärschlüssel oder mindestens eine Spalte die als Schlüssel benutzt werden, kann muss zurückgegeben werden. Der CommandBuilder initialisiert nur die Commands des DataAdapters, welche null sind.
Dem CommandBuilder übergibt man im Konstruktor einen DataAdapter, dessen Commands durch den Konstruktor initialisiert werden.
Verwaltet die Codeausführung und bietet wichtige Dienste wie Kompilation, Specherreservation, Threadmanagement und Garbage Collection. Sie erzwingt Typsicherheit mit Hilfe des Common Type System (CTS) sowie Codesicherheit.
Definiert die Mindestanforderungen an Compiler und gewährleistet damit, dass jeder mit einem .NET-Compiler übersetzte Code mit dem .NET-Framework zusammenarbeiten kann.
Stellt die Typkompatibilität zwischen den .NET-Komponenten sicher, indem z.B. ein Integer aus Visual Basic und ein int aus C# in der IL beide als System.Int32 dargestellt werden.
Namespace: System.ComponentModel. Stellt die Basisimplementierung für das Interface IComponent zur Verfügung. Nicht sichtbare Komponenten sollten hiervon abgeleitet werden.
System.Data.SqlClient.SqlConnection, System.Data.OleDb.OleDbConnection, System.Data.Odbc.OdbcConnection. Connection-Objekte repräsentieren die Verbindung zu einer Datenbank.
| Member | Beschreibung |
|---|---|
| Transaction BeginTransaction() | Gibt ein Transaction-Objekt zurück. Siehe auch Transaktionen. |
| void Open() | Öffnet die Verbindung. |
| void Close() | Schliesst die Verbindung. |
| System.Data.ConnectionState State | Eine Enumeration mit den Werten Broken, Closed, Connecting, Executing, Fetching, Open. |
| string ConnectionString [get, set] | Enthält sämtliche notwendigen Informationen zum Aufbau der Datenbankverbindung. Kann nur verändert werden, wenn die Verbindung geschlossen ist. |
Um Username und Passwort nicht in den ConnectionString aufnehmen zu müssen, kann man z.B. eine DSN verwenden.
Um mit einer SqlConnection auf den lokalen SQL-Server zuzugreifen schreibt man im ConnectionString "server=(local)".
Die Variablennamen im ConnectionString sind case-insensitive, gewisse Werte jedoch schon.
Steuerelemente, die weitere Controls beinhalten können. Beispiele sind: Panel, GroupBox und TabControl. Eigenschaften von Containersteuerelementen können sich auf die darin enthaltenen Controls auswirken. Beispiele für solche Eigenschaften sind: Enabled, BackColor, ForeColor, Visible, Font.
Namespace: System.Windows.Forms. Kontextmenüs öffnen sich beim Klick mit der rechten Maustaste auf ein Steuerelement. ContextMenu wird wie die Komponente MainMenu bearbeitet. Um ein Kontextmenü einem Control oder Formular zuzuweisen benutzt man dessen Eigenschaft ContextMenu.
Namespace: System.Windows.Forms. Die Basisklasse aller Steuerelemente. Der Hauptunterschied zwischen Steuerelementen und Komponenten ist, dass Steuerelemente eine visuelle Darstellung haben.
| Member | Beschreibung |
|---|---|
| bool CausesValidation [get, set] | Standardwert ist true. Siehe bei Validating. |
| KeyEventHandler KeyDown(object sender, KeyEventArgs e) | Tritt ein bei Tastendruck, wenn das Control den Fokus hat. |
| KeyPressEventHandler KeyPress(object sender, KeyPressEventArgs e) | Tritt ein bei Tastendruck, wenn das Control den Fokus hat. |
| KeyEventHandler KeyUp(object sender, KeyEventArgs e) | Tritt ein wenn eine Taste losgelassen wird und das Control den Fokus hat. |
| int TabIndex [get, set] | Anhand dieses Wertes kann die Tabulatorreihenfolge festgelegt werden. |
| EventHandler Validated(object sender, EventArgs e) | Wird ausgelöst, nachdem die Validierung erfolgreich abgeschlossen wurde. |
| CancelEventHandler Validating(object sender, CancelEventArgs e) | Tritt ein bevor das Control den Fokus verliert, allerdings nur wenn CausesValidation des nächsten Controls in der Tabulatorreihenfolge auf true gesetzt ist (Standardwert). Die Weitergabe des Fokus kann mit e.Cancel = true; verhindert werden. Dieses Ereignis ist der ideale Zeitpunkt um Benutzereingaben zu validieren. |
Der C#-Compiler.
| Option | Beschreibung |
|---|---|
| /target:library | Erzeugt eine .dll-Datei |
| /out:<Dateiname> | Legt den Namen der Ausgabedatei fest |
| /lib:<Verzeichnis>[; <Verzeichnis>] | Gibt die Position(en) von Assemblies an, auf die mit der Option /reference verwiesen wird. Der Verzeichnisname muss mit einem "\" enden. |
| /reference:<Dateiname> | Referenziert eine Assembly (.dll- oder .exe-Datei) |
Namespace: System.Windows.Forms.
Oberklasse: BindingManagerBase.
Verwaltet eine Liste von Binding-Objekten.
| Member | Beschreibung |
|---|---|
| int Count | Anzahl Datensätze der Datenbindung. |
| object Current | Der aktuelle Datensatz. |
| int Position | Die Position des aktuellen Datensatzes der Datenbindung. |
| EventHandler PositionChanged | Tritt ein, wenn sich die Position des Datensatzzeigers geändert hat. |
| void Refresh() | Erzwingt erneutes Auffüllen der Steuerelemente. |
System.Data.SqlClient.SqlDataAdapter, System.Data.OleDb.OleDbDataAdapter. Ein DataAdapter wird benutzt um DataSets mit Daten aus der DB zu füllen, sowie Änderungen an den Daten in der DB zu speichern. DataAdapter nehmen also eine Brückenfunktion zwischen DataSet und Datenbank ein.
| Member | Beschreibung |
|---|---|
| Command SelectCommand [get, set] | |
| Command UpdateCommand [get, set] | |
| Command InsertCommand [get, set] | |
| Command DeleteCommand [get, set] | |
| int Fill(DataSet dataSet, string tableName) | Füllt dataSet mittels SelectCommand. |
| int Fill(DataTable dataTable) | Füllt dataTable mittels SelectCommand. |
| int Fill(DataSet dataSet) | dito, die erzeugte Tabelle heisst "table". |
| DataTable[] FillSchema(DataSet, SchemaType, string) | Konfiguriert eine DataTable entsprechend dem Schema von SelectCommand. SchemaType muss auf SchemaType.Source gesetzt sein. |
| DataTable FillSchema(DataTable, SchemaType) | dito |
| FillError | Wird ausgelöst, wenn während der Ausführung der Fill-Methode Fehler auftreten. Treten Fehler auf und es gibt keinen Event-Handler, tritt eine InvalidCastException auf. |
| RowUpdated | Wird nach einer (versuchten) Zeilenänderung, aber vor dem eventuellen Auftreten von Exceptions ausgelöst. Dieses Ereignis kann benutzt werden um Aktualisierungsfehler zu behandeln ohne Fehlerbehandlungsblöcke verwenden zu müssen. |
| int Update(DataSet dataSet) | Speichert die Änderungen des DataSets in der DB. |
| int Update(DataSet dataSet, string tableName) | Speichert die Änderungen der entsprechenden Tabelle in der DB. |
| int Update(DataTable dataTable) | dito |
| int Update(DataRow[] rows) | dito |
Die Verschiedenen Commands (UpdateCommand usw.) können in gewissen Fällen mit den CommandBuilder-Klassen erzeugt.
Nach dem Aufruf von Update (erst danach) sollte DataSet.AcceptChanges resp. DataTable.AcceptChanges aufgerufen werden.
Der DataAdapter kümmert sich selbst um das Öffnen und Schliessen der Connection.
Namespace: System.Data. Repräsentiert eine Spalte einer DataTable.
| Member | Beschreibung |
|---|---|
| DataColumn(string name, Type typ) | Konstruktor |
| bool AutoIncrement | Legt fest, ob ein Auto-Increment-Wert gesetzt werden soll. |
| long AutoIncrementSeed | Legt den Startwert für Auto-Increment fest. |
| long AutoIncrementStep | Schrittweite für Auto-Increment-Wert. |
| string ColumnName [get, set] | |
| object DefaultValue | |
| int MaxLength | |
| bool Readonly [get, set] | Legt fest, ob Werte in dieser Spalte geändert werden dürfen. |
| bool Unique |
Kann an DataSets, DataTables, DataViews und weiteres gebunden werden und stellt diese Daten dar.
Es ist möglich, Daten zu ändern, zu sortieren sowie Datensätze auszuwählen.
Eine Möglichkeit zur Darstellung einer DataTable ist:
dataGrid1.DataSource = dataSet1;
dataGrid1.DataMember = "Artikel";
somit wird die Tabelle Artikel aus dataSet1 in dataGrid1 dargestellt.
Eine weitere Möglichkeit ist, der Eigenschaft DataSource direkt die darzustellende Tabelle zuzuweisen.
| Member | Beschreibung |
|---|---|
| string DataMember [get, set] | Der Name der darzustellenden Tabelle, falls der Eigenschaft DataSource ein Objekt mit mehreren Tabellen zugeordnet ist. |
| object DataSource [get, set] | Dieser Eigenschft kann ein DataSet, DataTable, DataViewManager, DataView, IListSource oder IList zugewiesen werden. Enthält dieser Wert mehrere Tabellen, muss deren Namen der Eigenschaft DataMember zugewisen werden. |
Zum festlegen der Spaltenbreite oder zum Ausblenden von Spalten siehe System.Windows.Forms.DataGridTableStyle.
Abgeleitete Klassen: System.Windows.Forms.DataGridBoolColumn, System.Windows.Forms.DataGridTextBoxColumn.
Instanzen dieser Klasse formatieren eine Spalte eines DataGrid's. Sie befinden sich in der Auflistung GridColumnStyles des DataGridTableStyle-Objekts welches dem DataGrid zugeordnet ist.
| Member | Beschreibung |
|---|---|
| string MappingName [get, set] | Muss mit der ColumnName-Eigenschaft der zu formatierenden DataColumn übereinstimmen. |
| virtual string NullText [get, set] | Der anzuzeigende String, falls ein Wert dieser Spalte null resp. DBNull.Value enthält. |
| virtual int Width [get, set] | Die Breite der Spalte in Pixeln. |
Instanzen dieser Klasse formatieren die Darstellung einer Tabelle welche in einem DataGrid dargestellt wird. Die Instanz muss der Auflistung TableStyles des DataGrid's hinzugefügt werden.
| Member | Beschreibung |
|---|---|
| string MappingName [get, set] | Der Name der Tabelle, welche durch diese Instanz formatiert werden soll. |
| virtual GridColumnCollection GridColumnStyles [get] | Enthält die DataGridColumnStyle-Objekte für die Spalten der Tabelle. |
| GridColumnStyles.RemoveAt(int index) | Bewirkt, dass die Spalte mit dem entsprechenden Index nicht angezeigt wird. |
| GridColumnStyles.Remove(DataGridColumnStyle column) | Entfernt die übergebene DataGridColumnStyle aus der GridColumnStyles-Auflistung, d.h. die entsprechenden Spalte wird nicht angezeigt. |
Um einem DataGrid ein TableStyle (oder mehrere) hinzuzufügen, verwendet man am besten das Eigenschaftenfenster. Dort ist die Auflistung TableStyles sichtbar und man kann auch einer TableStyle GridColumnStyles hinzufügen, es ist auch bequem möglich einzelne Eigenschaftswerte im App.config speichern zu lassen.
Bindet man an ein DataGrid eine DataView, so muss DataGridTableStyle.MappingName auf den Namen der mit DataView dargestellten Tabelle gesetzt werden.
Anscheinend ist es aber nicht möglich, DataGridTableStyles gleichzeitig mit DataGrid-Autoformatierung zu benutzen.
Namespace: System.Windows.Forms. Diese Klasse implementiert IDataObject und wird für die Datenübertragung via Zwischenablage sowie für Drag & Drop verwendet. In einer DataObject-Instanz können mehrere Datenmengen in verschiedenen Formaten gespeichert werden.
| Member | Beschreibung |
|---|---|
| string[] GetFormats() | Wird vom Zielobjekt benötigt, um sich über die verfügbaren Datenformate zu informieren. |
| void SetData(object) | |
| void SetData(string, object) | |
| void SetData(Type, object) |
System.Data.SqlClient.SqlDataReader, System.Data.OleDb.OleDbDataReader, System.Data.Odbc.OdbcDataReader. Bietet eine forward-only Möglichkeit, aus der Datenbank zu lesen. DataReader können nicht direkt instanziiert werden, Instanzen werden von Command.ExecuteReader() zurückgegeben. DataReader-Objekte benötigen exklusiv eine aktive Connection während ihrer gesamten Lebensdauer.
| Member | Beschreibung |
|---|---|
| bool Read() | Setzt den Zeiger auf den nächsten Datensatz und gibt true zurück, falls dieser vorhanden ist. Die Werte der einzelnen Felder werden durch einen Indexer als Array von Objekten zur Verfügung gestellt. |
| int FieldCount [get] | Ruft die Anzahl Spalten des aktuellen Datensatzes ab. |
| System.Type GetFieldType(int rowNumber) | |
| System.Data.IDataParameter[] GetFillParameters() | Gibt die Parameter zurück, die beim SELECT-Statement benutzt wurden. |
| DataTable GetSchemaTable() | Gibt eine DataTable mit Metadaten zur Tabelle zurück. |
| int GetValues(object[] array) | Kopiert alle Werte des aktuellen Datensatzes in array. array.length kann grösser oder kleiner als die Anzahl Felder im Datansatz sein, im letzteren Fall werden nicht alle Werte kopiert. |
| bool IsClosed [get] | |
| bool IsDBNull(int spalte) | Gibt true zurück, falls die entsprechende Spalte des aktuellen Datensatzes den Wert NULL hat. |
Beispiel:
while(myReader.Read()) {
object obj1 = myReader[3];
object obj2 = myReader["Vorname"];
} myReader.Close();
Es ist mit einem DataReader auch möglich, streng typisierte Werte abzufragen. Dazu gibt es Methoden wie GetInt32, GetFloat usw.
Namespace: System.Data. Repräsentieren eine Verknüpfung zwischen Spalten zweier DataTables. Die DataTables müssen zum gleichen DataSet gehören. Verwendet man ein typisiertes DataSet, müssen die Spalten vom gleichen Typ sein. DataRelations müssen der Eigenschaft Relations des betreffenden DataSets zugewiesen werden.
| Member | Beschreibung |
|---|---|
| DataRelation(string name, DataColumn parent, DataColumn child) | Konstruktor |
Beispiel:
DataRelation myRelation = new DataRelation("Relation1", column1, column2);
myDataSet.Relations.Add(myRelation);
Siehe auch DataRow.GetChildRows und DataRow.GetParentRow;
Namespace: System.Data. Ein Datensatz in einer DataTable. DataRows können nicht direkt instanziiert werden, sie werden über DataTable.NewRow() erzeugt.
Über einen Indexer kann man auf die einzelnen Werte dieses Datensatzes zugreifen.
Beispiel:myDataRow.BeginEdit(); myDataRow[0] = 3; // Dem ersten Feld wird der Wert 3 zugewiesen myDataRow["Kundennummer"] = 3; // Dem Feld "Kundennummer" wird der Wert 3 zugewiesen myDataRow.EndEdit();
Das Ändern von DataRows ist auch ohne Aufruf von BeginEdit und EndEdit möglich. Es sollte jedoch trotzdem mit Aufruf dieser zwei Methoden gemacht werden, da gewisse Features dies benötigen.
Aufgepasst!
Der Datentyp Integer aus Microsoft Access entspricht System.Int16.
Jede DataRow speichert zwei Zustände, eine unbearbeitete Version mit den ursprünglichen Werten und eine bearbeitete Version. Will man Änderungen in die Datenbank übertragen, darf man AcceptChanges erst aufrufen, nachdem man die Daten mit DataAdapter.Update in der Datenbank aktualisiert hat.
| Member | Beschreibung | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| DataRow[] GetChildRows(DataRelation relation) | Gibt die Detaildatensätze welche diesem Datensatz durch relation zugeordnet sind zurück. | ||||||||||
| DataRow GetParentRow(DataRelation relation) | Gibt den Datensatz aus der Mastertabelle zurück, welcher diesem durch relation zugeordnet ist. | ||||||||||
| object[] ItemArray | Die einzelnen Werte dieses Datensatzes. | ||||||||||
| void RejectChanges() | Macht alle Änderungen seit dem letzten Aufruf von AcceptChanges rückgängig | ||||||||||
| this[int] [get, set] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| this[string] [get, set] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| this[DataColumn column] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| this[int, DataRowVersion] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| this[string, DataRowVersion] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| this[DataColumn, DataRowVersion] | Zugriff auf den Wert der entsprechenden Spalte. | ||||||||||
| void AcceptChanges() | Überschreibt die ursprünglichen Werte mit den Bearbeiteten. | ||||||||||
| DataRowState RowState [get] |
|
Namespace: System.Data.
| Wert | Beschreibung |
|---|---|
| Current | aktueller Wert. |
| Default | |
| Original | Die Zeile enthält ihre ursprünglichen Werte. |
| Proposed |
DataSets können im Gegensatz zu den ADO Recordsets mehrere Tabellen beinhalten sowie auch Verknüpfungen zwischen den Tabellen. Man kann sich ein DataSet-Objekt als eine Kopie des relevanten Ausschnitts der Datenbank vorstellen. Meistens werden DataSets durch einen DataAdapter mit Daten aus einer Datenbankabfrage oder aus einer XML-Datei gefüllt, sie können aber auch im standalone-Modus existieren. Die Eigenschaft Tables ist vom Typ System.Data.DataTableCollection und verwaltet alle DataTables des DataSets.
Beispiel:
DataSet myDataSet = new DataSet(); DataTable myDataTable = new DataTable(); myDataSet.Tables.Add(myDataTable); DataColumn columnName = new DataColumn("Name"); myDataSet.Tables[0].Columns.Add(columnName); DataRow myRow = myDataSet.Tables[0].newRow(); myRow.Item[0] = "Herbert"; myDataSet.Tables[0].Rows.Add(myRow);
| Member | Beschreibung |
|---|---|
| void AcceptChanges() | Ruft AcceptChanges aller DataTables auf. |
| void RejectChanges() | Ruft RejectChanges aller DataTables auf. |
| void WriteXml(string fileName) | Schreibt die Daten des DataSets in einen XML-File. |
| void WriteXmlSchema(string fileName) | Schreibt die Datenstruktur in einen XML-Schema-File. |
| void ReadXml(string fileName) | Liest einen XML-File und speichert dessen Daten. |
| void ReadXmlSchema(string fileName) | Liest einen XML-Schema-File welcher die Datenstruktur beschreibt. |
Sind von DataSet abgeleitet und werden aus einem XML-Schema (.xsd-Datei) erzeugt. Sie ermöglichen Typprüfung zur Kompilierzeit und bieten performanteren Zugriff auf Zeilen und Spalten. Statt mit dataSet1.Tables["Adressen"] kann man bei einem typisierten DataSet mit dataSet1.Adressen auf die Tabelle Adressen zugreifen.
Erzeugen eines typisierten DataSets:
Im Kontextmenü des Projekts Hinzufügen... | Komponente
hinzufügen... wählen. Im erscheinenden Dialog DataSet auswählen.
Zeigt man das typisierte DataSet im Editor an, kann man zwischen den Ansichten
DataSet und XML wählen. In der Ansicht DataSet ist es möglich, aus dem Server
Explorer einzelne Tabellen oder sogar alle Tabellen gleichzeitig in das
DataSet-Fenster zu ziehen.
Wechselt man zur Toolbox, wird das XML-Schema Tab sichtbar, und man kann durch
Drag & Drop Elemente, Attribute, Schlüssel, Beziehungen und so weiter zum
DataSet hinzufügen.
Klickt man im Projektmappen-Explorer auf "Alle Dateien anzeigen", wird unterhalb des DataSet.xsd Eintrag auch die Quellcode-Datei des DataSets sichtbar.
DataSets speichern die Daten intern im XML-Format. Siehe auch XmlDataDocument.
Repräsentiert eine Tabelle innerhalb eines DataSets. Eine DataTable beinhaltet je eine Auflistung von DataColumn- und DataRow-Instanzen. Ein DataTable-Objekt kann auch ausserhalb eines DataSets existieren.
| Member | Beschreibung |
|---|---|
| string TableName | Der Name der Tabelle. |
| DataRowCollection Rows | Verwaltet die Datensätze. |
| DataRow NewRow | Erzeugt eine neue DataRow nach dem Schema der DataTable, fügt diese jedoch nicht hinzu! |
| DataRow Rows.Add(DataRow) | |
| Rows.Add(object[]) | Fügt einen neuen Datensatz hinzu. |
| DataColumnCollection Columns | Verwaltet die Spalten. |
| DataColumn Columns.Add(string, Type) | Fügt der Tabelle eine neue Spalte hinzu. |
| DataTable GetChanges() | Gibt eine DataTable zurück, die nur die Änderungen seit dem letzten Aufruf von AcceptChanges enthält. Falls seitdem keine Änderungen gemacht wurden, wird null zurückgegeben. |
| void RejectChanges() | |
| void AcceptChanges() |
Ermöglichen, die Daten einer DataTable zu sortieren und zu filtern. Es können auch Steuerelemente an eine DataView gebunden werden.
Beispiel:
DataView myDataView = new DataView(myDataTable); myDataView.Sort = "Kundennummer DESC, Wohnort"; // Standard ist ASC myDataView.RowFilter = "Name = 'Müller' AND Wohnort = 'Zürich'";
Eine Datenbindung ist eine Beziehung zwischen einem Datenprovider (Datenquelle) und einem Datennutzer (Datenkonsument).
Der Datenprovider ist das Objekt, welches die Daten zur Verfügung stellt, jedes Objekt das die Schnittstelle IList implementiert kann als Datenquelle verwendet werden. Typische Beispiele sind DataSets, DataTables, DataViews, es können aber auch Arrays, Collections oder eigene Klassen als Datenprovider verwendet werden. Jede Datenquelle hat ein CurrencyManager-Objekt, welches immer weiss, welcher Datensatz der aktuelle ist. Sämtliche CurrencyManager eines Formulars werden von dessen Eigenschaft BindingContext verwaltet.
Datennutzer sind Steuerelemente, sie stellen die Daten des Datenproviders dar und nehmen gegebenenfalls neue Werte entgegen.
Man unterscheidet zwischen einfacher Datenbindung und komplexer Datenbindung:
Bei der einfachen Datenbindung stellt das Steuerelement immer nur einen Eintrag dar. Ein Beispiel für einfache Datenbindung ist ein Label, dessen Eigenschaft Text an eine Spalte einer DataTable gebunden ist. Es kann immer nur den Wert des aktuellen Datensatzes darstellen. Einfache Datenbindung wird mit DataBindings.Add() realisiert.
Bei komplexer Datenbindung hingegen sind mehrere Datensätze gleichzeitig an das Steuerelement gebunden (ev. auch sichtbar). Ein Beispiel für komplexe Datenbindung ist eine ListBox, welche an eine ganze Spalte einer DataTable oder DataView gebunden ist. Komplexe Datenbindung realisiert man mit den Eigenschaften DataSource und DisplayMember.
Ein einfach gebundenes Steuerelement erstellen
Steuerelemente verfügen über die Eigenschaft DataBindings bei welcher es sich um eine Instanz der Klasse DataBindingsCollection handelt. DataBindings wird zur Entwurfszeit als erweiterbarer Knoten im Eigenschaftenfenster dargestellt.

Eine Datenbindung lässt sich durch Klick auf das Feld neben der entsprechenden Eigenschaft herstellen. Es öffnet sich eine Liste mit allen verfügbaren Datenquellen. Jede beliebige Eigenschaft eines Steuerelements lässt sich binden. Handelt es sich um eine Eigenschaft die unter DataBindings nicht aufgeführt wird, lässt sich durch Klick auf "(Erweitert)" und dann auf den Button mit "..." das Dialogfeld "Erweiterte Datenbindung" öffnen. Es listet sämtliche Eigenschaften des Steuerelements auf.

Datenbindung zur Laufzeit
Um zur Laufzeit eine Datenbindung herzustellen verwendet man die Eigenschaft Bindings des betreffenden Steuerelements. Es handelt sich dabei um eine Instanz der Klasse ControlBindingsCollection. Die Methode ControlBindingsCollection.Add() kann zum Einrichten einer neuen Bindung verwendet werden. Sie übernimmt drei Argumente. Der Name der zu bindenden Eigenschaft (des Controls) als String, die Datenquelle als Objekt und das zu bindende Member der Datenquelle als String.
textBox1.DataBindings.Add("Text", dataSet1.Tables["Customers"], "CustomerID");
Bindet die Spalte CustomerID der Tabelle Customers des DataSets dataSet1 and die Eigenschaft Text des Steuerlements textBox1. DataBindings ist eine Collection, die Objekte des Typs Binding verwaltet.
Verfügt die Datenquelle nicht über mehrere Spalten, übergibt man als drittes Argument einen Leerstring.
Sieh auch: BindingManagerBase, CurrencyManager, PropertyManager, BindingContext.
Datentypen verfügen auch über Membermethoden die nicht von object abgeleitet sind. Einige von diesen sind spezifisch für diesen Typ, alle Datentypen verfügen jedoch über die Methode Parse(). Sie konvertiert einen string in einen Wert des entsprechenden Typs.
Namespace: System. Stellt den Wert NULL aus der Datenbankwelt dar. Das statische Feld Value ist die einzige Instanz dieser Klasse, es handelt sich also um ein Singleton.
Der Typ mit der grössten Wertspanne, er kann grössere Werte darstellen als long.
Die deklarative Sicherheit gibt an, welche Berechtigung eine Assembly laut ihrem Assemblymanifest verlangt. Permissions werden durch die Verwendung von Attributen verlangt. Siehe auch imperative Sicherheit.
Destruktoren tragen immer den selben Namen wie die Klasse mit einer Tilde (~) davor. Sie werden nicht vererbt, jede Klasse hat also nur den Destruktor, der in ihr deklariert wurde. Ein expliziter Aufruf ist nicht möglich.
Spezielle Klassen welche äusserst wichtig für die Arbeit mit Ereignissen ist. Es handelt sich um typsichere Funktionszeiger, die auf eine Methode verweisen. Ein Delegat ist sozusagen ein Stellvertreter für eine Methode und ermöglicht, eine Methode aufzurufen deren Name erst zur Laufzeit bekannt ist. Delegates geben einer Signatur einen Namen, sodass jede Methode mit der gleichen Signatur und dem gleichen Rückgabetyp mit Hilfe des Delegaten aufgerufen werden kann.
Delegaten werden implizit von der Klasse Delegate resp. MulticastDelegate aus dem Namespace System abgeleitet. Die Deklaration erfolgt aber auf andere Weise.
Deklaration:
public delegate int myDelegate(string s);
Bei der Delegate-Deklaration muss ein Rückgabetyp und eine Parameterliste spezifiziert werden. Es gleicht einer Methodendeklaration die um das Schlüsselwort delegate erweitert wurde. Delegates können ausserhalb einer Klasse definiert werden.
Für die Ereignisse der .NET Framework Class Library werden Standarddelegaten zur Verfügung gestellt. Die Delegatklasse System.EventHandler ist beispielsweise für die Ereignisse der meisten Steuerelemente zuständig.
Methoden können Parameter vom Typ eines Delegates übernehmen. Somit ist es möglich, Methoden als Parameter zu übergeben (Funktionszeiger).
Indem man Dateien eine digitale Signatur anheftet, kann man die Identität des Lieferanten sicherstellen und auch beweisen dass die Datei nach der Signierung nicht mehr verändert wurde.
Microsoft Authenticode ist eine Technologie anhand welcher verschiedenste Dateien mit Signaturen versehen werden können.
Assemblies können auch durch einen starken Namen signiert werden. Es ist möglich, beide Methoden, nur eine oder gar keine zu verwenden.
do {
Anweisungsblock
} while (Schleifenkriterium);
Werden durch drei Slashes erzeugt. Unter Extras|Erstellen von Kommentarwebseiten... hat man die Möglichkeit auf den Dokumentationskommentaren basierende Webseiten zu erstellen.
Namespace: System.Windows.Forms. Erlaubt das Auswählen von String-Werten aus einer Liste analog zu NumericUpDown. Es ist auch möglich, selbst einen Wert einzugeben.
Stellen ein Set von Konstanten mit leicht zu merkenden Namen zur Verfügung.
Definition:
public enum Jahreszeiten
{
Frühling = 1,
Sommer = 2,
Herbst = 3,
Winter = 4
}
Zuweisung:
Jahreszeiten jz = Jahreszeiten.Frühling;
Enumerationen sind standardmässig vom Typ int, können aber von jedem Integertyp sein, in diesem Fall muss dieser bei der Definition angegeben werden.
Beispiel:
public enum Jahreszeiten : byte ...
Die Angabe von Werten ist optional, lässt man sie weg werden automatisch Werte beginnend mit 0 zugewiesen.
Es ist möglich, Methoden zu schreiben welche Parameter vom Typ einer Enumeration verlangen.
Eigenschaften sind Member welche sowohl mit Feldern als auch mit Methoden Ähnlichkeiten haben. Werte werden von ausserhalb der Klasse mit der gleichen Syntax wie bei Feldern gesetzt und abgerufen. Dabei wird jedoch jeweils Code ausgeführt welcher den Wert validiert oder andere notwendige Aufgaben ausführt.
Definition:
private string name; // ein privates Feld welches den Wert der Eigenschaft speichert public string Name { get { return name; } set { name = value; } // value (ein Schlüsselwort) ist der Wert, welcher der Eigenschaft zugewiesen wurde }
Eigenschaften können wie Methoden überschrieben oder verborgen werden, folglich sind auch die Modifizierer virtual, override und new erlaubt.
Mit Attributen kann man steuern, ob Eigenschaften von visuellen Komponenten im Eigenschaftenfenster angezeigt werden, in welcher Kategorie und mit welcher Beschreibung. Es werden jedoch nur die Eigenschaften der Basisklasse, nicht jene der aktuellen Klasse angezeigt.
| Attribut | Beschreibung |
|---|---|
| [Browsable(bool)] | Legt fest, ob Eigenschaft im Eigenschaftenfenster erscheint. |
| [Description(string)] | Legt die Beschreibung fest, die im unteren Teil des Eigenschaftenfensters angezeigt wird. |
| [EditorBrowsable( EditorBrowsableState)] | Legt fest, ob die Eigenschaft in der IntelliSense-Liste im Editor angezeigt wird oder nicht. Die Werte der Enumeration EditorBrowsableState sind Advanced, Always und Never. |
| [Category(string)] | Die Kategorie in welcher die Eigenschaft angezeigt wird. |
Methoden werden einzeln getestet. Dies anhand diverser Eingabewerte und Ausführungsparameter. Siehe auch Testfall.
Einheitentestplan erstellen
Ein Driver simuliert Aufrufe von anderen Einheiten.
Ein Stub simuliert eine aufgerufene Einheit.
Diese Debugfunktion steht im Unterbrechungsmodus zur Verfügung. Sie ermöglicht, die Programmausführung Zeile für Zeile zu untersuchen.
Ereignisse sind wie Felder, Eigenschaften und Methoden, Member einer Klasse. Es handelt sich dabei um Nachrichten die auf ein Vorkommnis hinweisen und anderen Programmteilen die Möglichkeit geben, mittels Eventhandlern darauf zu reagieren. Ereignissen können Parameter übergeben werden, welche die Eventhandler auswerten können. Methoden die ein Ereignis behandeln, müssen die gleiche Signatur wie das Ereignis haben. Ein Ereignis kann mehrere Methoden auslösen und eine Methode kann mehrere Ereignisse behandeln. Ereignisse können auch statisch sein.
Bei der Deklaration muss der Delegate-Typ angegeben werden, welcher das Ereignis verwendet.
Beispiel:
public delegate void motorStartenDelegate(double zeitPunkt); public event motorStartenDelegate MotorStarten;
Um das Ereignis auszulösen, kann man es wie eine Methode aufrufen. Löst man ein Ereignis aus, an welches keine Delegates gebunden sind, kommt es zu einer NullReferenceException. Daher sollte zuerst mit <Ereignis> != null geprüft werden, ob Delegates vorhanden sind.
Beispiel:
if (MotorStarten != null)MotorStarten(18.324);
Beispiel:
motor1.MotorStarten += new motorStartenDelegate(auto1.Anspringen);
Beim Instanziieren eines Delegaten übergibt man dem Konstruktor eine Methode mit der passenden Signatur (ohne die runden Klammern). Es ist natürlich auch möglich, ein Ereignis mit einem bereits vorhandenen Delegate zu verknüpfen.
Wird einem Ereignis mehr als ein Handler gegeben, werden diese beim Auslösen alle ausgeführt, und zwar in der Reihenfolge in welcher sie dem Ereignis zugewiesen wurden.
motor1.MotorStarten -= new motorStartenDelegate(auto1.Anspringen);
Hiermit wird die Methode auto1.Anspringen() vom Ereignis motor1.MotorStarten abgekoppelt.
GetInvocationList
Ereignisse verfügen über die Methode GetInvocationList. Falls kein Delegate an das Ereignis gebunden ist, wird null zurückgegeben. Ansonsten gibt GetInvocationList().Length darüber Auskunft, wieviele Delegates an das Ereignis gebunden sind. Wird ein Delegate an das Ereignis gebunden und danach wieder entfernt, gibt GetInvocationList ebenfall null zurück.
Da das Auslösen eines Ereignisses an welches kein Delegate gebunden ist, eine NullReferenceException auslöst, sollte vor jedem Auslösen mit GetInvocationList() geprüft werden, ob deren Rückgabewert != null ist, und das Ereignis nur dann ausgelöst werden. Dummerweise löst allein der Aufruf von GetInvocationList() bereits ein NullReferenceException aus. Deswegen bleibt nur, die NullReferenceException abzufangen, oder im Konstruktor jedem Event eine Dummy()-Methode zuzuweisen.
Ein Extenderanbieter. ErrorProvider ermöglichen Steuerelementen, den Benutzer auf fehlerhafte Eingaben hinzuweisen. Kann auch bei gebundenen Steuerelementen verwendet werden.
Um auf eine falsche Eingabe aufmerksam zu machen verwendet man die Methode SetError(Control control, string message). Die Errormeldung löscht man mit SetError(<Ctonrol>, "") wieder.
Um Excel zu verwenden muss man einen COM-Verweis auf Microsoft Excel Object Library hinzufügen. Excel ist ein Objekt vom Typ Excel.Application (es muss immer ein vollqualifizierter Name verwendet werden). Instanziiert wird es interessanterweise mit = new Excel.ApplicationClass().
Excel.Application exApp; Excel.Workbook newWorkbook; // Excel-File deklarieren Excel.Worksheet sheet; // Tabellenblatt deklarieren Excel.Range range; // Excel.Range-Objekt deklarieren exApp = new Excel.ApplicationClass(); exApp.Visible = true; // Excel sichtbar machen // Dieses Workbook enthält bereits eine Tabelle newWorkbook = exApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); sheet = (Excel.Worksheet) newWorkbook.ActiveSheet; range = (Excel.Range) sheet.Cells[1, 1]; range.Value2 = "1"; // "1" in Zelle A1 schreiben range = (Excel.Range) sheet.Cells[2, 1];
range.Value2 = "1";
range = (Excel.Range) sheet.Cells[3, 1];
range.Formula = "=SUMME(A1; A2)";
Namespace: System. Vaterklasse aller Exceptions.
| Member | Beschreibung |
|---|---|
Exception() |
Konstruktoren |
| Exception InnerException [get] | Falls man ursprüngliche Ausgabe beim Weiterreichen in eine neue verpackt hat. |
| string Message [get] | Beschreibung des Fehlers. |
| virtual string StackTrace [get] | Zeichenfolge, welche die Aufrufliste beschreibt. |
Will man eigene Exception-Klassen verwenden, sollte man diese von System.ApplicationException ableiten, siehe unter Ausnahme.
Sind Klassen welche Steuerelementen zusätzliche Funktionalität hinzufügen können. Beispiele sind ToolTip und ErrorProvider.
Meist verwendet man pro Formular nur ein Extenderanbieter, da eine Instanz mehreren Steuerelementen Zusatzfunktionalität hinzufügen kann.
Prüft Werte bereits bei der Eingabe auf ihre Gültigkeit.
Steuerelemente die Tastatureingaben entgegennehmen verfügen über die Ereignisse KeyDown, KeyPress und KeyUp.
Ereignisse KeyDown und KeyUp:
Werden vom Steuerelement welches den Fokus hat ausgelöst, wenn der Benutzer eine Taste drückt resp. sie loslässt. Methoden zur Behandlung dieser Ereignisse müssen über einen Parameter vom Typ KeyEventArgs verfügen. Instanzen dieser Klasse beschreiben welche Tastenkombination gedrückt wurde.
Siehe auch Formularprüfung.
Die Fähigkeit eines Steuerelements, Benutzereingaben entgegenzunehmen. Das Control welches den Fokus hat befindet sich immer auf dem aktiven Formular der Anwendung.
Um einem Steuerelement den Fokus zu geben ruft man dessen Methode Focus() auf. Sie gibt einen boolschen Wert zurück, der darüber Auskunft gibt, ob das Setzen des Fokus' erfolgreicht war. Unsichtbare oder deaktivierte Steuerelemente können den Fokus nicht erhalten. Die Eigenschaft CanFocus vom Typ bool sagt Ihnen, ob das Steuerelement den Fokus erhalten kann oder nicht.
Die Fokusereignisse treten in der folgenden Reihenfolge ein:
Enter und Leave werden ausgelöst, wenn das Control den Fokus erhält/verliert. GotFocus und LostFocus wenn es den Fokus erhalten/verloren hat.
Font (System.Drawing)
Wird am besten mit FontDialog erzeugt.
| Member | Beschreibung |
|---|---|
| Font(string fontFamily, float size, FontStyle style) | Konstruktor |
foreach (Schlüsselwort)
Mit einer foreach-Schleife kann man alle Elemente eines Arrays oder einer Auflistung durchlaufen.
Beispiel:
int[] myArray = new int[] {1, 2, 3, 4, 5}; foreach (int i in myArray) { // i ist die Iterationsvariable Console.WriteLine(i.ToString()); }
Die Array- oder Auflistungselemente müssen alle denselben Typ wie die Iterationsvariable (im Beispiel i) haben, ansonsten wird eine InvalidCastException ausgelöst. Eine gute Lösung ist, eine Iterationsvariable vom Typ object zu verwenden und mit der Methode GetType() den Typ des Elements abzufragen. Die Iterationsvariable ist schreibgeschützt, will man die Elemente durchlaufen und dabei Änderungen vornehmen verwendet man am besten die for-Schleife.
Es ist auch möglich eigene Collection-Klassen zu schreiben, deren Elemente mit foreach durchlaufen werden können.
Dafür muss die betreffende Klasse über eine Methode GetEnumerator() verfügen, welche ein Objekt zurückgibt das eine Methode bool MoveNext() und eine Eigenschaft Current besitzt. MoveNext() dient dazu, den Zeiger ein Element weiter zu bewegen und gibt true zurück solange weitere Elemente vorhanden sind. Die Eigenschaft Current gibt das aktuelle Objekt zurück.
Beispiel:
public class MyColl { string[] elements = {"Zebra", "Löwe", "Giraffe"}; // Die Elemente der Auflistung public string this[int index] { get { return elements[index]; } } public MyEnumerator GetEnumerator() { return new MyEnumerator(this); } public class MyEnumerator { int currIndex = -1; // speichert die aktuelle Zeigerposition MyColl coll; public MyEnumerator(MyColl coll) { this.coll = coll; } public bool MoveNext() { return(++currIndex < coll.elements.Length); } public string Current { get { return coll[currIndex]; } } } } public static void Main(string[] args) { MyColl meineColl = new MyColl(); foreach (string s in meineColl) { Console.WriteLine(s); } }
Das Durchlaufen eines Arrays mit foreach benötigt etwa 100 Mal länger als mit for (int i; ...).
Ist auch mit zwei Zählervariablen möglich:
for (int x = 0, int y = 5; x < y; x += 2, y++)...
ForeignKeyConstraint (System.Data)
| Member | Beschreibung |
|---|---|
| ForeignKeyConstraint(DataColumn parent, DataColumn child) | Konstruktor |
| System.Data.Rule UpdateRule | ... |
| System.Data.Rule DeleteRule | ... |
Die ForeignKeyConstraint tritt erst in Kraft, nachdem sie der Auflistung Constraints der DataTable hinzugefügt wurde.
Formulare (System.Windows.Forms)
Oberklasse: System.Windows.Forms.ContainerControl
Beim Anlegen eines neuen Windows Forms-Projekts wird automatisch ein Startformular mit dem Namen Form1 eingebunden. Weitere Formulare lassen sich mit Projekt|Windows Form hinzufügen... hinzufügen. In C# können nur Formulare welche über eine Main()-Methode verfügen als Startobjekt festgelegt werden (Projekt|Eigenschaften).
| Member | Beschreibung |
|---|---|
| Form ActiveMdiChild [get] | Das aktive Kindfenster. |
| void Activate() | Falls das Formular sichtbar ist, aber nicht den Fokus hat, erhält es diesen und rückt in den Vordergrund. Ist zu diesem Zeitpunkt eine andere Anwendung auf dem Bildschirm aktiv, beginnt die Fensterüberschrift in der Taskleiste zu blinken. |
| EventHandler Activated | Tritt ein beim Aufruf von Activate oder wenn der Benutzer das Formular in den Vordergrund bringt. |
| bool AutoScroll [get, set] | Legt fest, ob automatisch Scrollbalken erscheinen, falls ein Control ausserhalb des sichtbaren Bereichs platziert wird. Standardwert ist false. |
| Color BackColor [get, set] | Formularhintergrund. Wird für viele Controls automatisch auf den gleichen Wert eingestellt. |
| BindingContext BindingContext | Verwaltet die Bindungen aller Steuerelemente des Formulars. Bietet mit Indexer BindingContext[object bindung], BindingContext[object Bindung, string displayMember] Zugriff auf die Bindungen welche als BindingManagerBase zurückgegeben werden. |
| IButtonControl CancelButton [get, set] | Legt einen Button fest, der beim Drücken von ESC betätigt wird. |
| Size ClientSize [get, set] | Die Grösse des Clientbereichs im Formular. |
| void Close() | Schliesst das Formular, gibt es für die Garbage Collection frei. Das Formular kann danach nicht mehr mit Show() sichtbar gemacht werden. Ruft man diese Methode beim Startformular der Anwendung auf, wird die gesamte Anwendung geschlossen. |
| EventHandler Closed | Tritt ein, nachdem das Formular geschlossen wurde. |
| CancelEventHandler Closing | Tritt ein, wenn das Formular dabei ist, geschlossen zu werden, dieser Vorgang aber noch nicht beendet ist. Das Schliessen lässt sich verhindern, wenn man im Eventhander die Eigenschaft Cancel der als Parameter übergeben CancelEventArgs-Instanz auf true setzt. |
| ControlCollection Controls [get] | Auflistung mit allen Steuerelementen des Formulars. |
| EventHandler Deactivate | Wird ausgelöst, wenn das Formular den Fokus verliert, resp. beim Aufruf von Hide oder Close. Wird (wie auch Activated) nur ausgelöst, wenn sich der Fokus innerhalb des Programms verschiebt. |
| Color ForeColor [get, set] | Die Textfarbe des Formulars. |
| FormBorderStyle FormBorderStyle | Legt fest, ob das Formular vom Benutzer in der Grösse geändert werden kann. Einige Werte von FormBorderStyle sind FixedDialog und Sizable. |
| void Hide() | Hat den gleichen Effekt wie das Setzen von Visible auf false. Das Formular bleibt also im Arbeitsspeicher. |
| bool IsMdiContainer | Muss auf true gesetzt werden, um Kindfenster haben zu können. |
| KeyPress | Wird ausgelöst, wenn der Benutzer auf eine Taste drückt die einen entsprechenden ASCII-Wert hat. Dem Ereignishandler wird eine Instanz von
KeyPressEventArgs übergeben, dessen Eigenschaft KeyChar das ASCII-Zeichen der Taste enthält. Die Reihenfolge der Ereignisse bei einem Tastendruck ist die folgende: KeyDown |
| bool KeyPreview [get, set] | Falls true, erhält das Formular die Ereignisse KeyPress, KeyDown und KeyUp bevor das fokussierte Steuerelement diese empfängt. Standardwert ist false. |
| void LayoutMdi(MdiLayout anordnung) | Ordnet die Kindfenster neu an. Die Werte der Enumeration MdiLayout sind ArrangeIcons, Cascade, TileHorizontal, TileVertical. |
| EventHandler Load | Tritt ein, wenn das Formular zum ersten Mal in den Arbeitsspeicher geladen wird. Es tritt also über die gesamte Lebensdauer nur einmal auf. Beim erstmaligen Aufrufen von Show oder ShowDialog. |
| bool MaximizeBox [get, set] | |
| Size MaximumSize [get, set] | Maximale Grösse, auf welche das Formular vergrössert werden kann. |
| Form[] MdiChildren [get] | Array mit den Kindfenstern. |
| Form MdiParent | Muss bei Kindfenstern auf das Hauptformular gesetzt werden. |
| MainMenu Menu [get, set] | |
| bool MinimizeBox [get, set] | |
| Size MinimumSize [get, set] | Minimale Grösse auf welches das Formular verkleinert werden kann. |
| double Opacity [get, set] | Legt die Opazität fest. 0 = durchsichtig, 1 = undurchsichtig. |
| PaintEventHandler Paint | Tritt ein, wenn das Formular neu gezeichnet wird. |
| void Refresh() | Erzwingt das Neuzeichnen. |
| void Show() | Lädt eine Instanz einer Formularklasse in den Arbeitsspeicher und zeigt es auf dem Bildschirm an. Die Eigenschaft Visible wird dabei auf true gesetzt. Befindet sich ein Formular bereits im Arbeitsspeicher ist aber unsichtbar, hat der Aufruf von Show() den gleichen Effekt wie das setzen von Visible auf true. |
| void ShowDialog() | Hat fast den selben Effekt wie Show(), allerdings wird das Formular als modaler Dialog angezeigt, was bedeutet dass es erst geschlossen werden muss, bevor ein anderes Formular den Fokus erhalten kann. |
| bool ShowInTaskbar [get, set] | Legt fest, ob das Formular in der Taskleiste erscheint. |
| FormStartPosition StartPosition [get, set] | Legt fest, an welcher Stelle sich das Formular beim ersten Anzeigen auf dem Bildschirm öffnet. Diese Eigenschaft kann auf jeden Wert der Enumeration FormStartPosition (CenterParent, CenterScreen, Manual, WindowsDefaultBounds, WindowsDefaultLocation) gesetzt werden. |
|
bool TopMost [get, set] |
Falls true, ist das Formular immer an oberstet Stelle. |
Diese Variante der Eingabevalidierung prüft die Daten nachdem der Benutzer sämtliche Felder ausgefüllt hat. Siehe auch Feldprüfung.
Ermöglicht unter anderem, eine Assembly im Globalen Assembly Cache (GAC) zu installieren. Am besten benutzt man es mit der Visual Studio .NET Eingabeaufforderung.
Beispiel:
gacutil /i myAssembly.dll
Normalerweise ein Thread mit niedriger Priorität. Er tritt in Aktion, wenn der Prozessor nicht ausgelastet ist. Wird der Speicher knapp, rückt der Garbage-Collection Thread in der Priorität nach oben. Das Vorgehen der Speicherfreigabe macht die Anwendung schneller, hat aber den Nachteil, dass es nicht deterministisch ist. Man hat keine Kontrolle darüber, wann der Destruktor eines Objekts aufgerufen wird.
Im .NET-Framework steht die verwaltete Version von GDI (Graphics Device Interface) unter dem Namen GDI+ zur Verfügung. Diese Schnittstelle ist im Namespace System.Drawing.
Global Assembly Cache (GAC)
DLL-Assemblies mit starkem Namen können mit gacutil.exe in den GAC installiert werden. Das Kopieren der DLL-Datei in \WINDOWS\assembly\ führt zum gleichen Resultat.
Graphics (System.Drawing)
Graphics-Objekte stellen die Zeichenfläche eines visuellen Elements wie eines Formulars oder eines Steuerelements dar. Da sie immer mit einem visuellen Element verknüpft sind, können sie nicht direkt instanziiert werden. Alle Klassen die von Control erben (inkl. Form) verfügen über die Methode CreateGraphics welche einen Verweis auf das zugehörige Graphics-Objekt zurückgibt.
Graphics verfügt über eine vielzahl von Methoden für das Zeichnen von Linien und Formen. Methoden die mit Draw... beginnen, zeichnen Figuren die aus Linien bestehen, Methoden die mit Fill... beginnen zeichnen ausgefüllte Formen.
| Methode | Beschreibung |
|---|---|
| DrawLine(Pen, Point, Point) DrawLine(Pen, int, int, int, int) |
Zeichnet eine Linie die zwei Punkte verbindet. |
| DrawLines(Pen, Point[]) | Zeichnet Linien, die mehrere Punkte verbinden. |
| DrawPath(Pen, GraphicsPath) | Zeichnet eine komplexe Form. |
| DrawPie(Pen, Rectangle, float, float) | Zeichnet einen Sektor einer Ellipse, die beiden float-Parameter definieren Startwinkel und Grösse des Sektors. |
| DrawPolygon(Pen, Point[]) | Zeichnet ein Vieleck. |
| DrawRectangle(Pen, int, int, int, int) DrawRectangle(Pen, Rectangle) |
Zeichnet ein Rechteck. |
| DrawString(string, Font, Brush, Rectangle) | Schreibt einen Text. |
| SizeF MeasureString(string, Font) | Überladen, berechnet die Grösse des angegebenen Strings für den angegebenen Font. |
| SizeF MeasureString(string, Font, int width) | Berechnet die Grösse, wenn die Breite maximal width sein darf, d.h. der Text wird wenn nötig umgebrochen. |
| DrawImage(Image, Rectangle) | Zeichnet ein Image. |
Für die meisten dieser Methoden gibt es auch eine Fill... - Version.
static Graphics FromImage(Image image)
Erzeugt ein Graphics-Objekt zu einem Bild. Mit dem Graphics-Objekt kann man das Bild bearbeiten, auch wenn es nicht sichtbar ist.
Grafik die dauerhaft auf einem Formular sichtbar sein soll, bindet man am besten an das Ereignis Form.Paint.
GroupBox (System.Windows.Forms)
Namespace: System.Windows.Forms. Ein Containersteuerelement mit Rahmen und der Möglichkeit, einen Titel festzulegen. Will man eine GroupBox mit Scrollbalken erzeugen, kann man ein Panel auf eine GroupBox legen, dessen Eigenschaft Dock auf DockStyle.Fill setzen und die Controls dem Panel hinzufügen.
Mit Haltepunkten kann man Codezeilen und/oder Bedingungen festlegen, welche die Programmausführung anhalten.
Einen Haltepunkt setzt man, indem man in den grauen Bereich links des Codefensters klickt. Bei Rechtsklick auf einen Haltepunkt erscheint ein Kontextmenü welches erlaubt, den Haltepunkt zu deaktivieren.
Haltepunkte (Fenster)
Hier sind alle Haltepunkte des Projekts mit ev. vorhandener Bedingung und Codestelle aufgelistet.

Das Kontrollkästchen links des Haltepunktes ermöglicht, den Haltepunkt zu deaktivieren.
Ein Speicherbereich in welchem Instanzen von Klassen gespeichert werden. Nicht mehr benötigte Objekte im Heap werden durch den Garbage Collector zerstört. Siehe auch Stack.
Help (System.Windows.Forms)
Nicht instanziierbare Klasse die nur statische Methoden enthält.
| Member | Beschreibung |
|---|---|
|
static void ShowHelp(Control parent, string url) |
Zeigt die HTML-Seite an, deren URL oder Pfad im Parameter url angegeben wird. |
| static void ShowHelp(Control parent, string url, HelpNavigator navigator) | navigator legt fest, was angezeigt wird. Die Enumeration HelpNavigator hat die Werte TableOfConents, Find, Index, Topic. |
|
static void ShowHelp(Control parent, string url, string keyWord) |
Sucht im HTML-File nach keyWord. |
HelpProvider (Extenderanbieter)
Namespace: System.Windows.Forms.
| Member | Beschreibung |
|---|---|
| string HelpNameSpace [get, set] | Pfad oder URL der Hilfedatei. |
|
void SetHelpString(Control control, string helpText) |
Ordnet control den Hilfetext helpText zu. Dieser erscheint wenn control den Fokus hat und der Anwender auf F1 drückt; jedoch nur, wenn HelpNameSpace keine Hilfedatei zugeordnet ist. |
| string GetHelpString(Control control) | Gibt den Hilfetext zurück, welcher control mit SetHelpString zugewiesen wurde. |
Hinweis:
Kompilierte Hilfedateien vom Typ .chm können mit dem HTML-Help-Workshop erstellt
werden (Programme\Visual Studio .NET\Common7\Tools\hcw.exe). Mit dem älteren
Hilfeformat *.hlp kommt HelpProvider nicht zurecht.
IDataObject (System.Windows.Forms)
Inhalte der Zwischenablage (siehe Clipboard) werden als Objekt welches dieses Interface implementieren zurückgegeben.
| Member | Beschreibung |
|---|---|
| string[] GetFormats() | Gibt einen Überblick über die verfügbaren Datentypen. |
Siehe auch DataObject.
Deklariert die Methode void Dispose(). Bei der Verwendung grosser Objekte kann es sinnvoll sein, die Speicherbereinigung explizit auszuführen. Da der Destruktor nicht explizit aufgerufen werden kann, geschieht dies über eine Methode.
Bei der Verwendung von IDisposable muss beachtet werden:
IIdentity (System.Security.Principal)
Wichtige implementierende Klassen sind: WindowsIdentity und GenericIdentity.Bei der imperativen Sicherheit werden Ausführungsberechtigungen zur Laufzeit angefordert. Man kreiert Permission-Objekte welche die Berechtigungen repräsentieren, die der Code verlangt. Siehe auch deklarative Sicherheit.
Die aus Visual Basic bekannten Standardeigenschaften heissen in C# Indexer. Sie ermöglichen es, unter dem Namen des betreffenden Objekts eine ganze Gruppe von Objekten zur Verfügung zu stellen. Bei der Implementierung verwendet man statt eines Eigenschaftennamens das Schlüsselwort this.
Beispiel:
private int[] intArray; ... public int this[int index]
{ get { return intArray[index]; } set { intArray[index] = value; } }
Die ganzzahligen Typen (byte, short, int, long, sbyte, ushort, uint, ulong) werden unter dem Begriff Integertypen oder integrale Typen zusammengefasst. Man kann ihnen auch Literale in der hexadezimalen Schreibweise zuweisen, wenn man diesem 0x voranstellt.
Beispiel:
int myInteger = 0xAF; // entspricht 176
Interface (Schnittstelle)
Schnittstellen deklarieren Methodenköpfe, Eigenschaften und Ereignisse. Sie können von Klassen oder Strukturen implementiert werden, was bedeutet dass die Klasse alle im Interface deklarierten Member implementieren muss. Zugriffsmodifizierer sind in Interfaces nicht erlaubt. Alle Member sind implizit public.
Bei der expliziten Implementation eines Schnittstelle, (EII, Explicit Interface Implementation) stellt man den Namen der Schnittstelle vor die Implementierung des Members. Solche Member können nur mit Referenzen vom Typ der Schnittstelle angesprochen werden.
Intermediate Language (IL)
Maschinennahe Sprache, welche von der CLR verstanden wird. IL-Code befindet sich in .exe- und .dll-Dateien.
internal (Schlüsselwort)
Dieser Zugriffsmodifizierer setzt die Sichtbarkeit auf Assembly-Ebene.
IPermission (System.Security)
Alle Berechtigungen (Permission-Objekte) müssen diese Schnittstelle implementieren.
| Member | Beschreibung |
|---|---|
| IPermission Copy() | Erstellt eine Kopie der Berechtigung und gibt sie zurück. |
| void Demand() | Prüft ob der aufrufende Code berechtigt ist, auf die Ressource zuzugreifen. Falls nicht, wird eine SecurityException ausgelöst. |
| IPermission Intersect(IPermission target) | Erstellt eine IPermission welche die Schnittmenge mit target ist und gibt sie zurück. |
Siehe auch Permissions.
Namespace: System.Security.Principal.
Implementierende Klassen: GenericPrincipal,
WindowsPrincipal.
Ein Principal stellt die Itentität und Rolle eines Benutzers dar. Principal-Instanzen kapseln eine Identity und eine Rolle. Die Rolle kann eine Windows-Benutzer Gruppe oder etwas selbst definiertes sein.
| Member | Beschreibung |
|---|---|
| IIdentity Itentity [get] | Gibt das dem Principal zugeordnete IIdentity-Objekt zurück. |
| bool IsInRole(string role) | Überprüft ob dieser Principal in der Rolle role ist. |
is wird verwendet, um zu prüfen ob ein Objekt mit einem gegebenen Typen vereinbar ist. obj is TypA gibt true zurück, wenn obj mit dem Typ TypA vereinbar ist.
Namespace: System.Windows.Forms.
| Member | Beschreibung |
|---|---|
| bool Alt [get] | Gibt an, ob ALT gedrückt wurde |
| bool Control [get] | Gibt an, ob CTRL resp. STRG gedrück wurde. |
| Keys KeyCode [get] | Gibt einen Wert der Enumeration Keys zurück, der die gedrückte/losgelassene Taste beschreibt |
Namespace: System.Windows.Forms. Gibt das Zeichen an, das aus einem Tastendruck des Benutzers resultiert.
| Member | Beschreibung |
|---|---|
| bool Handled [get, set] | Setzt man Handled auf true, wird das Ereignis nicht an das aktive Control gesendet. |
| char KeyChar [get] | Das aus dem Tastendruck resultierende ASCII-Zeichen. |
Definition:
class <Name> : <Oberklasse>, <implementierte Interfaces>
{
<Felder-, Eigenschaften-, Methoden- und Ereignisdefinitionen>
}
Namespace: System.Drawing. Enthält vordefinierte Farben.
In Konfigurationsdateien kann man Eigenschaften einer Anwendung konfigurieren und Informationen über den Speicherort und die Version von abhängigen Assemblies festlegen. Konfigurationsdateien müssen im gleichen Verzeichnis wie die Applikation liegen und folgendem Namens-Schema entsprechen: <Anwendungsname>.exe.config. Siehe auch AppSettingsReader.
Mit Ausnahme des <configuration>-Elements sind alle Elemente optional.
Wichtige Elemente von Konfigurationsdateien (innerhalb von <configuration>)
| Element | Beschreibung |
|---|---|
| <startup> | Enthält nur das Element <requiredRuntime> welches angibt, welche CLR-Version genutzt werden soll. |
| <runtime> | Angaben über das Binden der Assembly und das Verhalten der Garbage Collection. |
| <system.net> | Informationen für Internetanwendungen. |
| <configSections> | Benutzerdefinierte Konfigurationseinstellungen (dynamische Eigenschaften). |
| <system.diagnostics> | Konfiguration der Klassen Trace und Debug. |
Definition:
public const double Pi = 3.14159;
Auf Konstanten kann nicht über Referenzen zugegriffen werden, sondern nur über den Klassennamen. Konstanten können vom Typ einer selbstdefinierten Enumeration sein, nicht jedoch einer selbstdefinierten Klasse oder Array. Wie bei Variablen, können bei Konstanten sämtliche Zugriffsmodifizierer (public, private, internal, protected) verwendet werden.
Definiert man explizit einen Konstruktor, wird nicht automatisch ein Standardkonstruktor erzeugt. Beim Ausführen eines Konstruktors wird automatisch der Standardkonstruktor der Oberklasse aufgerufen, falls nicht explizit mit base ein anderer Konstruktor der Oberklasse aufgerufen wird.
Konstruktor der Oberklasse aufrufen
class Vater { public Vater(string name) {...} ... } class Sohn : Vater { public Sohn(string name) : base(name) { // Ruft Konstruktor von Vater auf ... } ... }
Um einen Oberklassenkonstruktor aufzurufen fügt man dem Konstruktorkopf einen Doppelpunkt und das Schlüsselwort base gefolgt von der Parameterliste hinzu.
Will man in einem Konstruktor einen anderen Konstruktor der selben Klasse aufrufen lässt sich die mit this.<Konstruktorname> machen.
Beispiel:
class
MyComponent {
private object myContainer;
private string myName;
public MyComponent(object
container) {
this.myContainer =
container;
}
public MyComponent(object
container, string name) :
this(container) {
// ruft anderen Konstruktor auf
this.myName
= name;
}
}
Treten auf, wenn eine Anweisung ausgeführt werden soll die unmöglich oder nicht erlaubt ist, beispielsweise eine Division durch 0 oder das Lesen aus einer Datei die nicht existiert. Wenn eine Anwendung auf einen Laufzeitfehler trifft, wird eine Ausnahme ausgelöst.
Namespace: System.ComponentModel. Abstrakte Basisklasse für alle Lizenzen. Eine Lizenz wird für eine bestimmte Instanz einer Komponente erteilt.
Namespace: System.ComponentModel, versiegelt. Stellt Eigenschaften und Methoden bereit, um eine Komponente mit einer Lizenz zu schützen.
| Member | Beschreibung |
|---|---|
| static void Validate(Type type) static void Validate(Type type, object instance) |
Validiert die Lizenz, indem sie die Methode GetLicense des (im LicenseProviderAttribute der Komponente angegebenen) LicenseProviders aufruft. Löst eine LicenseException aus, wenn keine gültige License erteilt werden kann. |
| static bool IsValid(Type type) | Gibt zurück, ob für den angegebenen Typ eine gültige Lizenz erteilt werden kann. |
| static bool IsValid(Type type, object instance, out License license) | Prüft, ob gültige Lizenz erteilt werden kann. Falls ja wird diese erzeugt. |
Namespace: System.ComponentModel. Abstrakte Basisklasse zur Implementierung eines eigenen Lizenzproviders (empfohlen). Die von Microsoft zur Verfügung gestellte Implementation (LicFileLicenseProvider) ist eher zu Demonstrationszwecken gedacht.
| Member | Beschreibung |
|---|---|
| abstract License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) | Wird von LicenseManager.Validate aufgerufen. Ruft Lizenzen (Licenses) ab und prüft mit deren Methode IsValid deren Gültigkeit, falls ja wird eine gültige License zurückgegeben, andernfalls wird das Steuerelement nicht geladen. |
Siehe auch: Lizenzierung, LicenseManager.
Namespace: System.Windows.Forms. Der Collection Items kann mit Items.Add ein Objekt übergeben werden. In der Listbox dargestellt wird der Rückgabewert von ToString() des Objekts.
| Member | Beschreibung |
|---|---|
| bool IntegralHeight | Ist standardmässig true, was bedeutet dass die Höhe nur ein Vielfaches der Höhe eines Items betragen darf (Items werden also immer vollständig dargestellt). |
| Items.Add(object item) | |
| Items.AddRange(object[] items) | |
| Items.Clear() | Entfernt alle Einträge der Liste. |
| bool GetSelected(int index) | Gibt true zurück, falls das Item mit dem entsprechenden Index ausgewählt ist. |
| bool MultiColumn | Gibt an, ob die Items in mehreren Spalten angezeigt werden, falls ja kann die Spaltenbreite mit ColumnWidth eingestellt werden. |
| EventHandler SelectedIndexChanged | |
| int SelectedIndex [get, set] | Ist -1 falls kein Eintrag ausgewählt ist. |
| object SelectedItem [get, set] | |
| SelectionMode SelectionMode | Standardwert: SelectionMode.One. SelectionMode.MultiSimple ermöglicht durch einfaches Klicken mehrere Werte auszuwählen (weiterer Klick macht die Selektion rückgängig). Bei SelectionMode.MultiExtended kann man mit Shift einen zusammenhängenden Bereich und mit Control mehrere Elemente auswählen. |
| bool Sorted [get, set] | Bestimmt, ob die Items alphabetisch sortiert werden. Ist standardmässig false. |
| string Text [get, set] | Der Text des ausgewählten Items. |
Namespace: System.Windows.Forms.
| Member | Beschreibung |
|---|---|
| Columns.Add(string label, int width, HorizontalAlignment alignment) | Fügt eine Spaltenüberschrift hinzu. |
| View View [get, set] | Die Ansicht (entsprechend Windows-Explorer). |
| ListView.ListViewItemCollection Items | Eine Auflistung der ListViewItems dieser ListView. Auf die Items kann via Indexer zugegriffen werden. |
| ListViewItem Items.Add(ListViewItem item) | |
| ListViewItem Items.Add(string text) | |
| ImageList LargeImageList [get, set] | Die ImageList mit den Bildern für die Darstellung "LargeIcon". |
| ImageList SmallImageList [get, set] | Die ImageList mit den Bildern für die Darstellung "SmallIcon". |
| SelectedItems | Gibt eine Auflistung mit den selektierten Items zurück. |
Namespace: System.Windows.Forms. Die Einträge einer ListView.
| Member | Beschreibung |
|---|---|
| ListViewItem(string[] items) | Konstruktor |
| int ImageIndex [get, set] | Der Index des zugehörigen Bildes in der ImageList der ListView. |
| SubItems | Eine Auflistung mit den Unterelementen. |
ListViewSubItem SubItems.Add(string text) |
Fügt ein SubItem mit entspr. Text hinzu. |
| ListViewSubItem SubItems.AddRange(string[] text) | Fügt mehrere SubItems hinzu. |
| ListViewSubItem SubItems.Add(string text, Color foreColor, Color backColor, Font font) |
Lizenzierung eines Steuerelements ermöglicht dessen Autor sein geistiges Eigentum zu schützen, so dass nur ermächtigte Personen es nutzen können.
Soll ein Steuerelement durch Lizenzierung geschützt werden, muss es ein LicenseProviderAttribute haben. Dieses gibt an, welcher LicenseProvider zur Validierung der Lizenz eingesetzt wird.
Eine .LIC-Datei wird vom Entwickler kreiert und kann sich überall befinden (wird vom LicenseProvider spezifiziert). Eine .LICX-Datei wird von Visual Studio basierend auf der .LIC-Datei erzeugt. Sie muss im gleichen Verzeichnis liegen wie die Assembly welche die lizenzierte Komponente benutzt.
Eine Lizenzverwaltung für ein Steuerelement implementieren:
Beispiel:
[LicenseProvider(typeof(MyLicenseProvider))] public class MyControl : Control { private License myLicense; public MyControl() { // Prüft Lizenz mit MyLicenseProvider LicenseManager.Validate(typeof(MyControl), this); ... } }
Enthält eine Auflistung von von MenuItem-Steuerelementen welche die Menüstruktur bilden. Um einem Formular eine Menüleiste zu geben fügt man ihm eine MainMenu-Komponente hinzu. In der Menüleiste des Formulars erscheint ein Feld mit der Schrift "Hier eingeben", gibt man einen Text ein, erzeugt man damit ein neues Menüelement. Dabei wird automatsich eine neue Instanz von MenuItem erzeugt.
Um mehrere Menüeinträge voneinander abzutrennen gibt man als Text eines Menüelements nur einen Bindestrich ein. Dieses wird dann als waagrechter Balken dargestellt.
Ermöglichen dem Benutzer ein Menü zu öffnen indem er auf ALT und die entsprechende Zugriffstaste drück. Im geöffneten Menü wählt er einen Eintrag aus, indem er wiederum die zugehörige Zugriffstaste drückt. Eine Zugriffstaste legt man fest, indem man in der Eigenschaft Text des Menüelements vor den betreffenden Buchstaben ein "&" setzt.
Ermöglichen direkt auf Menüelemente zuzugreifen, es kann sich auch um einzelne Tasten handeln. Tastenkombinationen werden im Menü rechts neben dem Menüelement angezeigt, es sei denn die Eigenschaft ShowShortcut ist auf false gesetzt. Tastenkombinationen können im Eigenschaftenfenster mit der Eigenschaft Shortcut eingestellt werden.
Click: wird beim Anklicken des Menüelements ausgelöst.
Select: wird ausgelöst, wenn der User ein Menüelement mit der Maus (ohne Klick) oder mit der Zugriffstaste anwählt.
Popup: wird unmittelbar bevor die Elemente eines Menüs angezeigt werden ausgelöst. Eignet sich um Menüelemente zur Laufzeit zu aktivieren/deaktivieren bevor sie angezeigt werden.
Dazu kann die Eigenschaft Enabled auf true oder false gesetzt werden. Damit werden auch die Zugriffstasten und Tastenkombinationen deaktiviert.
Die Methoden, Felder, Eigenschaften und Ereignisse einer Klasse oder Struktur.
Die Menüs, Menüeinträge und Untermenüs einer Menüleiste sind Instanzen von MenuItem.
| Member | Beschreibung |
|---|---|
| bool Checked | Falls true, wird neben des Menüeintrags ein Haken dargestellt. Der Standardwert ist false. |
| MenuItem CloneMenu() | Kopiert das Menüelement mit all seinen Membern und gibt es zurück. |
| Menu.MenuItemCollection MenuItems | Eine Auflistung aller Untermenüs dieses Menüeintrags. |
| MenuItem(string name, EventHandler eventHandler) | Ein Konstruktor. |
| string Text | Der dargestellte Text. |
Ermöglichen die Weitergabe von Komponenten (z.B. Steuerelemente). Mergemodulprojekte erstellen ein verteilbares Paket, welches mit einem bestehenden Setup-Projekt zusammengelegt werden muss. Es beinhaltet auch Informationen darüber, wie und wo die Assembly installiert wird.
Namespace: System.Windows.Forms. Diese Klasse wird für das Anzeigen von Meldungen verwendet, die MessageBox kann ein Set von Buttons haben und je nach gedrücktem Button einen Wert zurückgeben. Der zurückgegebene Wert ist vom Typ DialogResult, eine Enumeration mit den Werten Ignore, No, None, OK, Retry, Yes.
Die Methode Show() ist mehrfach überladen. Um eine MessageBox mit Meldungstext, Titel und Ja- sowie Nein-Button zu erzeugen geht man wie folgt vor:
DialogResult dlgResult = MessageBox.Show( "Wollen Sie wirklich abbrechen?", // Meldungstext "Abbrechen", // Überschrift der MessageBox MessageBoxButtons.YesNo); // Ja- und Nein- Button // dlgResult auswerten
MessageBoxButtons ist wiederum eine Enumeration mit den Werten AbortRetryIgnore, OK, OKCancel, RetryCancel, YesNo, YesNoCancel, welche je einem Set von Buttons entsprechen.
Ohne Zugriffsmodifizierer deklarierte Methoden sind in C# private.
In C# hat jede Methode einen Rückgabetyp, bei Methoden die keinen Wert zurückgeben heisst dieser void. Innerhalb einer Methode deklarierte Variablen (lokale Variablen) existieren nur während deren Ausführung und sind nur innerhalb der Methode sichtbar. Innerhalb eines Blocks deklarierte Variablen sind sogar nur innerhalb dieses Blocks sichbar und existent. Im Gegensatz zu Visual Basic .NET ist es in C# nicht möglich, verschiedene Aufrufe überdauernde Variablen zu deklarieren.
Die Parameterübergabe erfolgt standardmässig by value, dies kann allerdings mit dem Schlüsselwort ref geändert werden. Objekte werden immer by reference übergeben.
Heisst ein Parameter oder eine lokale Variable gleich wie eine Instanzvariable der betreffenden Klasse, kann mit this.<Variablenname> auf die Instanzvariable zugegriffen werden.
Eine Datei die Quellcode enthält.
Namespace: System.Windows.Forms
Oberklasse: System.EventArgs
Stellt Daten für die Ereignisse MouseUp, MouseDown und MouseMove bereit.
| Member | Beschreibung |
|---|---|
| MouseButtons Button [get] | Die Maustaste, welche gedrückt wurde. |
| int Clicks [get] | Wie oft die Maustaste gedrückt wurde. |
| int Delta [get] | Die Anzahl Arretierungen, um welche das Mausrad gedreht wurde (mit Vorzeichen). |
| int X [get] | X-Koordinate der Maus |
| int Y [get] | Y-Koordinate der Maus |
Namensräume gruppieren logisch zusammengehörende Typen hierarchisch. Im Namespace System.Windows.Forms sind beispielsweise alle Typen für Windows-Formulare und Steuerelemente zusammengefasst. Auf untergeordnete Namespaces kann mit einem . zugegriffen werden.
Deklaration:
namespace Kunden { class Stammkunde : Kunde { ... } } // Ende Namespace Kunden
Ein Namespace kann sich über mehrere Dateien erstrecken, es können aber auch mehrere Namespaces in einer Datei definiert werden.
Folgende Schreibweisen sind äquivalent:
namespace TopNamespace { namespace SubNamespace { namespace SubSubNamespace { class bla .... } } }
namespace TopNamespace.SubNamespace.SubSubNamespace { class bla .... }
Tiefe Verschachtelung bringt keine Performanceeinbussen mit sich.
Stellt (meist erweiterbare) Klassen und Schnittstellen zur Verfügung welche für die Integration in die CLR geschaffen wurden. Sie ist hierarchisch in Namespaces (Namensräume) aufgeteilt.
Der Native Image Generator erstellt ein systemeigenen Bild einer verwalteten Assembly. Nach dem Erstellen dieses Abbildes verwendet die CLR dieses bei jedem Ausführen der Assembly. Dies sorgt für schnelleres Laden und Ausführen.
Syntax:
Ngen [options] AssemblyName|AssemblyPath
Namespace: System.Windows.Forms. Erlaubt die
Auswahl eines numerischen Wertes durch das Klicken auf Pfeile.![]()
| Member | Beschreibung |
|---|---|
| decimal Increment [get, set] | |
| decimal Maximum [get, set] | |
| decimal Minimum [get, set] | |
| EventHandler ValueChanged |
Namespace: System.Data.OleDb.
Beispiel für einen ConnectionString um auf Access-Datenbank zuzugreifen: "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\\Nordwind\\Nordwind.mdb".
Namespace: System.Data.OleDb. Werden in der Parameters-Auflistung von OleDbCommand-Objekten verwaltet. Für die Parameter werden im CommandText des OleDbCommands "?" als Platzhalter verwendet. Die Reihenfolge muss mit der Reihenfolge der Parameter in der Auflistung Parameters übereinstimmen.
| Member | Beschreibung |
|---|---|
| DbType DbType [get, set] | Der Parametertyp wie er im CTS vorhanden ist. DbType und OleDbType hängen zusammen. Wird der eine Wert gesetzt, ändert sich der andere entsprechend. |
| OleDbType OleDbType [get, set] | |
| object Value [get, set] | Der Wert, welchen der Parameter darstellt. |
Namespace: System.Data.OleDb. Aufzählung aller OleDB-Datentypen.
C# erlaubt es, Operatoren für selbstdefinierte Struktur-Typen zu überladen.
Es gelten folgende Einschränkungen:
Beispiel: Operatoren für die Struktur Complex (komplexe Zahl)
struct Complex { double r; double i; public Complex(double r, double i) { this.r = r; this.i = i; } public static Complex operator+ (Complex links, Complex rechts) { return new Complex(links.r + rechts.r, links.i + rechts.i); } public static Complex operator* (Complex links, Complex rechts) { return new Complex(links.r * rechts.r - links.i * rechts.i, links.r * rechts.i + links.i * rechts.r); } }
Namespace: System.Windows.Forms. Ein Containersteuerelement welches zwar keine Überschrift, dafür Bildlaufleisten zur Verfügung stellt.
Parameter werden in C# standardmässig by value übergeben. Eine Übergabe als Referenz lässt sich mit dem Schlüsselwort ref erzwingen. Verweistypen werden immer als Referenz übergeben.
Ein Parameter der mit dem Modifizierer params deklariert ist und einem eindimensionalen Array-Typ angehört (jagged-Arrays sind auch möglich, da sie eigentlich eindimensionale Arrays sind). Eine Methode kann nur einen Parameter-Array aufweisen, dieser muss der letzte sein.
Beispiel:
public int Calculate(char operator, params int[] values) {...
Diese Methode kann wie folgt aufgerufen werden:
int X = <Klassenname>.Calculate('+', 1, 4);
int X = <Klassenname>.Calculate('-', 1, 6, 4, 6);
Der Parameter-Array ermöglicht also, eine beliebige Anzahl (auch 0) von Parametern des enstprechenden Typs zu übergeben. Es ist auch möglich, einen Ausdruck zu übergeben der implizit in einen Array des entsprechenden Typs konvertiert werden kann.
Namespace: System.Drawing. Repräsentiert einen Stift mit einer Farbe und einer Strichdicke. Wird benötigt um mit Graphics-Methoden Figuren zu zeichnen.
Konstruktoren:
Pen(Color color)
Pen(Color color, float width)
Namespace: System.Drawing. Versiegelte Klasse mit statischen Membern vom Typ System.Drawing.Pen.
Windows 2000 und Windows XP verfügen über das Tool perfmon.exe mit welchem man die Leistung eines Programms messen kann. Er erlaubt, Leistungsdaten grafisch anzuzeigen oder in eine Protokolldatei zu schreiben.
Permission-Objekte repräsentieren die Berechtigung auf eine geschützte Ressource zuzugreifen. Sie beschreiben auch, welche Operationen auf die Ressource angewendet werden dürfen. Permissions werden von der CLR gewährt oder verweigert. Man kann Permissions durch zusätzliche Informationen genauer definieren.
Beispiel:
Eine FileIOPermission kann so konfiguriert werden, dass nur Zugriffe auf eine
bestimmte Datei erlaubt sind.
Aufgerufener Code kann verlangen, dass der Aufrufer bestimmte Permissions hat (Demanding Permissions).
Alle Permissions sind von System.Security.CodeAccessPermission abgeleitet.
Es werden drei Typen von Permissions unterschieden:
Code Access Permissions: involviert Zugriff auf geschützte Ressourcen.
Identity Permissions: involviert Zugriff aufgrund Legitimationen (Credentials) welche Teil des Codes selbst sind
Role-based Permissions: steuern Zugriff basierend auf dem Benutzer unter welchem der Code läuft.
Mehrere Permissions können zu Permission Sets zusammengefasst werden, eine oder mehrere Permissions die als eine Einheit gewährt werden. Es ist nicht möglich, eine Permission selbst zu gewähren, will man eine einzelne gewähren muss man sie in ein Permission Set kapseln.
Mit der Methode Demand() fordert die Permission die Berechtigung welche sie repräsentiert vom System an. Wird sie nicht gewährt, wird eine Exception ausgelöst.
Siehe auch IPermission
Namespace: System.Drawing. Stellt einen Punkt mit int-Werten für X und Y dar.
Die CLR stützt sich bei der Entscheidung ob Code ausgeführt werden kann auf Vorgaben und Regeln, der sogenannten Policies. Diese sind hierarchisch auf den Ebenen Enterprise, Machine, User, AppDomain organisiert.
Die Konfiguration wird über XML-Dateien vorgenommen:
Auf Maschinen-Ebene: %CLRInstallationsVereichnis%\config\
auf User-Ebene: %USERPROFILE%\application data\Microsoft\CLR security
config\vxx.xx\
Namespace: System.Drawing.Printing. Ermöglicht dem Benutzer einen Drucker auszuwählen. Sollte vor PrintPreviewDialog angezeigt werden.
Namespace: System.Drawing.Printing. Stellt ein gedrucktes Dokument dar.
| Member | Beschreibung |
|---|---|
| void Print() | Startet einen Druckauftrag, d.h. es werden ein oder mehrere PrintPage-Ereignisse ausgelöst. An diese muss man einen PrintPageEventHandler binden und darin die Druck-Funktionalität implementieren. |
| PrintPageEventHandler PrintPage | Eventhandler müssen folgende Signatur haben: (object sender, PrintPageEventArgs e) |
Namespace: System.Drawing.Printing.
| Member | Beschreibung |
|---|---|
| bool Cancel | Gibt an ob Druckauftrag abgebrochen werden soll. |
| Graphics Graphics | Ermöglicht auf die Druckseite zu zeichnen. |
| bool HasMorePages | Muss auf false gesetzt werden, falls der Ausdruck nur eine Seite lang ist. |
| Rectangle MarginBounds | Bereich innerhalb der Seitenränder. |
| Rectangle PageBounds | Kompletter Seitenbereich. |
Namespace: System.Drawing.Printing.
| Member | Beschreibung |
|---|---|
| PrintDocument Document | Das PrintDocument, zu welchem der Dialog angezeigt werden soll. |
| DialogResult ShowDialog() | Zeigt den PrintPreviewDialog an. Der Benutzer hat im PrintPreviewDialog die Möglichkeit, den Ausdruck zu starten, weshalb der Aufruf von PrintDocument.Print entfallen kann. |
Das Anzeigen des PrintPreviewDialogs führt zum Aufruf der Print-Methode. Klickt man im PrintPreviewDialog auf die Schaltfläche "Drucken" wird diese Methode erneut ausgeführt, deswegen muss man dafür sorgen, dass die Seitenzählung wieder auf 0 gesetzt wird.
Die Assembly mit dem Einstiegspunkt wird in den Arbeitsspeicher geladen und das Assemblymanifest von der CLR untersucht. Sie vergleicht die für die Ausführung erforderlichen Bedingungen mit der Sicherheitsrichtlinie des Systems. Falls diese erforderliche Rechte verweigert, wird die Anwendung nicht ausgeführt.
Beim Programmstart wird der erste auszuführende Codeteil in den Arbeitsspeicher geladen und vom Just in Time Compiler (JIT) in native code kompiliert und ausgeführt. Erst wenn die Anwendung zu Code verzweigt der noch nicht kompiliert ist, tritt der JIT wieder in Aktion. Somit wird nur der wirklich auszuführende Code kompiliert.
Namespace: System.Windows.Forms.
Oberklasse: BindingManagerBase
Verwaltet ein Objekt, von welchem idR. mehrere Eigenschaften an Steuerelemente gebunden sind. Diese einzelnen Bindungen sind in der Auflistung Bindings, welche Binding-Instanzen zurückgibt.
Dieser Zugriffsmodifizierer erlaubt nur erbenden Klassen auf das entsprechende Member zuzugreifen.
Namespace: System.Windows.Forms. RadioButtons können im Gegensatz zur CheckBox nicht den Zustand Indeterminate annehmen. Bei mehreren RadioButtons in einem Container kann immer nur einer ausgewählt (also Checked == true) sein.
Namespace: System.Drawing. Repräsentiert einen rechteckigen Bereich auf der Zeichenfläche.
Top: y-Koordinate des oberen Randes
Bottom: y-Koordinate des unteren Randes
Right: x-Koordinate des rechten Randes
Left: x-Koordinate des linken Randes
Runtime Callable Wrapper.
Eine Beispielanwendung für das Erstellen von Text- und Bildressourcendateien. Sie liegt unkompiliert im Ordner Programme\Microsoft Visual Studio .NET\FrameworkSDK\Samples\Tutorials\resourceandlocalization\reseditor.
Mit dem ResEditor kann man Name und Typ von der Ressourcen angeben. Danach kann man für Zeichenfolgen Werte eingeben oder Bilder liefern welche als Ressource eingebunden werden sollen. Die Ressourcendateien können im Binärformat mit Endung .resources oder als XML-Datei mit Endung .resx gespeichert werden.
Namespace: System.Resources. Ermöglicht, Zeichenfolgen und Objekte aus Ressourcendateien zu laden. Jede Instanz ist mit einer Assembly verknüpft welche Ressourcen enthält.
Dem Konstruktor übergibt man den Basisnamen der eingebetteten Ressourcendatei und die Assembly in welcher diese vorliegt. Der Basisname (der Ressourcendatei) ist deren Namespace und durch einen "." getrennt der Dateiname ohne Erweiterung.
Beispiel für das Anlegen eines ResourceManagers für eine Ressource namens myResource die in gleicher Assembly liegt:
using System.Resources;
namespace myNamespace {
...
ResourceManager resMan = new ResourceManager("myNamespace.myResource", this.GetType().Assembly);
Falls die Ressource nicht in der selben Assembly liegt:
using System.Reflection; // Namespace der Klasse Assembly using System.Resources;
... Assembly resAssembly; // Load ist statische Methode von Assembly resAssembly = Assembly.Load("ResourceAssembly"); ResourceManager resMan; resMan = new ResourceManager("ResourceAssembly.myResource", resAssembly);
Es muss ein Verweis auf die RessourcenAssembly hinzugefügt werden.
| Member | Beschreibung |
|---|---|
| object GetObject(string name) | Gibt die Ressource mit entspr. Namen zurück. |
| object GetObject(string name, CultureInfo culture) | Gibt die Ressource für die entspr. Kultur zurück. Dazu muss es für die entspr. Kultur einen Ressourcenfile mit korrektem Namen haben. Weiteres unter Satellitenassemblies. |
| string GetString(string name) | Gibt einen String mit entspr. Namen zurück. |
Können mit dem ResEditor angelegt werden. Der ResEditor liegt als Quellcode im Verzeichnis Programme\Microsoft Visual Studio.NET\FrameworkSDK\Samples\Tutorials\resourcesandlocalization\reseditor. Am besten kompiliert man es mit VS.NET.
Die Rollenbasierte Autorisierung steuert den Zugriff anhand der Identität und Rolle des Benutzers.
Die rollenbasierte Sicherheit ist einfach zu realisieren, aber recht unflexibel.
Oft ist des daher sinnvoller, einem Programm unabhängig vom User Rechte zu vergeben. Siehe auch Code Access Security.
Um eine Assembly freizugeben benötigt diese über ein Schlüsselpaar aus privatem und öffentlichem Schlüssel.
Ein solches Schlüsselpaar kann man mit sn.exe erstellen (am besten in der Visual Studio .NET-Eingabeaufforderung). Mit dem Flag -k kann man eine Ausgabedatei für das Schlüsselpaar angeben. Schlüsselpaare haben die Dateiendung .snk.
Beispiel:
sn -k meinSchluessel.snk
Um eine Assembly mit einem starken Namen zu signieren muss man zuerst sicherstellen, dass sie über eine Versionsnummer verfügt (Attribut AssemblyVersion in AssemblyInfo.cs). Mit dem Attribut AssemblyKeyFile kann man die Datei mit dem Schlüsselpaar angeben. Es kann sich um einen absoluten oder relativen Pfad handeln.
Beispiel:
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyKeyFile("..\\meinSchluessel.snk")]
sealed wird verwendet, um zu verhindern dass Klassen abgeleitet, resp. Methoden überschrieben werden können. Es können nur mit override deklarierte Methoden versiegelt werden.
Beispiel:
sealed class Auto {... // Auto kann nicht abgeleitet werden
Mit Setup-Projekten werden im Gegensatz zu Mergemodulprojekten ganze ausführbare Anwendungen weitergegeben.
Enthalten alle Informationen und Inhalte welche zur Installation benötigt werden.
Namespace: System.Drawing. Stellt eine Rechteck-Grösse (ohne Position) mit int-Werten für Breite (Width) und Höhe (Height) dar. Siehe auch Rectangle.
SizeF entspricht Size, Height und Width sind aber vom Typ float. SizeF verfügt über die Methode ToSize(), welche dieselbe Grösse als Size zurückgibt.
Generiert ein Paar aus öffentlichem und privatem Schlüssel (siehe Schlüsselpaar). Dieses wird benötigt, um eine Assembly mit einem starken Namen zu signieren.
Namespace: System.Drawing. Ein Pinsel mit einer einzigen Volltonfarbe.
Konstruktor: SolidBrush(Color color)
Namespace: System.Data.SqlClient.
Beispiel für ein Update-Command:
// zu sqlConnection1 passendes SqlCommand erzeugen SqlCommand cmdUpdate = sqlConnection1.CreateCommand(); cmdUpdate.CommandText = "UPDATE Customers SET " + "ContactName = @ContactName WHERE CustomerID = @CustomerID;"; // Parametername, SQL-Server-Datentyp, Länge, Feldname in DB cmdUpdate.Parameters.Add("@ContactName", SqlDbType.NVarChar, 30, "ContactName"); cmdUpdate.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); // @CustomerID soll urspr. Wert enthalten da in WHERE-Klausel verwendet cmdUpdate.Parameters["@CustomerID"].SourceVersion = DataRowVersion.Original; sqlDataAdapter1.UpdateCommand = cmdUpdate;
Namespace: System.Data.SqlClient.
ConnectionString Beispiel:
"server=(local); user id=sa; initial catalog=PersonenSQL"
sa ist ein Standarduser ohne Passwort der bei der Installation von MSDE automatisch erzeugt wird.
| Parameter | Beschreibung |
|---|---|
| server | nicht localhost sonder (local), falls nicht lokaler Rechner, URL des Servers |
| user id | Username mit welchem man auf die Datenbank zugreifen will. |
| initial catalog | Der Name der Datenbank, mit welcher man arbeiten will. |
| packet size | meist 4096 |
| integrated security | Ermöglicht Zugriff mit Username und Passwort des Betriebssystems. Wert = SSPI |
| Password | Das Passwort |
| Member | Beschreibung |
|---|---|
| SqlCommand CreateCommand() | Erzeugt ein SqlCommand welches der Connection zugeordnet ist. |
Namespace: System.Data.SqlClient. Eine Ausnahme dieses Typs wird ausgelöst, wenn der SQL-Server einen Fehler oder eine Warnung zurückgibt.
| Member | Beschreibung |
|---|---|
| SqlErrorCollection Errors [get] | Auflistung mit mindestens einer SqlError-Instanz. |
| string Message [get] | Ein Text, der den Fehler beschreibt. |
Namespace: System.Data.SqlClient.
| Member | Beschreibung |
|---|---|
| DataRowVersion SourceVersion [get, set] | Mit dieser Eigenschaft wird beim UpdateCommand festgelegt, ob der ursprüngliche oder der aktuelle Wert des Parameters verwendet wird. Beim Primärschlüssel setzt man diese Eigenschaft in der Regel auf DataRowVersion.Original. |
Eine Speicherstruktur die nach dem Stapelprinzip funktioniert und Wertevariablen (primitive Typen, Enumerationen und Strukturen) sowie Referenzen beinhält. Siehe auch Heap.
Ein Name für eine Assembly welcher ihre Identität garantiert. Die Identitätsinformationen werden mit dem privaten Schlüssel des Schlüsselpaares verschlüsselt und lassen sich mit dem öffentlichen Schlüssel wieder entschlüsseln. Nur der Entwickler verfügt über den privaten Schlüssel, weshalb der starke Name von niemandem sonst reproduziert werden kann.
Ein starker Name besteht aus einem String welcher sich aus dem Dateinamen der Assembly, einem öffentlichen Schlüssel und einer digitalen Signatur besteht.
Zwei Assemblies mit verschiedenen starken Namen werden von der CLR immer als zwei völlig verschiedene behandelt. Assemblies mit gleichem starken Namen immer als die selbe.
Visual Studio .NET generiert beim Kompilieren einen starken Namen, falls ein Schlüsselpaar vorhanden ist.
Alle Steuerelemente können auch in den Internet Explorer geladen werden. Dazu muss es entweder im GAC installiert sein oder im gleichen virtuellen Verzeichnis wie die HTML-Seite liegen.
Zur Einbindung in die HTML-Seite wird das <OBJECT>-Tag verwendet. Das HTML-Attribut classid enthält den Pfad zur Assembly und durch ein # getrennt den vollständigen Namen der Steuerelementklasse (inkl. Namespace).
Beispiel:
<OBJECT id="xyz" classid="http:ControlLibrary.dll#ControlLibrary.MyControl"></OBJECT>
Namespace: System.IO. Ermöglicht das Lesen aus Textdateien.
| Member | Beschreibung |
|---|---|
| void Close() | |
| string ReadToEnd() | Liest den ganzen Rest der Datei. |
| string ReadLine() | Liest die nächste Zeile. |
| StreamReader(string dateiName) | Konstruktor |
| Member | Beschreibung |
|---|---|
| static string Format(string format, params object[] args) | Beispiel: String.Format("Vorname: {0}; Alter: {1}", "Peter", 27) gibt "Vorname: Peter; Alter: 27" zurück. "{" und "}" können mit "{{" resp. "}}" maskiert werden. |
| string[] Split(char separator) | Splittet den String mittels separator und gibt ihn als string-Array zurück. |
| int IndexOf(string value, int position) | Überladen. Gibt das erste Vorkommen von value nach position zurück. Das erste Zeichen eines Strings hat den Index 0. Kommt der Suchstring nicht vor, beträgt der Rückgabewert -1. |
| string Insert(int startIndex, string value) | Fügt value an der Position startIndex ein. |
| string Remove(int startIndex, int count) | Löscht count Zeichen ab der Position startIndex. |
| string Replace( string toReplace, string newValue) |
Ersetzt jedes Vorkommen von toReplace mit newValue. Es existiert eine Überladung dieser Methode, die zwei char-Werte übernimmt. |
Strukturen sind etwas ähnliches wie Klassen, es handelt sich aber um Werttypen. Sämtliche Daten befinden sich also auf dem Stack.
Definition:public struct Player
{
string name;
int posX;
int posY
public Player(string name, int x, int y)
{
this.name = name;
posX = x;
posY = y;
}
}
Strukturen benötigen ebenfalls einen Konstruktor und müssen mit new instanziiert werden. Da sich Instanzen von Strukturen auf dem Stack befinden, sind sie besser für Objekte mit kurzer Lebensdauer oder wenigen Daten geeignet.
Unterschiede zwischen Klassen und Strukturen:
Hinter den "primitiven Datentypen" wie int, bool oder double verstecken sich in Wirklichkeit Strukturen. System.Int32, System.Boolean usw. sind Strukturtypen.
Beim Deklarieren eigener Strukturtypen implementiert der Compiler nicht automatisch eigene Operatoren. Es ist beispielsweise nicht möglich den Operator == anzuwenden, ohne ihn zuerst selbst zu implementieren.
Liegen vor, wenn der Compiler den Code nicht verstehen kann. Codestellen mit Syntaxfehlern werden von Visual Studio .NET automatisch unterstrichen und erscheinen in der Aufgabenliste.
Namespace: System.Drawing. Stellt statische Eigenschaften vom Typ System.Drawing.Color zur Verfügung, welche den aktuellen Systemfarben entsprechen. Damit wird es möglich das Farbschema zu verwenden, das der Benutzer auf seinem Rechner eingestellt hat.
Beispiel:
Color myColor = SystemColors.HighlightText;
| Member | Beschreibung |
|---|---|
| static Color Window [get] | Hintergrundfarbe des Clientbereichs eines Fensters. |
Namespace: System.Windows.Forms. Dieses Containersteuerelement bietet die Möglichkeit, andere Steuerelemente auf einer Reihe von Registerkarten (vom Typ TabPage) zu plazieren. Die Eigenschaft TabPages ist eine Auflistung aller TabPage's.
Kann in der IDE bequem mit Ansicht|Tabulatorreihenfolge eingesehen werden. Es erscheint bei jedem Steuerelement ein blaues Kästchen welches TabIndex angibt. Um die Tabulatorreihenfolge zu ändern kann man die Controls in der gewünschten Reihenfolge anklicken. Wird mit Control.TabIndex festgelegt.
Nach logischen Kriterien werden Eingaben für einen Einheitentest auf einige repräsentative Beispiele festgelegt. Diese Beispiele sind je ein Testfall.
Dabei muss jede Codezeile getestet werden. Bei Methoden mit Entscheidungsstrukturen braucht man also Testfälle für jeden möglichen Weg.
Es sind folgende Daten zu testen:
Normale Daten:
Die Methode wird mit Daten innerhalb des zulässigen Bereichs getestet
Grenzbedingungen:
Dazu gehören Testfälle mit Mindest- und Höchstwert des gültigen Bereichs, aber auch Daten die um 1 davon abweichen. Beispielsweise um auf die fälschliche Verwendung von < statt <= zu testen.
Unzulässige Daten:
Diese Testfälle prüfen, ob ein Programm bei ungültigen Daten nicht abstürzt, oder nicht normal weiterläuft und falsche Ausgaben liefert.
Datenkombinationen:
Ausserdem sollten Kombinationen der zuvor erwähnten Datenarten abgedeckt werden. Gewisse Fehler treten nur auf, wenn eine entsprechende Datenkombination auftritt.
Namespace: System.Windwos.Forms.
| Member | Beschreibung |
|---|---|
| int MaxLength | Begrenzt die Zeichenzahl die in das Textfeld eingegeben werden kann. |
| char PasswordChar | Verbirgt zur Laufzeit die Benutzereingabe indem nur das entsprechende Zeichen angezeigt wird. |
| bool ReadOnly | Entscheidet darüber, ob der Benutzer den Wert des Textfeldes bearbeiten darf. |
| bool MultiLine | Legt fest, ob das Textfeld mehrzeilige Eingaben entgegennimmt. Falls ja werden die einzelnen Zeilen in der Collection Lines gespeichert. |
Type Library Importer Tool. Es konvertiert Typdefinitionen einer COM-Bibliothek in entsprechende Typdefinitionen einer CLR-Assembly. Die Ausgabe ist eine Assembly.
| Parameter | Beschreibung |
|---|---|
| /asmversion:versionNumber | Gibt die Versionsnummer der zu erstellenden Assembly im Format major.minor.build.revision an. |
| /keyfile:filename | Signiert die zu erstellende Assembly unter Verwendung des angegebenen .snk-Files mit einem starken Namen. |
| /out:filename | Der Name der Ausgabedatei. Lässt man diesen Parameter weg, heisst die erzeugte Assembly gleich wie die Eingabedatei und fügt .dll hinzu. |
Durch // TODO: <Aufgabentext> lassen sich Aufgaben erstellen, die in der Aufgabenliste erscheinen. Erscheinen die TODO:-Kommentare nicht im Aufgabenfenster, muss man dies im Kontextmenü einstellen.
Namespace: System.Windows.Forms. Normalerweise teilen sich mehrere Steuerelemente eine Instanz von ToolTip. Fügt man einem Formular ein ToolTip hinzu, heisst diese toolTip1 und es erscheint im Eigenschaftenfenster eine neue Eigenschaft "ToolTip auf toolTip1" welche man auf den ToolTip-Text für dieses Steuerelement setzen kann.
Dynamisch kann man den ToolTip-Text für ein Steuerelement folgendermassen setzen:
this.toolTip1.SetToolTip(this.textBox1, "Schreib in mich!");
Der erste Parameter ist also das Steuerelement, der zweite der ToolTip-Text.
Namespace: System.Diagnostics. Erlaubt das Protokollieren von Ereignissen auch wenn die Anwendung nicht im Debug-Modus läuft. Sämtliche Member von Trace sind statisch und kommen auch in der Klasse Debug vor.
| Member | Beschreibung |
|---|---|
| static void Assert( bool condition, string message, string detailMessage) |
Zeigt einen StackTrace in einer MessageBox, falls condition sich zu false evaluiert. |
Beispiel: Ausgaben von Trace in eine Textdatei schreiben
FileStream logStream = new FileStream(@"C:\log.txt"); // sollte wieder geschlossen werden TextWriterTraceListener traceListener = new TextWriterTraceListener(logStream); Trace.Listeners.Add(traceListener); Trace.AutoFlush = true; // spart Aufruf von Flush() nach jedem Log-Eintrag /* Trace-Schalter erzeugen, "BoolSwitch" ist der name aus der .config-Datei. */ BooleanSwitch myBooleanSwitch = new BooleanSwitch("BoolSwitch", "Beschreibung"); /* Eine Log-Information schreiben */ // 1. Parameter muss vom Typ bool und true sein Trace.WriteLineIf(myBooleanSwitch.Enabled, "Log-Information");
Die .config-Datei:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.diagnostics> <switches> <!-- Jeder Wert != 0 bedeutet dass der Schalter on ist --> <add name="BoolSwitch" value="1" /> </switches> </system.diagnostics> </configuration>
Die .config-Datei muss gleich wie der .exe-File (also z.B. "WindowsApplication1.exe.config") heissen und im gleichen Verzeichnis wie der .exe-File liegen. Die .config-Datei ermöglicht, Trace-Schalter auch nach dem Compilieren ein- und auszuschalten.
Namespace: System.Diagnostics. Abstrakte Basisklasse für alle TraceListeners; es gibt folgende Implementationen:
| Implementation | Beschreibung |
|---|---|
| DefaultTraceListener | Eine Instanz dieser Klasse wird automatisch zur Listeners-Auflistung hinzugefügt. Sie schreibt Meldungen ins Ausgabefenster. |
| TextWriterTraceListener | Schreibt Meldungen in jede Klasse welche von Stream abgeleitet ist. |
| EventLogTraceListener | Schreibt Meldungen in das Windows Event Log. |
TraceListeners müssen mit Debug.Listerners.Add() oder Trace.Listeners.Add() der Listeners-Auflistung hinzugefügt werden. ACHTUNG: Debug und Trace verwenden die gleiche Listeners-Auflistung!
Namespace: System.Diagnostics. Ermöglicht Trace-Messages via Konfigurationsdatei zu steuern.
| Member | Beschreibung |
|---|---|
| TraceSwitch( string displayName, string description) |
Konstruktor, displayName muss dem Namen in der Konfigurationsdatei entsprechen. |
| string DisplayName [get] | Identifiziert den Switch. |
| TraceLevel Level | Legt das Trace-Level fest. Werte der Enumeration TraceLevel sind: 0 = Off, 1 = Error, 2 = Warning, 3 = Info, 4 = Verbose. |
| bool TraceError | Gibt true zurück, falls TraceLevel auf Error, Warning, Info oder Verbose gesetzt ist. |
| bool TraceWarning | Gibt true zurück, falls TraceLevel auf Warning, Info oder Verbose gesetzt ist. |
| bool TraceInfo | Gibt true zurück, falls TraceLevel auf Info oder Verbose gesetzt ist. |
| bool TraceVerbose | Gibt true zurück, falls TraceLevel auf Verbose gesetzt ist. |
Eine Transaktion ist eine zusammenhängende Anzahl Datenbankoperationen die als Einheit ausgeführt werden. Entweder haben alle Erfolg oder es werde alle rückgängig gemacht.
Eine Transaktion leitet man ein, indem man die Methode BeginTransaction eines Connection-Objekts aufruft. Sie gibt einen Verweis auf ein Transaction-Objekt zurück. Danach wird dieses Objekt der Transaction-Eigenschaft jedes beteiligten Befehls (Commands) zugewiesen. Nach dem Ausführen dieser Befehle kann mit Transaction.Commit() die Transaktion bestätigt oder mit Transaction.Rollback()rückgängig gemacht werden.
Beispiel:
try { myTransaction = myConnection.BeginTransaction(); myCommand1.Transaction = myTransaction; myCommand2.Transaction = myTransaction; myCommand1.ExecuteNonQuery(); myCommand2.ExecuteNonQuery(); myTransaction.Commit(); // Transaktion bestätigen falls keine Exception } catch (Exception ex) { myTransaction.Rollback(); // Transaktion rückgängig falls Exception } finally { myConnection.Close(); // Auf jeden Fall: Verbindung schliessen }
Transaktionen sind nur möglich, wenn die Datenquelle Transaktionen unterstützt.
Transaktionen können auch mit DataAdaptern verwendet werden. Das Transaction-Objekt muss der Eigenschaft Transaction von InsertCommand, UpdateCommand und DeleteCommand jedes beteiligten DataAdapters zugewiesen werden. Nach dem Aufruf von Update() sämtlicher beteiligter DataAdapters kann man Commit() oder Rollback() des Transaction-Objekts aufrufen.
Namespace: System.Windows.Forms. Die Einträge einer TreeView.
| Member | Beschreibung |
|---|---|
| TreeNode(string text) | Konstruktor |
| TreeNode(string text, TreeNode[] children) | Konstruktor |
| Color BackColor [get, set] | |
| int Index [get] | |
| bool IsSelected [get] | |
| TreeNodeCollection Nodes | Alle untergeordneten Nodes. |
| TreeNode Nodes.Add(string text) | Fügt am Ende der Liste einen neuen Kindknoten mit der Beschriftung text ein. |
| int Nodes.Add(TreeNode node) | Fügt node am Ende der Liste ein und gibt dessen Index zurück. |
| void Nodes.Clear() | Leert die Auflistung der Kindknoten. |
| bool Nodes.Contains(TreeNode node) | Gibt true zurück, falls node in der Auflistung enthalten ist. |
| string Text [get, set] | Die Bezeichnung des Knotens. |
| Font NodeFont [get, set] | Die Schriftart für die Darstellung des Knotens. |
| TreeNode Parent [get] | Der Vaterknoten. |
| object Tag [get, set] |
Namespace: System.Windows.Forms. Die Einträge einer TreeView sind vom Typ TreeNode.
| Member | Beschreibung |
|---|---|
| TreeViewEventHandler AfterSelect | Tritt ein, wenn ein Knoten selektiert wurde. |
| bool HideSelection [get, set] | false: Selektion ist auch markiert, wenn Steuerelement den Fokus nicht hat . |
| TreeNodeCollection Nodes | Die Einträge vom Typ TreeNode. |
| int Nodes.Add(string text) | Gibt den Index des eingefügten Knotens zurück. |
| int Nodes.Add(TreeNode node) | Gibt den Index des eingefügten Knotens zurück. |
| void Nodes.AddRange(TreeNode[] nodes) | |
| TreeNode SelectedNode [get, set] |
Namespace: System.
| Member | Beschreibung |
|---|---|
| static Type GetType(string typName) | Beispiel: Type myType = Type.GetType("System.String"); |
Implizites Typecasting wird automatisch vorgenommen, wenn kein Präzisionsverlust auftreten kann, beispielsweise wenn man eine int-Variable einer long-Variable zuweist oder einer Methode welche einen double-Parameter erwartet eine int-Variable übergibt.
Die .NET-Sprachen sind streng typisiert, dies bedeutet dass bei Zuweisungen und Parameterübergaben die Typ-Konformität beachtet werden muss. Alle .NET-Typen sind von object abgeleitet, weshalb sie mindestens über die folgenden Methoden verfügen:
Siehe auch: Boxing
typeof(myObject) liefert für myObject eine Instanz der Klasse System.Type zurück.
Zugriffsmodifizierer von Klassen und Strukturen. Als public deklarierte Typen können von jedem Objekt der betreffenden Anwendung instanziiert werden. private und protected können nur für verschachtelte Typen eingesetzt werden, sie können nur von Klassen mit demselben Typ oder einem darin verschachtelten Typ instanziiert werden. Klassen und Strukturen die ohne Zugriffsmodifizierer definiert werden sind implizit public.
Von Überladen spricht man, wenn eine Klasse mehrere Methoden gleichen Namens hat. Die überladenen Methoden müssen sich in ihrer Signatur unterscheiden. Rückgabetyp und Zugriffsebene können gleich oder verschieden sein.
Beim Überschreiben wird ein Member welches in der Basisklasse mit virtual deklariert ist in der abgeleiteten Klasse neu definiert und mit dem Schlüsselwort override versehen. Der Typ des Objekts entscheidet, welche Methode ausgeführt wird. Siehe auch Verbergen.
Im Unterbrechungsmodus wird die Ausführung angehalten und man kann den Code zeilenweise ausführen, Werte von Variablen und den Code mit Debugtools aus dem Menü Debug untersuchen.
Ermöglicht das "importieren" von Namensräumen. Somit kann man den Namensraum vor einem Typ weglassen. Die using-Direktive muss vor allen anderen Namespaceelementen wie Klassen oder Strukturen stehen. Existieren in den importierten Namespaces gleichnamige Typen, müssen jedoch wieder die vollen Namen verwendet werden. Diese lassen sich glücklicherweise mit einem Alias abkürzen.
Beispiel, Definition eines Aliases: using frms = System.Windows.Forms;
C# definiert sieben Kategorien von Variablen: statische Variablen, Instanzvariablen, Array-Elemente, Werteparameter, Verweisparameter, Ausgabeparameter und lokale Variablen.
Beim Verbergen ersetzt man die vorhandene Implementierung in der Basisklasse durch eine neue. Die neue Implementierung muss die selbe Signatur haben, kann aber eine andere Zugriffsebene und einen anderen Rückgabetyp aufweisen. Das verbergende Member (in der abgeleiteten Klasse) muss mit dem Schlüsselwort new eingeleitet werden. Bei verborgenen Membern entscheidet der Typ der Referenz, welche Version ausgeführt wird. Es ist auch möglich, in der Oberklasse mit virtual deklarierte Methoden zu verbergen. Siehe auch Überschreiben.
Typen die innerhalb eines anderen Typs definiert werden. Eignen sich besonders, wenn ein Objekt mehrere Instanzen eines anderen Typs beinhaltet und diese nur innerhalb dieses Objekts vorkommen. Definiert man einen verschachtelten Typ jedoch mit public, ist es auch für andere Objekte möglich diesen Typ zu instanziieren. Siehe auch Typzugriffsmodifizierer.
Ein mit dem Modifizierer ref deklarierter Parameter.
Variablen von Verweistypen speichern die Adresse eines Objekts, dieses befindet sich auf dem Heap. Die Variable selbst (also die Referenz) liegt jedoch auch auf dem Stack. Die Verweistypen unterteilen sich in Klassentypen, Interface-Typen, Array-Typen und Delegate-Typen. Siehe auch Werttyp.
Mit virtual deklarierte Methoden können in abgeleiteten Klassen überschrieben werden. Siehe auch Überschreiben.
Enthält Programmiersprachen wie Visual Basic .NET, C# und Visual C++ sowie die Skriptsprache JScript. Desweiteren gibt es von Fremdherstellern Compiler für Fortran .NET, Cobol .NET, Perl .NET andere Sprachen.
Eine Variable eines Werttyps speichert direkt den Wert, welcher sich auf dem Stack befindet.
Deklaration: int myInteger;
Zuweisung/Initialisierung: myInteger = 17;
Deklaration und Initialisierung können auch zu int myInteger = 17; zusammengefasst werden (ohne Performanceeinbusse).
Die Funktion Beep der Windows API kann wie folgt verfügbar gemacht werden:
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern int Beep(int dwFreq, int dwDuration);
Hiermit steht die Methode Beep in der betreffenden Klasse zur Verfügung.
Namespace: System.Security.Principal. Stellt einen Windows-Benutzer dar.
| Member | Beschreibung |
|---|---|
| static WindowsIdentity GetCurrent() | Gibt das WindowsIdentity-Objekt des aktuellen Benutzers zurück. |
| string Name [get] | Gibt den Namen des Windows-Benutzers zurück. |
Namespace: System.Security.Principal. Implementiert IPrincipal. Ermöglicht, die Mitgliedschaft eines Windows Benutzers in einer Gruppe zu prüfen. Der Principal des aktuellen Threads kann mit Thread.CurrentPrincipal beschafft werden.
Beispiel:
WindowsPrincipal myPrincipal;
myPrincipal = (WindowsPrincipal)System.Threading.Thread.CurrentPrincipal;
WindowsIdentity myItentity;
myItentity = (WindowsIdentity)myPrincipal.Identity;
Kann in einfachen Fällen zur Installation einer Anwendung verwendet werden.
Syntax:
XCOPY <Quellverzeichnis> <Zielverzeichnis> /s
/s gibt an, dass auch die Unterverzeichnisse kopiert werden sollen.
Repräsentiert ein Attribut.
| Member | Beschreibung |
|---|---|
| string Name [get] | Der Name des Attributs. |
| string Value [get, set] | Der Wert des Attributs. |
Namespace: System.Xml. Arbeitet eng mit der Klasse DataSet zusammen. Ein XmlDataDocument ist eine Arbeitsspeicherdarstellung von XML-Daten und kann als Quelle für XSLT (Extensible Style Sheet Transformations) verwendet werden.
Zu jedem XmlDataDocument gehört ein DataSet. Es existiert ein Konstruktor, welcher ein DataSet als Parameter übernimmt. Die Daten und das Schema des DataSets werden in das XmlDataDocument übernommen. Eine Änderung des einen wird vom anderen automatisch übernommen.
Namespace: System.Xml. Repräsentiert einen XML-File mit XML-DOM. Es wird jeweils das ganze XML-Dokument geladen und die entsprechenden Objekte erzeugt. Daher kann diese Methode bei grossen Dokumenten zu Performance- und Ressourcenproblemen führen.
| Member | Beschreibung |
|---|---|
| XmlDocument() | Konstruktor. |
| void Load(string file) | Lädt betreffende XML-Datei. file kann auch eine URL sein. |
Namespace: System.Xml. Abgeleitet von der abstrakten Klasse XmlReader. Bietet schnellen Vorwärtszugriff auf XML-Daten.
| Member | Beschreibung |
|---|---|
| bool Read() | Schiebt den Zeiger zum nächsten Knoten und gibt true zurück, falls dieser existiert. |
| string Name [get] | Gibt den gekennzeichneten Namen des aktuellen Knotens zurück. |
| XmlNodeType NodeType [get] | Gibt den Typ des aktuellen Knotens zurück. |
| string Value [get] | Gibt den Textwert des aktuellen Knotens zurück. Dieser hängt vom Typ des aktuellen Knotens (NodeType) ab. |
| bool HasAttributes [get] | Gibt true zurück, falls der Knoten über Attribute verfügt. |
| string GetAttribute(int index) | Gibt den Wert des betreffenden Attributs zurück. |
| string GetAttribute(string name) | Gibt den Wert des betreffenden Attributs zurück. |
| XmlNodeReader(XmlDocument document) | Konstruktor. |
Bietet mit XmlTextWriter zusammen einen Stream-basierten Zugriff auf XML-Dokumente, was auch bei grossen Dokumenten nicht zu Performance- oder Ressourcenproblemen führt.
| Member | Beschreibung |
|---|---|
| XmlTextReader(string url) | Konstruktor, (überladen). url kann eine URL oder ein Dateiname sein. |
| Member | Beschreibung |
|---|---|