UserControl, das sich selbst aus einem übergeordnetem Element löscht

In einem meiner aktuellen Projekte habe ich mehrere UserControls in einem StackPanel untergebracht. Der Nutzer soll selbst auswählen können, welche er davon angezeigt haben möchte und welche nicht. Und er soll diese Auswahl zur Laufzeit treffen können – ohne Restart des Programms.

Die Lösung: Einfach das übergeordnete Element in ein StackPanel konvertieren und das Control sich selbst löschen lassen:

// das Click-Event meines Close-Buttons im zu löschenden UserControl
private void _CloseButton_Click(object sender, RoutedEventArgs e)
{
    ((StackPanel)this.Parent).Children.Remove(this);
}

Einem BackgroundWorker mehrere Werte übergeben

In einem meiner aktuellen Projekte habe ich einen BackgroundWorker benötigt, dem ich mehr als einen Wert übergeben kann. Da das “von Haus aus” nicht möglich ist, habe ich natürlich das Internet befragt. Das war leider reine Zeitverschwendung …

Da kam mir eine Idee: Warum denn nicht eine Liste vom Typ object nehmen? Diese kann man dann mit seinen Variablen verschiedenen Typs füllen. und der RunWorkerAsync()-Methode übergeben.

Damit man damit dann in der DoWork()-Methode auch arbeiten kann, muss man das übergebene Argument wieder in eine List<object> konvertieren:

List<object> Arguments = (List<object>)e.Argument;

Danach kann man über den Index auf die Elemente zugreifen und sie verwenden:

int Var1 = (int)Arguments[0];
string Var2 = (string)Argument[1];

Ein Kalender mit PHP

Um bevorstehende Termine übersichtlich auf einer Website darstellen zu können eignet sich ein Kalender ziemlich gut. Wie man diesen programmieren könnte, möchte ich im folgenden zeigen.

Um die Kalenderausgabe für einen bestimmten Monat in einem bestimmten Jahr auszugeben, wird der Code in eine Funktion geschrieben.

function ShowCalendar($ShowMonth, $ShowYear)
{
 
}

Benötige Variablen erstellen

Der anzuzeigende Monat und das anzuzeigende Jahr werden als Funktionparameter geholt. Danach müssen noch der aktuelle Tag, die Anzahl der Tage im Monat sowie die Anzahl der Wochen im Monat bestimmt werden. Außerdem wird noch ein Array benötigt, in das die einzelnen Tage später geschrieben werden.

$NowDay = date("d", time());
$DaysInMonth = date("t", mktime(1, 0, 0, $ShowMonth, 1, $ShowYear));
$WeeksInMonth = date("W", mktime(1, 0, 0, $ShowMonth, $DaysInNowMonth, $ShowYear)) - date("W", mktime(1, 0, 0, $ShowMonth, 1, $ShowYear)) + 1;
$CalData = array();

Array füllen

Zuerst werden so viele Elemente in das Array eingefügt, wie der Monat Wochen hat.

for($a = 0; $a < $WeeksInMonth; $a++)
{
	$CalData[] = array();
}

Dann wird jede Woche im Array mit den entsprechenden Tagen gefüllt. Dabei wird für jeden Tag bestimmt, der wievielte Tag der Woche es ist, und dieser wird dann an entsprechender Stelle in die Woche eingefügt. Da date(“w”, $timestamp) allerdings den Sonntag als Tag Nr. 0 und den Samstag als Tag Nr. 6 zurück liefert, müssen der Sonntag als Nr. 6 festgelegt und alle anderen zurückgegebenen Werte um 1 verringert werden.

Und immer, wenn das Skript beim sechsten Tag der Woche angelangt ist, wird der Wochenzähler um 1 erhöht, wodurch dann die nächste Woche gefüllt wird.

$w = 0;
for($i = 1; $i <= $DaysInMonth; $i++)
{
	$Day = date("w", mktime(1, 0, 0, $ShowMonth, $i, $ShowYear));
	($Day == 0) ? $Day = 6 : $Day--;
	$CalData[$w][$Day] = $i;
	if($Day == 6)
	{
		$w++;
	}
}

Monate auf Deutsch

Damit die Monate dann auch auf Deutsch angezeigt werden, wir dein Array mit den deutschen Bezeichnungen angelegt.

$Months = array(0 => "Januar",
		1 => "Februar",
		2 => "März",
		3 => "April",
		4 => "Mai",
		5 => "Juni",
		6 => "Juli",
		7 => "August",
		8 => "September",
		9 => "Oktober",
		10 => "November",
		11 => "Dezember");

Die Ausgabe des Kalenders

Der Tabellenkopf

Für den Tabellenkopf müssen erst einmal Monat und Jahr entsprechend formatiert werden.

