ContextMenuStrip – Dynamisch Separatoren anzeigen oder ausblenden (C#)

In diesem Artikel möchte ich eine Methode vorstellen mit welcher je nach sichtbaren Menüpunkten eines Kontextmenüs die Separatoren zwischen einzelnen Menügruppen angezeigt (visible == true) bzw ausgeblendet (visibel == false) werden.

Schauen wir uns doch zuerst einmal an um was es dabei wirklich geht.

Hier zuerst das Gesamte Menü mit allen Möglichen Menüpunkten.

Dieses Beispiel stellt das Kontextmenü einer Anwendung dar, die verschiedene Kalendereinträge enthalten kann.

Je nachdem welche Art Kalendereintrag (Planung, Anlieferung, Sperrzeit etc.) ausgewählt wurde und welche Berechtigungen ein Benutzer besitzt werden nur bestimmte Menüpunkte aus dieser Gesamtauswahl angezeigt.

Häufig wird das so geregelt, dass man anstelle die Menüpunkte auszublenden diese nur deaktiviert. In diesem Fall ist es dann nicht notwendig sich Gedanken darüber zu machen einzelne Separatoren für eventuell ganz wegfallende Menügruppen zu entfernen.

Nachfolgend nun einige Abbildungen die anzeigen was passiert wenn man die Menüpunkte ausblendet ohne sich um die Separatoren zu kümmern.

Man beachte die vielen direkt aufeinander folgenden Separatoren, Sieht nicht wirklich Professionell aus.

Nun kann man natürlich die Separatoren ebenfalls im Opening Event manuell Sichtbar oder Unsichtbar machen (setzen der Visible Eigenschaft), dass kann aber je nach Komplexität der Menüstruktur sehr schnell sehr mühsam und sehr fehleranfällig werden.

Genau aus diesem Grund habe ich mir hierzu eine Methode erstellt die sich um diese Aufgabe selbstständig kümmert und je nach sichtbaren Menüpunkten die benötigten Separatoren ebenfalls sichtbar oder unsichtbar macht.

Doch bevor ich die Methode zeige, möchte ich zuerst das Ergebnis anhand der nachfolgenden Abbildungen zeigen. Hier nun die korrekt dargestellten Menüs.

Das sieht doch schon viel besser aus !

So nun aber der Quellcode der Methode.

internal static void SetToolStripSeperatorForContextMenu(ContextMenuStrip contextMenuStrip)
{
	bool isVisible = false;
	int seperatorIndex = 0;
	for (int i = 0; i < contextMenuStrip.Items.Count; i++)
	{
		if (contextMenuStrip.Items[i] is ToolStripSeparator)
		{
			contextMenuStrip.Items[i].Visible = false;
		}

		if (contextMenuStrip.Items[i].Available)
		{
			if (seperatorIndex > 0)
			{
				contextMenuStrip.Items[seperatorIndex].Visible = true;
				seperatorIndex = 0;
			}
			isVisible = true;
		}
		if (contextMenuStrip.Items[i] is ToolStripSeparator)
		{
			if (isVisible)
			{
				seperatorIndex = i;
			}
			isVisible = false;
		}
	}
}

Übrigens die Methode einfach am Ende des Opening Event des Kontextmenüs wie folgt aufrufen.

SetToolStripSeperatorForContextMenu(((ContextMenuStrip) sender));

Und fertig.

Darius quatscht mit Christian über WebMatrix Razor und Co!

Die Überschrift hätte auch lauten können.

Bericht zum WebMatrix Web Camp in Bad Homburg am 22.03.2010.

Doch eine solch trockene Überschrift wäre dem Event nicht gerecht geworden.

Darius Parys, Microsoft Technical Evangelist (Sorry Darius ich konnte mir deine dir selbst gegebene Job Beschreibung nicht merken. :-) )hat mit Christian Wenz (Der Christian Wenz, der auch Bücher schreibt und nicht der Zahnarzt aus Rosenheim) in einem lockeren Gespräch WebMatrix präsentiert.

Mit Hilfe von WebMatrix (eigentlich mit Hilfe des Web PI) wurde demonstriert wie einfach es sein kann vorbereitete Open Source Web Anwendungen, das sind übrigens nicht nur ASP.NET Anwendungen, wie man auch in der Demo sehen konnte, auf einem Computer zu installieren, diese gegebenenfalls anzupassen und dann zu veröffentlichen (Publish zum Hoster).

