Frage
Wie kann ich eine formatierte Eingabe von der Konsole durchführen, wie dies zum Beispiel in C mit sscanf geht?
Antwort
Eine solche direkte Möglichkeit gibt es in .Net nicht. Console bietet nur die statischen Methoden Read , ReadLine und ReadKey an, um Daten einzulesen. Diese sind aber auf Zeicheneingaben, bzw. Texteingaben, beschränkt. Um daraus nun z.B. Zahlen zu gewinnen oder eine gewisse Form aufzubrechen, gibt es unterschiedliche Hilfsmittel. Jeder Wertetyp in C# hat eine statische Methode Parse und TryParse , womit sich Text in den entsprechenden Wertetyp umwandeln lässt. Um eine Form aufzubrechen, kann man entweder die Funktionen der String Klasse oder Regulare Expressions über die Klasse System.Text.RegularExpressions.Regex verwenden.
Beispiel
using System;
class Program
{
public static void Main()
{
var expression = Console.ReadLine();
var terms = expression.Split('+');
double total = 0;
foreach(var term in terms)
{
total += Double.Parse(term);
}
Console.WriteLine("{0} = {1}", expression, total);
}
}
Frage
Wie kann ich formatierte Ausgaben auf der Konsole machen?
Antwort
Die Klasse Console bietet dazu Überladungen der statischen Methoden Write und WriteLine an. Diese unterstützen unteranderem auch das Composite Formatting.
Beispiel
using System;
class Program
{
public static void Main()
{
int x = 10;
double d = 23.34;
string text = "unknown";
Console.WriteLine("{0} + {1} = {2}", x, d, text);
}
}
Frage
Kann man eine Schrift gedreht zeichnen (z.B. vertikal)?
Antwort
Ja, das ist möglich indem man das Graphics Objekt mit einer Transformierung mit RotateTransform versieht.
Beispiel
public void OnPaint(object sender, PaintEventArgs e)
{
string text = "HelloWorld";
// Rotiere um 90 grad
e.Graphics.RotateTransform(90);
// Zeige den Text bei X = 100 und Y = 100.
// Das minus Zeichen muss sein, da sonst der Text vom Form wegrotiert wird.
e.Graphics.DrawString(text, Font, Brushes.Black, 100.0f, -100.0f);
}
Frage
Ich habe eine Position und möchte überprüfen, ob diese in einem bestimmten Childcontrol liegt. Gibt es dazu irgendwelche vorgefertigten Möglichkeiten?
Antwort
Jedes Control bietet die Property Bounds an, welches tatsächlich ein Objekt vom Typ Rectangle ist. Rectangle bietet die Methode Contains an, womit man prüfen kann, ob eine Position sich im Rechteck befindet.
Beispiel
public void OnMouseDown(object sender, MouseEventArgs e)
{
if(childControl.Bounds.Contains(e.Location))
{
MessageBox.Show("In!");
}
}
Frage
Wie ermittle ich die Höhe der Titelleiste?
Antwort
Windows Forms hat eine Klasse SystemInformation , welche allerhand Informationen über das System enthält. Mit CaptionHeight unteranderem die Höhe der Titelleiste.
Frage
Mein Programm beendet sich nach dem Start sofort. Was mache ich falsch?
Antwort
Wenn ein Programm ans Ende der Main -Methode kommt, dann beendet sich das Programm. Um dies zu verhindern, kann man eine Tastenabfrage am Ende der Main -Methode einbauen.
Siehe dazu: http://www.c-plusplus.net/forum/293132
Man sollte sich allerdings bewusst sein, dass so eine Tastenabfrage am Ende auch stören kann. Wenn Konsolenprogramme direkt aus einer Konsole gestartet werden, dann ist die zusätzliche Abfrage am Ende überflüssig. Es könnte sich daher empfehlen, dies nur beim Debuggen anzuwenden.
Siehe dazu: http://www.c-plusplus.net/forum/293133
Frage
Wie kann ich Code nur im Debugmodus laufen lassen?
Antwort
In C# gibt es auch eine Art von Präprozessor, wie man diesen in C oder C++ kennt. Er ist allerdings deutlich eingeschränkter und kann nur Bedingungen prüfen. Wenn man eine Debug-Kompilierung macht, so wird automatisch das Symbol DEBUG definiert. Mit den Präprozessor Anweisungen kann man nun auf dieses Symbol prüfen. Zusätzlich gibt es auch noch das ConditionalAttribute , mit welchem man eine Methode verbinden kann. Dann wird die Methode nur ausgeführt, wenn das angegebene Symbol vorhanden ist.
Beispiel
using System;
class Program
{
public static void Main()
{
#if DEBUG
Console.WriteLine("Debug");
#else
Console.WriteLine("Release");
#endif
}
}
using System;
using System.Diagnostics;
class Program
{
public static void Main()
{
DebugWrite("Test");
Console.WriteLine("Blub");
}
[Conditional("DEBUG")]
private static void DebugWrite(string text)
{
Console.Write(text);
}
}
Frage
Wie kann ich auf eine beliebige Benutzereingabe warten?
"Press any key to continue..."
Antwort
Die Klasse Console bietet die statische Methode Console.ReadKey an. Die Methode gibt Informationen über die gedrückte Taste zurück, wodurch man auch nur auf gewisse ausgewählte Tasten reagieren kann. Es gibt von der Methode zwei Überladungen, wodurch man die Tasteneingabe abfangen kann, damit auf der Konsole nichts ausgegeben wird.
Beispiel
using System;
class Program
{
public static void Main()
{
Console.Write("Press any key to continue...");
Console.ReadKey(true);
}
}
using System;
class Program
{
public static void Main()
{
Console.WriteLine("Press ENTER to continue...");
WaitForEnterKey();
}
private static void WaitForEnterKey()
{
while(Console.ReadKey(true).Key != ConsoleKey.Enter) { /* do nothing */ };
}
}
Frage
Wie ermittle ich den Zelleninhalt einer Position (z.B. von der Maus) auf einem DataGrid ?
Antwort
Dazu bietet die Klasse DataGrid die Methode HitTest . Daran übergibt man entweder eine Point -Struktur oder direkt die X- und Y-Koordinaten. Man erhält ein Objekt der Klasse DataGrid.HitTestInfo zurück mit Informationen zu Reihe, Kolonne und Typ worauf geklickt wurde.
Beispiel
private void DataGridMouseDown(object sender, MouseEventArgs e)
{
var hitInfo = dataGrid.HitTest(e.X, e.Y);
if(hitInfo.Type == DataGrid.HitTestType.Cell)
{
string content = dataGrid[hitInfo.Row, hitInfo.Column].ToString();
MessageBox.Show(content);
}
}
Frage
Wie kann ich eine Form aus einer anderen Form aufrufen, bzw. anzeigen?
Antwort
Dazu besitzt die Klasse Form die Methode Show , bzw. ShowDialog . Mit ShowDialog wird die Form modal aufgerufen. Ein modaler Aufruf bedeutet, dass man keinen Zugang zur Eltern- Form hat, solange die aktuelle Form offen ist.
Beispiel
using System;
using System.Windows.Forms;
class Program
{
public static void Main()
{
var form = new Form();
var button = new Button()
{
Text = "Show"
};
button.Click += Program.OnButtonShow;
form.Controls.Add(button);
button = new Button()
{
Text = "ShowDialog",
Left = 100
};
button.Click += Program.OnButtonShowDialog;
form.Controls.Add(button);
Application.Run(form);
}
private static void OnButtonShow(object sender, EventArgs e)
{
var childForm = new Form()
{
Text = "Show"
};
childForm.Show();
}
private static void OnButtonShowDialog(object sender, EventArgs e)
{
var childForm = new Form()
{
Text = "ShowDialog"
};
childForm.ShowDialog();
}
}
Frage
Wie spricht man C# aus und was bedeutet es?
Antwort
Es wird meistens auf Englisch ausgesprochen als C-Sharp. Das Zeichen # bedeutet in der Musik einen Halbton höher. Im Deutschen spricht man # aus, indem man ein -is anhängt: C# = Cis. Im Englischen als C-Sharp. Näheres kann man auf Wikipedia finden.
http://de.wikipedia.org/wiki/Kreuz_(Notenschrift)
Frage
Wie kann ich einen Button in WinForms aus dem Code heraus anklicken.
Antwort
Die Klasse Button bietet die Methode PerformClick an.
Beispiel
using System;
using System.Windows.Forms;
class Program
{
private static Button button;
public static void Main()
{
var form = new Form();
button = new Button()
{
Text = "Test"
};
button.Click += Program.OnButtonClick;
form.Load += Program.OnFormLoad;
form.Controls.Add(button);
Application.Run(form);
}
private static void OnButtonClick(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
private static void OnFormLoad(object sender, EventArgs e)
{
button.PerformClick();
}
}
Frage
Woher bekomme ich das .Net Framework?
Antwort
Man kann das .Net Framework von der Downloadseite von Microsoft herunterladen.
http://www.microsoft.com/downloads
English:
Full - Web Installer
Full - Standalone Installer
Client Profile - Web Installer
Client Profile - Standalone Installer
Deutsch:
Full - Web Installer
Full - Standalone Installer
Client Profile - Web Installer
Client Profile - Standalone Installer
Unterschied Web und Standalone Installer:
Der Web Installer lädt nur die benötigten Bibliotheken nach und installiert diese. Zudem ist er deutlich kleiner. Der Standalone Installer führt dagegen das ganze .Net Paket mit sich.
Unterschied von Full und Client Profile:
Das Client Profile ist eine abgespeckte Version des .Net Frameworks. Näheres zum Client Profile kann man im nachfolgenden Link nachlesen.
http://msdn.microsoft.com/en-us/library/cc656912.aspx
Frage
Wie starte ich ein anderes Programm?
Antwort
Dazu gibt es die Klasse System.Diagnostics.Process . Man kann direkt die statische Methode Start verwenden oder auch über den Konstruktor einzelne Objekte erstellen, diese konfigurieren und danach starten.
Man sollte sich für komplexere Startbedingungen ebenfalls System.Diagnostics.ProcessStartInfo anschauen. Zum Beispiel besteht die Möglichkeit die Ein- und Ausgabeströme umzuleiten.
Beispiel
Dieses Beispiel startet Notepad auf einem Windows Betriebsystem.
using System.Diagnostics;
class Program
{
public static void Main()
{
Process.Start("notepad.exe");
}
}
Frage
Wie ermittle ich den Namens des aktuell eingeloggten Benutzers?
Antwort
Die Klasse System.Environment bietet die statische Property UserName an.
Beispiel
using System;
class Program
{
public static void Main()
{
Console.WriteLine(Environment.UserName);
}
}
Frage
Wie ermittle ich die logischen Laufwerke meines Computers?
Antwort
Die Klasse System.Environment bietet die statische Methode GetLogicalDrives an.
Beispiel
using System;
class Program
{
public static void Main()
{
var logicalDrives = Environment.GetLogicalDrives();
foreach(var logicalDrive in logicalDrives)
{
Console.WriteLine(logicalDrive);
}
}
}
Irgendeine Chance die zwei Beiträge in die FAQ zu bekommen ?
Sicherlich wird das nicht häufig gefragt, schaut aber nach sehr viel Knobeln aus, so das jemand mit gleichen Problemen auf die Arbeit von Wesley67 zurück greifen kann. (Das Forum wird ja nun gut Inidizert bei Google)