echo <<<DOC
	<table>
		<tr>
			<th colspan="7">
				$Month_Year_formatted
			</th>
		</tr>
		<tr>
			<th>Mo</th>
			<th>Di</th>
			<th>Mi</th>
			<th>Do</th>
			<th>Fr</th>
			<th>Sa</th>
			<th>So</th>
		</tr>
DOC;
Der Inhalt – das Array auslesen

Nun wird für jedes Wochenelement im Array eine Zeile angelegt und für jeden Tag in dieser Zeile eine Zelle angelegt und am Ende die Tabelle geschlossen.

foreach($CalData as $Week)
{
	echo "<tr>";
	for($wd = 0; $wd <= 6; $wd++)
	{
		if(mktime(1, 0, 0, $ShowMonth, $Week[$wd], $ShowYear) == mktime(1, 0, 0, date("m", time()), $NowDay, date("Y", time())))
		{
			// CSS-Klasse Cal_Today: .Cal_Today { border: 1px #000000 solid; }
			echo "<td class='Cal_Today'>$Week[$wd]</td>";
		}
		else
		{
			echo "<td>$Week[$wd]</td>";
		}
	}
	echo "</tr>";
}
 
echo "</table>";

So könnte der Kalender beispielsweise am Ende aussehen:
PHP_Calendar
Das gesamte PHP-Skript steht hier zum Download bereit.

Man könnte nun noch eine Blätter-Funktion hinzufügen. Eine Möglichkeit diese zu implementieren ist im Download-Skript mit enthalten.

CeBIT 2010

Nachdem ich letztes Jahr nach meinem ersten CeBIT-Besuch begeistert zurück kam, hatte ich mich entschlossen auch die diesjährige CeBIT zu besuchen. Das haben mein Kumpel Martin Geßner und ich gestern auch getan. Allerdings waren An- und Abreise mit dem Zug eine “Abenteuerfahrt” …

Die Anreise

Um 05:10 Uhr sollte unser Zug von Wolfen nach Bitterfeld fahren – es hatte die Nacht geschneit und dies war der erste Zug. So gegen 05:15 Uhr kam dann die Durchsage, der Zug hätte unbestimmte Zeit Verspätung. Wenige Minuten später teilte uns die nächste Durchsage mit: 28 Minuten Verspätung. Dadurch hatten wir unseren Anschlusszug von Bitterfeld nach Halle verpasst und mussten also auf den nächsten warten. Der kam  – sogar pünktlich – 6:20 Uhr an. In Halle konnten wir durch die Verspätung des ersten Zuges erst den Zug 2 Stunden später nehmen, in den wir dann gegen 08:02 Uhr eingestiegen sind. Dieser kam aus Leipzig und war bereits gut gefüllt – wir mussten also stehen. Nachdem es von Station zu Station immer mehr Leute im Zug wurden, und man lauter Leuten fast nicht mehr umfallen konnte, wurde glücklicherweise die erste Klasse frei gegeben und wir hatten uns dort Sitzplätze ergattert – der Fahrtcomfort für die nächsten 2 Stunden war gerettet. Um 11:40 Uhr waren wir in Hannover angekommen und um 12:19 Uhr kamen wir endlich am Messebahnhof an.

Die CeBIT

Die Anfahrt hat sich aber dennoch gelohnt. Die CeBIT selbst war super. Die meiste Zeit haben wir uns natürlich bei Microsoft aufgehalten :) . Wir haben uns u. a. einen Vortrag über Microsoft Security Essentials im MSDN- / Technet-Vortragsraum angesehen, später dann noch Vorträge über Microsoft Visual Studio 2010 und Microsoft Silverlight, die nicht im Vortragsraum, sondern direkt “draußen” auf dem Gang statt fanden.
Hier mal ein paar Bilder.

CeBit 2010, Messegelände 03_web CeBit 2010, Messegelände 04_web CeBit 2010, Microsoft 01_web CeBit 2010, Microsoft 02_web CeBit 2010, Microsoft 04_web CeBit 2010, Microsoft 05_web

Die Rückreise

Rückzu hatten wir Glück, dass wir rechtzeitig im Zug saßen, denn das “Drama” vom Morgen setzte sich fort. Diesmal wurden es allerdings von Station zu Station weniger Leute im Zug. Als wir dann in Halle ankamen, schaute Martin mit seinem Handy nach aktuellen Streckeninformationen: Schienenersatzverkehr! Dadurch kamen wir nicht wie geplant 23:17 Uhr, sondern erst 00:42 Uhr in Wolfen an.

SchoolAssistant veröffentlicht

SchoolAssistant wurde soeben im Beta-Status veröffentlicht und kann nun als Source Code auf schoolassistant.codeplex.com heruntergeladen werden.

Die Struktur des Projekt hat sich noch etwas geändert. Ursprünglich sollte es nur eine einzige Hauptanwendung geben, in der Kalender und Zensurenverwaltung integriert sind. Wir haben uns jedoch aufgrund von Darstellungsproblemen des WinForms-UserControls in der WPF-Anwendung dazu entschieden, zwei getrennte Anwendungen zu erstellen.