Im Zuge dieser Demonstration wurde WordPress (Ja WordPress eine PHP/mySQL Anwendung) mit Hilfe des Web PI auf dem Notebook von Darius installiert. Nach erfolgreicher Installation wurde dann auch noch gezeigt hat, wie man mit WebMatrix ein WP Plugin schreiben kann. Auch das geht mit WebMatrix – Microsoft goes PHP :-) .

Gezeigt wurde natürlich aber auch die Verwendung von Microsofts neuer Rasiermesser scharfen Template Sprach(engine) Razor. Diese neue Scriptsprache (darf ich das so nennen ?) von Microsoft soll es unter anderem Einsteigern erleichtern in die Programmierung von Web Anwendungen einzusteigen.

Über die genauen Feature, Möglichkeiten und Zielgruppen von WebMatrix hatte ich bereits in meinem Artikel WebMatrix ist Heute Web Matrix war Gestern geschrieben und deshalb kann ich hier auf eine Wiederholung verzichten.

Um noch einmal auf die Zielgruppe und Razor zurückzukommen.

Ich wage zu bezweifeln dass in Ermangelung der fehlenden Intellisense ein solches Tool gerade bei Anfängern gut ankommen wird. Hier wird Microsoft nachbessern müssen.

Neben WebMatrix haben Darius und Christian aber auch noch über Themen wie HTML 5 und jQuery gesprochen. Beides Themen die jeden Web Entwickler sicherlich und wenn nicht schon Heute, dann vor allem in der Zukunft sicherlich lange und ausführlich beschäftigen werden.

Die Diskussion um HTML 5 hat mich, in Bezug auf meine Meinung zum IE 9,  etwas nachdenklich werden lassen. Eventuell werde ich meine Meinung bezüglich des IE 9 noch einmal überdenken müssen und den IE nicht nur als reinen Browser, zum betrachten von Internetseiten, anzusehen.

Aber nun noch mal zurück zum Thema WebMatrix.

Ich persönlich sehe WebMatrix nicht nur als Werkzeug für Neulinge an, sondern auch als recht hilfreiches Tool zur Installation und Einrichtung von Produkten die über den Web PI installiert werden können.

Es war wirklich noch nie einfacher Web Anwendungen wie:

DotNetNukeBlogEngine.NETJoomlaDrupalWordPress

Auf einem lokalen Rechner zu installieren, anzupassen und dann mit einem Knopfdruck zu veröffentlichen.

An dieser Stelle möchte ich nicht verpassen mich bei den beiden Referenten für Ihren gut gelaunten und wie immer kompetenten Vortrag zu bedanken.

Ich kann für mich sagen, das war ein guter Tag, Danke!

Firefox 4 Final Release bereits auf den Server von Mozilla vorhanden

Auch wenn die offizielle Veröffentlichung der neuen Version 4.0 des Firefox Browser erst Morgen (22.03.2011) stattfinden soll, sind die neuen Versionen bereits Heute auf den Download Servern von Mozilla vorhanden.

Die Neue Versionen können direkt mit den nachfolgenden Links heruntergeladen werden.

Firefox 4.0 Final Windows

Firefox 4.0 Final Linux

Firefox 4.0 Final (Mac OS)

Auf der offiziellen Webseite von Mozilla ist der Download Link noch nicht bereitgestellt, das wird sicherlich noch im Laufe des Tages geschehen.

Firefox 4 RC 2 – So etwas wie eine Vorpremiere zum Wochenende

Eigentlich soll am Dienstag den 22.03.2011 die endgültige Version von Firefox 4 auf den Markt kommen.
Überraschend erscheint Heute dann aber doch noch ein zweiter Release Kandidat. Mozilla veröffentlicht Heute den RC 2 Ihres neuen Firefox 4 Internet Browser.

Wer sich diese Version, die übrigens alle Funktionen der hoffentlich nächste Woche erscheinenden Finalen Version 4.0 enthalten soll, noch anschauen möchte, kann diese hier herunterladen.

Code Optimierung – Teil 1250 (in C# geht auch Spaghetti kodierung)

Ich bin zur Zeit, unter anderem damit beauftragt ein Projekt für einen Kunden zu überarbeiten und zu optimieren.

In diesem Zusammenhang bin ich Heute Morgen auf ein Stück Quellcode gestoßen der mich sofort an die früher (so vor 20 Jahren) sehr üblichen Spaghetti Code Programme erinnert hat.

Ich zeige hier einfach mal den Code dieser Methode wie ich sie vorgefunden habe und anschließend die von mir leicht überarbeitete Methode.

Die Methode wird übrigens dazu verwendet verschiedene Button ein und auszublenden, sowie in Abhängigkeit von Datenfeldern einer Datenbank den Button mit einem Image zu verschönern und entsprechende Datums und Uhrzeiten anzuzeigen oder auszublenden.
Ich denke anhand der nachfolgenden Abbildungen kann man sich ungefähr vorstellen was die Methode macht.

Hier der doch etwas unübersichtliche Code

#region Ankunft

if (entladung.AnkunftLKW.HasValue)
{
	dtpAnkunftDate.Visible = true;
	dtpAnkunftTime.Visible = true;
}
else
{
	dtpAnkunftDate.Visible = false;
	dtpAnkunftTime.Visible = false;
}
#endregion

#region Einfahrt

if (entladung.EinfahrtLKW.HasValue)
{
	dtpEinfahrtDate.Visible = true;
	dtpEinfahrtTime.Visible = true;
}
else
{
	dtpEinfahrtDate.Visible = false;
	dtpEinfahrtTime.Visible = false;
}

#endregion

#region Entladung Start

if (entladung.EntladeStart.HasValue)
{
	dtpEntladungStartDate.Visible = true;
	dtpEntladungStartTime.Visible = true;
	btnEntladungStart.ImageIndex = 0;
	if (entladung.EntladeEnde.HasValue)
	{
		btnEntladungStart.Enabled = false;
	}
	else
	{
		btnEntladungStart.Enabled = true;
	}
}
else
{
	dtpEntladungStartDate.Visible = false;
	dtpEntladungStartTime.Visible = false;
}

#endregion

#region Entlade Ende

if (entladung.EntladeEnde.HasValue)
{
	dtpEntladungEndeDate.Visible = true;
	dtpEntladungEndeTime.Visible = true;
	btnEntladungEnde.ImageIndex = 0;

	btnEntladungEnde.Enabled = !entladung.AusfahrtLKW.HasValue;
}
 else
{
	if (entladung.EntladeStart.HasValue)
	{
		btnEntladungEnde.Enabled = true;
	}
	else
	{
		btnEntladungEnde.Enabled = false;
		btnEntladungEnde.ImageIndex = -1;
	}

	dtpEntladungEndeDate.Visible = false;
	dtpEntladungEndeTime.Visible = false;

}

#endregion

#region Ausfahrt

if (entladung.AusfahrtLKW.HasValue)
{
	dtpAusfahrtDate.Visible = true;
	dtpAusfahrtTime.Visible = true;
}
else
{
	dtpAusfahrtDate.Visible = false;
	dtpAusfahrtTime.Visible = false;
}

#endregion

Hier der Optimierte Code

dtpAnkunftDate.Visible = entladung.AnkunftLKW.HasValue;
dtpAnkunftTime.Visible = entladung.AnkunftLKW.HasValue;

dtpEinfahrtDate.Visible = entladung.EinfahrtLKW.HasValue;
dtpEinfahrtTime.Visible = entladung.EinfahrtLKW.HasValue;

dtpEntladungStartDate.Visible = entladung.EntladeStart.HasValue;
dtpEntladungStartTime.Visible = entladung.EntladeStart.HasValue;

dtpEntladungEndeDate.Visible = entladung.EntladeEnde.HasValue;
dtpEntladungEndeTime.Visible = entladung.EntladeEnde.HasValue;

dtpAusfahrtDate.Visible = entladung.AusfahrtLKW.HasValue;
dtpAusfahrtTime.Visible = entladung.AusfahrtLKW.HasValue;

btnEntladungStart.ImageIndex = entladung.EntladeStart.HasValue ? 0 : -1;

btnEntladungStart.Enabled = ((!entladung.EntladeStart.HasValue) |
						((entladung.EntladeStart.HasValue && !entladung.EntladeEnde.HasValue)));

btnEntladungEnde.ImageIndex = entladung.EntladeEnde.HasValue ? 0 : -1;

btnEntladungEnde.Enabled = (entladung.EntladeStart.HasValue && !entladung.AusfahrtLKW.HasValue);

Man beachte die Zeilenzahlen. Die obere Variante hat genau die 4 fache Anzahl Code.
Obwohl, schön aussehen tun die vielen If’s und Else schon :-)