Momentan ist nur die Zensurenverwaltung verfügbar, der Kalender ist in Kürze auch verfügbar.

Nähere Informationen zum SchoolAssistant

Die Entwicklung des SchoolAssistant ist jetzt etwas voran geschritten, sodass ich nun genau sagen kann, welche Features Version 1 höchstwahrscheinlich enthalten wird.

  • Terminkalender zum eintragen von Tests und Klassenarbeiten mit einstellbarer Erinnerungsfunktion
  • Zensurenverwaltung mit Funktionen für Statistik und Auswertung sowie Vorausberechnung (Welche Zensure(n) müsste ich erhalten, um letztendlich eine bestimmte Gesamtzensur zu erlangen?)

Für die Zensurenverwaltung wird ein eigens entwickeltes XML-basiertes Dateiformat verwendet.

Neues Projekt: School Assistant

Parallel zur Homepageverwaltung 2 starte ich nun auf CodePlex ein neues Projekt “School Assistant”. Es soll Schülern helfen, ihre Zensuren, Tests und Klassenabeiten zu organisieren und auszuwerten. Realisiert wird es in C# mit WPF. Genaueres folgt später.

Das Projekt ist auf schoolassistant.codeplex.com zu finden; bis zum 30.01.2010 wird es zumindest eine Beta geben.

Wer am SchoolAssistant mitentwickeln möchte, kann mich über info@sebastian-wolfen.de kontaktieren!

How-To: RichTextBox absatzweise auslesen

Für mein aktuelles Projekt, die Homepageverwaltung 2, ist es nötig, den Inhalt eine RichTextBox nicht zeilenweise, sondern absatzweise auszulesen und im HTML-Code erst dann ein <br /> einzufügen. Wie das funktioniert, zeige ich nun.

Zuerst wird ein String, der den späteren HTML-Code enthält, erstellt.

string HtmlCode = "";

Nun wird die RichTextBox mittels einer foreach-Schleife absatzweise ausgelesen.

foreach (Paragraph p in _InhaltRTBox.Document.Blocks)
{
    // TextRange-Objekt mit Text vom Absatz-Anfang bis Absatz-Ende füllen
    TextRange ParagraphText = new TextRange(p.ContentStart, p.ContentEnd);
 
    // Text des TextRange-Objekts (mit etwas Formatierung) in den String schreiben
    Text += ParagraphText.Text.ToString() + Environment.NewLine;
    Text += "<br />" + Environment.NewLine;
}

Neues Projekt: Homepageverwaltung 2

Mein neues Projekt ist die Version 2 meiner Homepageverwaltung, ein Programm, das ich für die Interent-AG an meiner Schule schreibe. Damit können wir dann leichter und schneller neue Inhaltsseiten sowie Artikel und Kalendereinträge für die Schul-Homepage, die übrigens am 14. 12. online geht ( www.heine-gymnasium-wolfen.de), erstellen.

Es wird mittels WPF / C# realisiert und das Design ist an das der Schul-Homepage angeleht. Erste Screenshots folgen bald.

How-To: E-Mails versenden mit C#

Für Kontaktformulare oder andere Zwecke  ist es nötig, E-Mails zu versenden. Wie das mit C# funktioniert möchte ich nun einmal kurz zeigen.

Zum Versenden von Mails sind zunächst Absender und Empfänger (jeweils Adresse und Anzeigetext), Inhalt der Mail sowie ein E-Mail-Server nötig. Außerdem kann man noch einen Betreff und Anhänge anfügen. Bei meinem portable MailClient werden diese Informationen aus TextBoxen geholt.

Das Fenster für neue E-Mails im pMC.

Das Fenster für neue E-Mails im pMC. (Server und Absender werden in einem anderen Fenster abgefragt.)

Nun aber zum Code. Zunächst sollten für bessere Übersichtlichkeit im Code zwei Namespaces eingebunden werden.

using System.Net;
using System.Net.Mail;

Danach wird die Methode zum Versenden geschrieben.

private void MailSenden()
{
    // Erstellen von zwei E-Mail-Adressen: Absender und Empfänger
    MailAddress Absender = new MailAddress("Adresse",
       "Anzeigename", System.Text.Encoding.UTF8);
    MailAddress Empfaenger = new MailAddress("Adresse", "Anzeigename",
       System.Text.Encoding.UTF8);
 
    // MailMessage erstellen und mit Inhalt füllen
    MailMessage Mail1 = new MailMessage(Absender, Empfaenger);
    Mail1.IsBodyHtml = true;
    Mail1.Subject = "Betreff";
    Mail1.Body = "Inhalt";
 
    // SmptClient zum Versenden der Mail
    SmtpClient SmtpClient1 = new SmtpClient("Server");
    SmtpClient1.Credentials = new NetworkCredential("Benutzername", "Passwort");
    SmtpClient1.Send(Mail1);
}