Und da der untere Code viel kürzer und einfacher ist, braucht man auch nichts mehr mit Region umklammern.

Ene mene meck, und Du bist weg! – Internet Explorer 9 als erstes ausgeschieden

In den meisten Berichten wird über den IE 9 gesagt:

Der IE 9 ist der beste Internet Explorer den Microsoft jemals auf den Markt gebracht hat.

Und dem möchte ich auch nicht widersprechen.

Doch was ist, wenn man die Produkte der Mitbewerber ins Spiel bringt. Wie schneidet der IE gegen seine Konkurenten ab.

Und dabei meine ich nicht irgendwelche Benchmarks. sondern den “Allatagstauglichkeitstest” und der subjektive Eindruck den der Browser bei mir hinterlässt.

Dazu ergeben sich für unter anderem folgende Fragen

  • Wie schnell startet der Browser
  • Sind die wichtigsten Plugins verfügbar (hier hat sicherlich jeder andere Ansprüche)
  • Wie schnell werden Seiten aufgebaut
  • Unterstützt der Browser die aktuellen Videoformate
  • Wie sieht es mit der Sicherheit (Hacking) aus
  • ….

Bevor ich in die Beantwortung der oben gestellten Fragen beginne, zuerst einmal die größte Enttäuschung vorweg.

Der IE 9 ist nicht mehr Windows XP tauglich (das hätte nicht sein müssen, wie es die Mitbewerber eindrucksvoll bewiesen haben).
Ich weiß XP ist alt und wird nicht mehr unterstützt, aber ich weiß auch , dass einige meiner Kunden und ich meine wirklich große International auftretende Firmen, noch immer komplett auf XP setzen. Ja sicher werden diese Firmen demnächst auch irgend wann mal umstellen (für MS hoffentlich auf eine Windows Version und nicht auf eine L…X Plattform). Übrigens muss ich teilweise in der Entwicklung auch immer noch auf XP zurückgreifen. Immer dann wenn ich an Projekten für die Kunden arbeite, die noch komplett auf XP setzen.

Dieser Punkt geht schon mal klar an die Mitbewerber, denn diese Produkte sind nicht nur für alle Windows Versionen sondern auch für Linux und Apple OS verfügbar

Nun aber zu den Antworten:

  • Wie schnell startet der Browser

Und hier habe ich gleich die nächste große Enttäuschung. MS stellt eine spezielle 64 BIT Version des IE zur Verfügung. Natürlich habe ich diese Version auf mein 64 BIT Windows 7 installiert. Das war voll Panne, das ist so langsam…..

Aber ich habe auf einem anderen Rechner mit WIN 7 32 BIT und habe dann auf diesem Rechner die 32 BIT Variante installiert und mit diesem Rechner alle anderen vergleiche vorgenommen.

Aber als Resumé muss ich leider sagen, der IE 9 braucht zum Starten viel länger als FF oder Chrome.

Wieder kein Punkt für den IE !

  • Sind die wichtigsten Plugins verfügbar

Das muss man nicht suchen, Plugins wie es die für FF und Chrome gibt, sind für den IE nicht wirklich verfügbar. Und wenn, dann sind diese auch noch  von den Mitbewerbern geschrieben, wie zum Beispiel WebM Support durch Google.

  • Wie schnell werden Seiten aufgebaut

In dieser Disziplin kann der IE auf jeden Fall mit seinen Mitbewerbern gleichziehen.

  • Unterstützt der Browser die aktuellen Videoformate

Indirekt schon siehe WebM Support, aber von Haus aus……

  • Wie sieht es mit der Sicherheit aus

Diese Frage wird sich sicherlich erst in naher Zukunft beantworten lassen

Nun das alle Fragen beantwortet sind, steht für mich fest, der IE 9 ist aus dem direkten Rennen raus.

Oder wie es in der Überschrift heißt:

Ene mene meck, und Du bist weg!

Und wie heißt es im Zählreim von F. H. Benary.

…., da blieben nur noch zwei (FF und Chrome)

Hier noch die Links zu zwei Interessante Artikeln zum IE 9

ZDNet schreibt (Englisch) Five Reasons not to “Upgrade” to Windows’ Internet Explorer 9

CHIP-Online schreibt Schlanker Browser, schöneres Web

Internet Explorer 9 von Microsoft für die Öffentlichkeit freigegeben

Letzte Nacht hat Microsoft seinen neuesten Internet Explorer (Version 9) zum öffentlichen Einsatz freigegeben. Der Internet Explorer wird in den nächsten Tagen über das “normale” Windows Update auf die Rechner mit den Betriebssystemen Vista, Windows 7 und Windows Server 2008 ausgerollt. Der neue Explorer steht in einer 64 und einer 32 BIT Version zur Verfügung.

Allerdings wird der IE 9 nicht mehr für Windows XP zur Verfügung stehen.

Und wer nicht warten will, bis der IE 9 über das Windows Update angeboten wird, kann ihn hier direkt herunterladen.

Nachdem damit nun die drei großen Browser (Chrome, Firefox und Internet Explorer) mit neuen Versionen auf dem Markt sind, kann ja das Browser Rennen in eine neue Runde gehen.

Visual Studio 2010 Service Pack 1 jetzt für alle verfügbar

Vor 2 Tagen habe ich in diesem Beitrag berichtet, dass das SP1 für VS2010 für MSDN Abonennten verfügbar ist.

Seit Gestern Abend nun ist das Service Pack 1 für Visual Studio 2010 für jeden verfügbar.

Den Installer (ca. 800 KB) kann man hier herunterladen.

Und wer das Service Pack als Iso Format (ca. 1,5 GB) zum erzeugen einer DVD benötigt, kann das hier herunterladen

Firefox 4 Release Candidate 1 (RC-1) steht zum Download zur Verfügung

Auch wenn noch nicht so richtig veröffentlicht (Es gibt noch keine Webseite mit dem Download), so sind doch die RC 1 Versionen von Firefox 4 auf den Server von Mozilla aufgetaucht. Vermutlich wird im Laufe der Nacht, dann auch eine richtige Veröffentlichung stattfinden.

Mit diesen Downloads wird der zuletzt genannte Termin 09.03.2011 zur Veröffentlichung des ersten Release Kandidaten von Firefox 4 eingehalten.

So nun aber zum wichtigesten in dieser Meldung, die Download Links:

Firefox 4 RC 1 (Windows)

Firefox 4 RC 1 (Linux)

Firefox 4 RC 1 (Mac OS)

Nun viel Spaß beim installieren und testen.

Erster – Oder doch nicht – VS2010 SP1 – Enthält keine Lösung für 2 Jahre alten Fehler

Habe ich den ersten Fehler in Visual Studio gefunden, der auch noch nach der Installation des SP 1 vorhanden ist?
Sicher nicht, aber deswegen bleibt es doch ärgerlich, dass ein bereits seit 2 Jahren bekannter Fehler nicht mit dem Service Pack behoben wurde.

Vor einigen Tagen habe ich von dem Problem berichtet, dass ein Breakpoint im DateTimePicker Event einen Rechner mit Windows 7 64 BIT zum einfrieren bringt.

Beim schreiben dieses Artikels habe ich gar nicht an das anstehende Service Pack 1 für Visual Studio gedacht.
Und ich hatte auch auf diesem Rechner keine Beta Version des SP1 installiert.

Nun habe ich Heute Morgen das Service Pack 1 für Visual Studio auf diesem Windows 7 64 BIT Rechner installiert.

Gerade eben, ich hatte das Problem mal wieder vergessen, habe ich in einer Methode die in einem Event des DateTimePicker aufgerufen wird einen Breakpunkt gesetzt und ……

Nein, das darf nicht war sein, das Problem ist trotz Service Pack 1 noch immer vorhanden.

Ich wiederhole also noch mal meine Frage:

Hallo Microsoft wann können wir mit einer Lösung rechnen?