WPF ist so extrem kompliziert ...
30.04.2008 20:27:14
|
Norbert Eder
... liest man so immer wieder in allen Foren, die sich auch nur annähernde mit der Thematik beschäftigen. Das ist auch durchaus korrekt - zumindest zu Beginn.
Dadurch, dass sich sehr viele Konzepte geändret haben und natürlich jede Menge neues hinzukam, hat sich die Entwicklung von grafischen Oberflächen drastisch geändert. Das resultiert natürlich darin, dass die Lernkurve eine viel steilere ist und zudem viel vorhandenes Wissen verworfen werden muss.
Aber bei Windows Forms konnte ich das immer so machen. Oder so ähnlich lesen sich Beiträge. Mein Rat:
Vergesst, was ihr von Windows Forms kennt. Anders ist es kaum zu formulieren.
Windows Forms war gestern (ganz so drastisch ist es nicht, aber aus Sicht der Vision von WPF dann doch wieder). Es ist wichtig die neuen Konzepte zu erfassen und sie verstehen zu lernen. Erst dann sind erste erfolgreiche Schritte tatsächlich möglich.
Es ist nicht bloß die Trennung zwischen Präsentation und Logik, die WPF als neuartig erscheinen läßt. Nein, WPF verwendet teilweise auch Techniken, die schon zig Jahre alt sind. Eben eine Mischung aus GDI/GDI+, Web, Windows Forms usw. Das alles auf Basis von DirectX und noch dazu mit einem unterschiedlichen Rendering-Mechanismus.
Es haben sich nicht nur die Möglichkeiten verändert, nein. Auch Gedanken müssen anders gedacht werden. Andere Schritte als bisher führen zum Ziel. Vieles erscheint im ersten Moment als sehr kompliziert, zeigt aber erst nach einer gewissen Einarbeitungsphase den wahren Reiz und die wahren Möglichkeiten. Wer über die ersten Frust-Momente hinweg kommt, der hat es geschafft.
Daher all denjenigen, die sich selbst in Frage stellen, denen ich in diversen Foren Mut machen konnte oder diejenigen, die diesbezüglich eine Aussage von mir per Mail "eingefordert" haben: Versucht die Konzepte dahinter zu verstehen und befreit euch vom Gedanken, wie es denn unter Windows Forms funktionieren würde ...
"WHERE IN" - Abfrage mit LINQ to SQL
30.04.2008 14:30:00
|
Jürgen Gutsch
Nach etwas probieren hatte ich dann heraus, wie ich mit LINQ to SQL einen "WHERE IN" - Abfrage bekommen:
List<string> tmpList = new List<string>();
foreach (Group group in user.Groups)
tmpList.Add(Group.ShortName);
string[] tmpArr = tmpList.ToArray<string>();
var calendars = from cal in db.Calendars
where (tmpArr.Contains(cal.OWNER))
select cal;
Die Contains-Abfrage in der WHERE Bedingung erzeugt eine "WHERE IN"- Abfrage in dem Stil
([t0].[OWNER] IN (@p1, @p2, @p3, @p4))
Ganz einfach...
Man muss es nur wissen...
Bzw. jemand sollte es mal dokumentiert haben ;-)
"WHERE IN" - Abfrage mit LINQ to SQL
30.04.2008 14:30:00
|
Jürgen Gutsch
Nach etwas probieren hatte ich dann heraus, wie ich mit LINQ to SQL einen "WHERE IN" - Abfrage bekommen:
List<string> tmpList = new List<string>();
foreach (Group group in user.Groups)
tmpList.Add(Group.ShortName);
string[] tmpArr = tmpList.ToArray<string>();
var calendars = from cal in db.Calendars
where (tmpArr.Contains(cal.OWNER))
select cal;
Die Contains-Abfrage in der WHERE Bedingung erzeugt eine "WHERE IN"- Abfrage in dem Stil
([t0].[OWNER] IN (@p1, @p2, @p3, @p4))
Ganz einfach...
Man muss es nur wissen...
Bzw. jemand sollte es mal dokumentiert haben ;-)

UI Automatisierung in Team Build integrieren
30.04.2008 13:53:15
|
Christian Binder
Im Webcast UI Automation Framework haben wir prinzipiel aufgezeigt, wie man ein UITest für eine Winforms Anwendung mit Hilfe des UI Automation Frameworks erstellen kann und wie diese in einen UnitTest integriert werden können.
Im folgendem möchte ich aufzeigen wie man einen solchen UI-UnitTest in Team Build integrieren kann.
Was ist zu tun?
UITest benötigen eine "Interactive Session", wir müssen also einen Interactive Build Agent definieren und den Build Service entsprechend für einen Interactive Port konfigurieren. Die notwendigen Schritte sind unter folgendem Link beschrieben.
Danach kann man den Build Agent konfigurieren (mit dem Interactive Port):
Bevor man Builds mit diesem Agent ausführen kann, muss der Interactive Build Service auf dem
BuildServer gestartet werden. Für UI-Tests ist es erforderlich, dass ein Account angemeldet ist
und in diesem Kontext der Interactive BuildService gestartet wurde. Ich habe dies mit einem
Batch automatisiert:
StartInteractiveBuildService.bat
runas /user:TFSBUILD /savecred "cmd /k \"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\TFSbuildservice.exe\""
Nun kann eine Build Definition erstellt werden, welche den BuildAgent verwendet.
Eine Hürde gilt es aber noch zu nehmen, für die es aber je nach Anforderung unterschiedliche Lösungsansätze gibt.
Der Unit-Test muss das UI automatisch starten/schliessen. Im Prinzip sehr einfach, allerdings liegt das im Build erzeugte UI-image in Abhängigkeit von verschiedenen Parametern in unterschiedlichen Pfaden. Die Abhängigkeiten sind z.B. Desktop Build oder Team Build, Debug Build oder Release Build,. In allen Fällen ergibt sich ein anderer Pfad zum Image.
Beispiel:
Desktop Build: "BasePath\Calc\bin\Debug\calc.exe"
Team Build: "BasePath\Binaries\Debug\calc.exe"
wobei der BasePath auch unterschiedlich ist, aber im Test Kontext verfügbar ist.
Ich habe mir für dieses Beispiel ein Anforderungsrahmen gegeben:
- keine Änderung der Default Build-Pfade
- der UnitTest soll das Image immer Starten/Beenden, ob DesktopBuild oder TeamBuild
- es wird Debug- und Release Build-Konfiguration unterstützt
Nun zu den Details.
Die Demo Solution enthält 3 Projekte:
- Calc (das UI-Image, welches getestet werden soll)
- UIDriverLib (Wrapper für das UI-Automation Framework, ich empfehle den White Wrapper zu verwenden)
- UIDruverLibTests(enthält die Unit-tests)
Der Fokus liegt auf der TestClass im UIDruverLibTests, welche 2 UnitTests enthält. Test1 ist ein nativer UI Test, der keinen Wrapper verwendet. Test2 verwendet den Wrapper. Details hierzu finden Sie im Webcast.
Um die oben beschriebene Hürde zu nehmen, habe ich die Logik zum Starten in die Region InitHelper gepackt. Das Beenden des Images muss im [TestCleanup()] durchgeführt werden, um sicherzustellen, dass keine UI's auf dem BuildServer verbleiben.
Die InitHelper Region enthält mehrere Helper Methods. Im Unit-Test verwende ich nur InitUIImage(). um das Image zu starten, die anderen Methoden sind Helper für InitUIImage().
Da ich im UnitTest einige Parameter benötige, um den Pfad für das UIImage zu erstellen, habe ich mich entschieden die wichtigsten Parameter nicht direkt im Test als Konstanten zu definieren, sondern diese als zusätzliche Test-Properties abzulegen und somit im UI zugänglich zu machen:
Mit GetCustomProperties lese ich diese Properties dann aus. GetImagePath enthält dann die Logik den Pfad in Abhängigkeit aller Parameter zu erstellen. StartUIImage startet dann das Image.
Auf diese Weise kann ich den UI Unit-Test auf dem Desktop oder als TeamBuild, als Release oder Debug ausführen.
Das Beispiel ist reiner Demo code, was man auch an den Sleep's sieht (sonst gehts einfach zu schell). Dennoch hoffe ich, die ein oder andere Idee gegeben zu haben, UI-Automation als Teil des Build Prozesses zu implementieren. In Prodcution das entsprechende Exception Handling nicht vergessen!
Ausblick: Coded UI-tests sind schon jetzt im aktuellen Rosario CTP 12 enhalten :-)
Mit der Option den code aus einem Recording erstellen zu lassen:
Viel Spass
Chris
Webgrafik einfach und schnell mit WPF anzeigen
29.04.2008 21:53:54
|
Norbert Eder
Wie geht man ans Werk, wenn in einer WPF-Anwendung Grafiken aus dem Internet geladen und angezeigt werden sollen? Nun ja, herunterladen, zwischenspeichern (Dateisystem, oder Arbeitsspeicher), eine BitmapSource erstellen und dann der Source eines Image-Elementes zuweisen.
Aber das geht auch einfacher!
private void HandleImage(Image image, Uri webUri)
{
BitmapDecoder bDecoder = BitmapDecoder.Create(
webUri,
BitmapCreateOptions.PreservePixelFormat,
BitmapCacheOption.None);
if (bDecoder != null && bDecoder.Frames.Count > 0)
image.Source = bDecoder.Frames[0];
}
Das ist auch schon alles was man tun muss. Stichwort ist der BitmapDecoder. Dieser bekommt in der statischen Methode
Create ein Uri-Objekt (daher muss es nicht umbedingt ein Image im Web sein) übergeben. Wenn alles gut geht, können wir das Resultat aus der Frames-Auflistung beziehen und zur Anzeige bringen.
So einfach, wenn man weiß wie ;-)
Visual Studio 2008 Gewinnspiel auf ASP.NET Zone
29.04.2008 16:08:00
|
Peter Bucher
Auf der ASP.NET Zone gibt es aktuell ein Gewinnspiel, dabei können 3 Visual Studio Lizenzen abgestaubt werden.
Ich zitiere:
Wir freuen uns, euch in Zusammenarbeit mit Microsoft ein attraktives Gewinnspiel rund um Visual Studio 2008 anbieten zu können.
Zu gewinnen gibt es insgesamt drei Visual Studio 2008 Lizenzen *, jeder der Gewinner erhält:
- 1 * Visual Studio 2008 Standard Edition
- 1 * Visual Studio Team System 2008 Team Foundation Server
- 1 * msdn Library
* Bitte beachtet: Die Gewinne werden von Microsoft zur Verfügung gestellt und sind selbstverständlich Vollversionen.
Die Lizenzen sind sogenannte NFR (Not for Resale) Lizenzen, welche nicht für den Wiederverkauf bestimmt sind und
daher nicht verkauft werden dürfen.
Weitere Informationen zum Gewinnspiel sowie zu den Teilnahmebedingungen im folgenden Link:
Ausblick auf TFS 2008 SP1
29.04.2008 09:15:00
|
Jürgen Gutsch
Lambda-Ausdrücke in C# 3.0
28.04.2008 22:43:51
|
Mathias Raacke
Ganz weit oben in der Liste meiner “Lieblingsfeatures” von C# stehen Lambda-Ausdrücke.
Vereinfacht gesagt sind Lambda-Ausdrücke die Weiterentwicklung der Anonymen Methoden
aus C# 2.0. Anonyme Methoden erlauben es, Code direkt an einen Delegate zuzuweisen.
Beispiel:
In C# 1.0/1.1 muss man einem Delegate eine vorhandene Methode zuweisen:
1: public void BeispielMethode()
2: {
3: button1.Click
+= new EventHandler(button1_click);
4: }
5:
6: private void button1_Click(object sender,
EventArgs e)
7: {
8: MessageBox.Show("Button
wurde geklickt!");
9: }
In C# 2.0 ist es nicht mehr erforderlich, dem Delegate eine benannte Methode zuzuweisen.
Stattdessen kann man ihm direkt eine anonyme Methode zuweisen, der Code verkürzt sich
auf die folgenden Zeilen:
1: public void BeispielMethode()
2: {
3: button1.Click
+= delegate(object sender,
EventArgs e)
4: {
5: MessageBox.Show("Button
wurde geklickt!");
6: };
7: }
Mit den Lambda-Ausdrücken aus C# 3.0 wird der Code erneut deutlich kürzer:
1: button1.Click
+=
2: (sender,
e) => MessageBox.Show("Button wurde geklickt!");
Dem Click-Ereignis wird hier ein Lambda Ausdruck zugewiesen. Dieser besteht aus zwei
Teilen: einer Parameterliste (links vom =>) und einem Ausdruck, auf den diese Parameter
abgebildet werden (rechts vom =>).
Der Compiler erkennt hier automatisch, dass sender vom Typ object und e vom Typ EventArgs
ist.
Da ich super müde bin und gleich einschlafe (habe den ganzen Tag einen 70-536 Prüfungsvorbereitungskurs
unterrichtet) soll das erst mal genug sein zu dem Thema, wer mehr über Lambdas wissen
möchte finden einen guten Artikel bei Scott Guthrie:
New
"Orcas" Language Feature: Lambda Expressions
Technorati
Tags:
C# 3.0,
.NET
Na? Welche .NET Framework-Version darf es denn sein?
28.04.2008 20:32:25
|
Norbert Eder
Wohl eine der häufigsten Fragen (gleich neben: "Wie bekomme ich Wert A von Form1 nach Form2?") ist wohl die, welche .NET Framework-Version eingesetzt werden soll/darf/muss.
Ein durchaus nicht (immer) einfach zu klärendes Thema. Grundsätzlich wäre es ja sehr einfach: Nimm die Version, die alles enthält, was du auch wirklich benötigst. Damit läßt sich die Frage jedoch nicht gänzlich beantworten.
Oft sind beim Kunden Prozesse am Laufen, die eine freie Wahl des .NET Frameworks nicht zuläßt (lange Evaluierungsphasen bezüglich der Sicherheit, Funktionsfähigkeit usw. fallen hier auf Anhieb ein). In diesen Fällen muss mit dem Kunden zusammen abgestimmt werden, was denn bei ihm tatsächlich verwendet werden darf. Dies betrifft nicht nur das Framework selbst, sondern auch unterschiedlichste Tools und Libraries aller Art. Bereits im Vorfeld muss eine Abgrenzung stattfinden. Dürfen 3rd Party Controls/Libraries verwendet werden? Wenn ja, welche? Diese und weitere Fragen tauchen auf.
Kunden, die derartige Einschränkungen nicht zu Tage liefern sollten jedoch auch nicht gleich mit der full featured Variante ausgestattet werden. Nach einer ordentlichen Evaluierung der Anforderungen sollte schnell klar sein, welche Komponenten notwendig sind. Dies inkludiert auch das Framework. Zukunftsdenken ist schön und oft auch unerläßlich, dennoch würde es beispielsweise wenig sinnvoll sein, eine Konsolenanwendung zum Datentransfer mit dem .NET Framework 3.5 zu implementieren. Version 2.0 ist vollkommen ausreichend. Im Falle einer Serveranwendung kommt dies eventuell nicht so schwer zu tragen (abgesehen davon, dass am Server wirklich nur das Notwendigste installiert werden sollte). Wird ein Produkt auf zig Hundert Rechner ausgeliefert, kann dies sehr wohl einen Unterschied machen. Version 2 sollte auf den meisten Rechnern installiert sein, 3.5 hingegen nicht. Dies würde einen zusätzlichen Deployment-Aufwand mit sich bringen, der nicht zur Zeit und somit auch Geld kostet, sondern eventuell auch auf der einen oder anderen Maschine zu Problemen führt (Murphy läßt grüßen).
Bei der Wahl der richtigen Framework-Version, als auch der verwendeten Tools und Libraries kann also ruhig auch ein wenig Pragmatismus ins Spiel kommen.
Ähnlich der obigen Überlegung sieht es bei der Entwicklung eines Frameworks aus. Oft erscheint in der Zwischenzeit eine neue Version des Frameworks. Eine Umstellung würde Aufwand bedeuten (mal davon abgesehen, dass eventuell neue Features hinzukommen und der begeisterte Feature-Junkie gleich ein Refactoring und ein Recoding in den Raum wirft). Hier muss überlegt werden, auf welcher Version die darauf aufbauenden Zielprojekte umgesetzt werden (sollen). Ist zu rechnen, dass eben diese Projekte auf die neue .NET Framework Version aufsetzen, sollte wohl eher umgestellt werden (eine spätere Umstellung würde vermutlich wohl noch mehr Zeit und Aufwand kosten). Jedoch muss alles gut überlegt sein.
Bei kleinen Tools und Anwendungen, die eventuell über das Internet zur Verfügung gestellt werden, gehen die Überlegungen eher in die Richtung, welche Framework-Version von den meisten Benutzern eingesetzt wird. Will man unbedingt ein aufregendes Design usw. führt ein Weg an WPF (und damit 3.0 bzw. 3.5) kaum vorbei.
Die Überlegungen sind also sehr zahlreich und eine allgemeine Antwort ist auf diese Frage nicht zu geben. Der Einzelfall muss hinterfragt und beleuchtet werden, dann ergibt sich auch eine entsprechende Antwort.
Videos der Launch-Vorträge verfügbar
28.04.2008 16:21:07
|
Jens Häupel
| Haben Sie nicht alle Vorträge besuchen können weil Sie es nicht geshafft haben, sich zu (vier-)teilen? Dann können Sie jetzt aufatmen.
Neben einer Reihe von Informationen rund um die Launch Produkte sind jetzt auch die Videos der Launch-Vorträge online.
Neben der aus Kapazitätsgründen nicht von allen gesehenen Keynote finden Sie hier die Fachvorträge zu Visual Studio 2008, Windows Server 2008 und SQL Server 2008 sowie die der deutschen SharePoint Konferenz.
Also geballtes Know-How in der Konserve. Viel Spaß damit. |
Mein Buch "LINQ" ist da
25.04.2008 20:39:00
|
Ozgur Aytekin
Es ist soweit. Mein Buch "LINQ" ist da.
Das Buch vermittelt einen ersten Überblick über das Thema LINQ. Theoretische Einführungen in die einzelnen Themengebiete werden duch praktische Beispiele und eine LINQ-Referenz ergänzt, damit Sie Ihre ersten LINQ-Abfragen implementieren und leicht nachvollziehen können.
Aus dem Inhalt:
- Einführung in das Thema LINQ
- Vorstellung der wichtigsten Elemente und Tools für den Einsatz von LINQ to SQL
- Schritt-für-Schritt-Anleitung zum Erstellen einer Anwendung mit LINQ to SQL
- Referenzkapitel zu den einzelnen Query-Operatoren mit Beispielen
- Informationen über das Thema LINQ to Objects
- LINQ to XML und Umgang mit XML-Daten
- LINQ to DataSet Funktionalitäten und Datenbindung
Angaben zu meinem Buch:
Addison-Wesley - LINQ - Theorie und Praxis für Einsteiger
Broschiert: 288 Seiten
Verlag: Addison-Wesley, München; Auflage: 1 (18. April 2008)
Sprache: Deutsch
ISBN-10: 3827326168
ISBN-13: 978-3827326164
Im Buch findet Ihr meine E-Mail-Adresse. Wenn Ihr zum Thema LINQ Fragen habt, könnt Ihr diese direkt an meine E-Mail-Adresse schicken. Ich werde es versuchen, Eure Fragen zu beantworten.
Viel Spass beim Lesen...
Özgür Aytekin

Student Technology Conference 2008 – am 15.05.08 in Berlin
25.04.2008 11:44:31
|
Mathias Raacke
Auch in diesem Jahr gibt es wieder eine Student
Technology Conference (STC), die Microsoft Konferenz Speziell für Studenten. Die
Konferenz geht dieses Jahr nur über einen Tag. Dafür bietet sie inhaltlich etwas andere
Themen als man üblicherweise von .NET Konferenzen und auch von bisherigen STCs gewohnt
ist.
Die Themen stehen ganz unter dem Motto des diesjährigen Imagine
Cup, da auch das deutsche Finale der Sofware Design Kategorie auf der STC stattfindet:
“Stell dir eine Welt vor, in der Technologie zu einer gesünderen Umwelt und zu besserem
Umweltschutz beiträgt”.
Die Teilnahme ist dieses Jahr kostenlos.
Anmeldung, Agenda und weitere Informationen gibt es unter http://www.studentconference.de/Default.aspx
TeamConf 2008 Rückblick
25.04.2008 00:57:49
|
Thomas Schissler
Ich war in den letzten Tagen auf der TeamConf
2008 in München. Es war sehr schön zu sehen, dass Team System inzwischen recht
gut etabliert. Es gab auf dieser Konferenz eine ganze Reihe von Praxisberichten die
darstellten, welche Erfahrungen Anwender bereits mit Team System gesammelt haben.
Und es war sehr interessant, mit vielen Leuten aus dem ALM-Umfeld zu diskutieren.
Ein persönliches Highlight war für mich, ein Treffen mit Sam Guckenheimer, Group Product
Planner bei Microsoft, der sich unseren WorkitemManager angesehen hat und mit dem
ich einige Ideen diskutieren konnte.
Ich habe auf der TeamConf einen Vortrag zu Programmierung mit dem TFS API am Beispiel
einer hierarchsichen Workitem-Organisation gehalten.
Workitem Templates
25.04.2008 00:34:36
|
Thomas Schissler
Mit dem Team
Foundation Server Power Tools March 2008 gibt es ein cooles Features, Workitem
Templates. Haben Sie sich nicht schon mal geärgert, dass Sie beim Anlegen eines Bugs
immer den Namen des gleichen Entwicklers eingeben müssen oder dass sie immer die aktuelle
Iteration auswählen müssen? Genau hier helfen Workitem-Templates weiter. Und das geht
so:
Nach der Installation der Power Tools gibt es im Team Explorer eine neuen Knoten "Work
Item Templates". Hier können neue Templates angelegt werden.
Für jeden Workitem-Typ können beliebig viele Templates angelegt werden. Hier können
nun die gewünschten Felder vorbelegt werden.
Auf Basis dieses Templates kann nun ein neues Workitem erstellt werden (Rechter Mausklick
auf das Template) oder auf ein bestehendes Template angewandt werden.
Weitere Informationen finden sich in der
oder auf dem Blog von
Brian
Harry>
LINQ to SQL - Transaction Beispiel
24.04.2008 20:51:00
|
Ozgur Aytekin
Als Transaktion (von lat. trans „über“, actio zu agere „(durch)führen“) bezeichnet man in der Informatik eine feste Folge von Operationen, welche als eine logische Einheit betrachtet werden. Transaktionen werden von Transaktionssystemen verarbeitet; diese erzeugen dabei aus mehreren Transaktionen eine Historie. Meist kommen sie bei Datenbanken zum Einsatz.
Quelle: Wikipedia.de
In LINQ wird eine Transaktion automatisch gestartet, wenn die SubmitChanges-Methode der DataContext-Klasse aufgerufen wird. Dabei verwendet LINQ to SQL eine explizite Transaktion.
Eine manuelle Kontrolle über die Transaktion kann durch Erstellung ein eigenes Transaction-Objekt übernommen werden.
Für den folgenden lauffähigen Beispielcode wird die AdventureWorks-Datenbank verwendet. Eine LINQ to SQL Classes-Datei (dbml-Datei) mit dem Namen AdventureWorks.dbml und mit einer Entity-Klasse
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 1 using System;
2
3 namespace LinqTransactionSample0001
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 // DataContext Objekt erstellen
10 AdventureWorksDataContext db = new AdventureWorksDataContext();
11
12 // Transaction Objekt erstellen und mit NULL initialisieren
13 System.Data.Common.DbTransaction trans = null;
14
15 // Datenbankverbindung öffnen und den aktiven Transaction der Verbindung
16 // an das trans Objekt übergeben
17 db.Connection.Open();
18 trans = db.Connection.BeginTransaction();
19
20 // DataContext Objekt wird ab hier das trans Objekt für die Transaktionen verwenden
21 db.Transaction = trans;
22
23 // Zwei neue CountryRegion Objekte erstellen
24 CountryRegion cr1 = new CountryRegion();
25 cr1.Name = "Country ABC";
26 cr1.CountryRegionCode = "ABC";
27 cr1.ModifiedDate = DateTime.Now;
28
29 CountryRegion cr2 = new CountryRegion();
30 cr2.Name = "Country DEF";
31 cr2.CountryRegionCode = "DEF";
32 cr2.ModifiedDate = DateTime.Now;
33
34 // CountryRegion Objekt an die CountryRegions Collection hinzufügen
35 db.CountryRegions.InsertOnSubmit(cr1);
36 db.CountryRegions.InsertOnSubmit(cr2);
37
38 try
39 {
40 db.SubmitChanges();
41
42 // Wenn bis hier keinen Fehler auftritt, wird die Commit-Method des Transaction-Objekts aufgrufen
43 // und die Daten werden in die Datenbank geschrieben.
44 // Commit transaction
45 trans.Commit();
46 }
47 catch(Exception ex)
48 {
49 // Bei einem Fehler-Fall wird die Rollback-Methode des Transaction-Objektes aufgerufen
50 // Rollback transaction
51 if ( trans != null)
52 {
53 trans.Rollback();
54 }
55
56 Console.WriteLine(ex.Message.ToString());
57 }
58 finally
59 {
60 // Die Datenbank-Verbindung schliessen, wenn die Verbidung offen ist.
61 // Close the connection
62 if(db.Connection.State == System.Data.ConnectionState.Open)
63 {
64 db.Connection.Close();
65 }
66 }
67
68 Console.ReadKey();
69 }
70 }
71 }
72
Das Beispiel-Projekt findet Ihr unter: LinqTransactionSample0001

CodeSnippet: XmlReader aus XML String erstellen
24.04.2008 10:14:00
|
Jürgen Gutsch
Eine Zeile Code, die ich immer wieder neu im Netz suchen muss:
XmlReader reader = XmlReader.Create(new StringReader(xml));
Damit erstelle ich einen XmlReader aus einem String welcher XML Daten enthält.
Die meisten Beispiele im Netz (selbst in der MSDN) zeigen leider nur, wie man ein XML Reader mit einer Datei oder einer externen Ressource erstellt:
z. B: Erstellen von XML-Readern
Damit ich nicht jedesmal neu suchen muss, schreibe ich es jetzt in mein Blog. (Jetzt muss ich mir nur noch merken, dass ich die Zeile hier veröffentlicht habe...)
Vortrag von Holger Schwichtenberg zum Thema ASP.NET 3.5 Extensions in der .NET User Group Paderborn
24.04.2008 10:02:27
|
Mathias Raacke
Zu unserem nächsten User Group Treffen am 05.05.2008 haben wir Holger Schwichtenberg
eingeladen. Er wird die ASP.NET in .NET 3.5 und die ASP.NET 3.5 Extensions vorstellen:
Das zusammen mit .NET 3.5 erschienene ASP.NET 3.5 und die zugehörige Entwicklungsumgebung
Visual Web Developer 2008/Visual Studio 2008 bieten neben der Integration der AJAX-Erweiterungen
einige sehr interessante neue Steuerelemente (ListView, DataPager, LinqDataSource)
sowie einen Designer, der im Bereich Formatierung, CSS sowie JavaScript-Programmierung
stark verbessert wurde. Mitte 2008 wird ein weiteres Feature-Paket erscheinen: Darin
enthalten sind vordefinierte Webservices zum Zugriff auf Daten (ADO.NET Data Services),
Dynamic Data Controls, die eine Oberfläche zur Pflege von Datentabellen automatisch
herstellen, die Lösung für das Problem mit der "Zurück"-Schaltfläche bei
AJAX, Unterstützung für Silverlight sowie eine Framework für das Model-View-Controler-Pattern
in ASP.NET.
Mehr Infos zur User Group gibt es unter http://www.dotnet-paderborn.de
>
Visual Studio 2008 and .NET Framework 3.5 Training Kit
24.04.2008 07:58:00
|
Ozgur Aytekin
Microsoft bietet ein Training-Kit für Visual Studio 2008 und .NET Framework 3.5.
Dieses Training-Kit beinhaltet unter anderem:
- Presentationen
- Hands-On-Labs
Die Themen sind folgende Features und Technologien:
- LINQ
- C# 3.0
- Visual Basic 9
- WCF
- WF
- WPF
- ASP.NET AJAX
- VSTO
- CardSpace
- SilverLight
- Mobile and Application Lifecycle Management
Es lohnt sich jedenfalls dieses Training-Kit herunterzuladen und anzuschauen.
Unter folgende URL könnt Ihr die Installations-Datei herunterladen:
Visual Studio 2008 and .NET Framework 3.5 Training Kit

Virtual TechDays
23.04.2008 19:13:00
|
Ozgur Aytekin
Das Info-Material (Recorded Sessions and Presentations) für Virtual TechDays vom 9. und 10. April 2008 kann unter folgende URL heruntergeladen werden:
http://www.microsoft.com/india/virtualtechdays/
Die Themen waren:
Windows Server 2008
SQL Server 2008 - Business Intelligence and Admin
SQL Server 2008-RDBMS
Visual Studio 2008 Fundamentals
SQL Server 2008 High Availability & Security
Visual Studio 2008 Web Applications
Visual Studio 2008 Smart Clients

Eine einfache Bildergalerie mit ASP.NET
23.04.2008 12:11:00
|
Jürgen Gutsch
Für ein kleineres Projekt benötigte ich eine einfache Bildergalerie die ich hiermit kurz vorstellen möchte
Folgende Techniken werden genutzt:
Die Bilder sollen aus einem Verzeichnis innerhalb des Webs ausgelesen und dargestellt werden. Wie die Bilder dorthin gelangen, ist erst mal nicht wichtig. Hierfür habe lese ich mit Hilfe der DirectoryInfo die enthaltenen Dateien aus, schreibe die Eigenschaften der einzelnen FileInfos in eine eigene Hilfsklasse und füge diese Klassen einer generischen Liste hinzu:
private IList<ImageFile> getData()
{
DirectoryInfo di = new DirectoryInfo(
Server.MapPath("~/Images/Gallery/"));
IList<ImageFile> files = new List<ImageFile>();
foreach (FileInfo file in di.GetFiles())
files.Add(new ImageFile()
{
FileName = file.Name,
FullName = file.FullName,
FileSize = file.Length,
CreateDate = file.CreationTime,
WriteTime = file.LastWriteTime,
AccessTime = file.LastAccessTime
});
return files;
}
Die Hilfsklasse sieht so aus:
public class ImageFile
{
public string FileName { get; set; }
public string FullName { get; set; }
public long FileSize { get; set; }
public DateTime CreateDate { get; set; }
public DateTime WriteTime { get; set; }
public DateTime AccessTime { get; set; }
public string GetImageLink(int width, int height)
{
string link = "~/ShowImage.ashx?filename=" +
this.FileName;
if (width > 0)
link += "&width=" + width.ToString();
if (height > 0)
link += "&height=" + height.ToString();
return link;
}
}
Die kleine Methode GetImageLink benötige ich nachher im ListView. Sie setzt mir die URL zum generischen Handler mit allen nötigen Parametern zusammen.
Das binden der Liste an das ListView findet im PreRender Event Handler der ListView statt, denn ein Binding im Page_Load führt dazu, das die gewählte Seite erst nach dem zweiten PostBack angezeigt wird:
protected void GalleryListViewPager_PreRender( object sender, EventArgs e)
{
this.GalleryListView.DataSource = getData();
this.GalleryListView.DataBind();
}
Für die ListView benötige ich ein ItemTemplate und ein LayoutTamplate.
<asp:ListView ID="GalleryListView" runat="server">
<LayoutTemplate>
</LayoutTemplate>
<ItemTemplate>
</ItemTemplate>
</asp:ListView>
Das LayoutTemplate enthält die Definition des Containers welches anschließend die Items enthalten soll. Es könnte also die Definition eines TABLE Controls enthalten, oder in meinem Fall eine ungeordnete Liste mit der CSS Klasse "imagelist":
<ul class="imagelist">
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</ul>
Das ListView platziert den Inhalt des ItemTemplates in den angegebenen PlaceHolder hinein. Die ID des Placeholder muss "itemPlaceholder" lauten.
Der Inhalt des ItemTemplates sieht wie folgt aus:
<li>
<asp:HyperLink ID="link" runat="server" NavigateUrl='<%# (Container.DataItem as
GO.WebGallery.ImageFile).GetImageLink(600, 0) %>' rel="lightbox[gallery]"
ToolTip='<%# (Container.DataItem as GO.WebGallery.ImageFile).FileName %>'>
<asp:Image ID="image" runat="server" Width="80px" Height="80px"
BorderWidth="1px" ImageUrl='<%# (Container.DataItem as
GO.WebGallery.ImageFile).GetImageLink(80, 80) %>' AlternateText="" />
</asp:HyperLink>
</li>
Wieso eine ungeordnete Liste? Weil eine Bildergalerie nichts anderes ist als eine Liste mit Bildern...
Beim DataBinding mit Objekten liegt aus meiner Sicht ein weiterer klarer Vorteil darin, dass ich hier direkt mit den Objekten arbeiten kann. "Container.DataItem" ist Praktisch eines meiner gebundenen Objekte. Ein Cast ("Container.DataItem as GO.WebGallery.ImageFile") und ich kann bequem auf die Eigenschaften des Objekts zugreifen.
Das Paging übernimmt hier das DataPager Control, welches ich unterhalb der ListView Platziert habe
<asp:DataPager ID="GalleryListViewPager" runat="server"
PagedControlID="GalleryListView" PageSize="12"
OnPreRender="GalleryListViewPager_PreRender">
<Fields>
<asp:NextPreviousPagerField FirstPageText="<<"
ShowFirstPageButton="True" ShowNextPageButton="False"
PreviousPageText="<" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField LastPageText=">>"
ShowLastPageButton="True" ShowPreviousPageButton="False"
NextPageText=">" />
</Fields>
</asp:DataPager>
Die letzte Komponente die ich hier kurz beschreiben möchte, ist der generische HttpHandler. Aufgerufen mit der URL ("~/ShowImage.ashx?filename=100_2116.JPG&width=80&height=80") liefert er das entsprechende Bild in der angegebenen Größe.
Zuerst wird geprüft, ob es von dem angegebenen Bild bereits ein generiertes Thumbnail gibt, wenn nicht wird das Bild in ein Bitmap Objekt geladen und bearbeitet. Mit Hilfe einiger Hilfsmethoden aus dem sharpcms (im Projekt in der Klasse "Tools") werden die Bilder verkleinert und geschärft um anschließend im HttpHandler im Ordner "Thumbs" abgelegt zu werden.
Die Ausgabe des Bildes an den ResponseStream erfolgt mit folgenden Zeilen:
context.Response.ContentType = "image/jpeg";
if (System.IO.File.Exists(thumbPath))
context.Response.TransmitFile(thumbPath);
else
context.Response.TransmitFile(filePath);
Das Projekt kann hier heruntergeladen werden:
WebGallery.zip (ca. 1MB)
TechEd Developers 2008 Orlando
23.04.2008 07:00:00
|
Mathias Raacke
Auch in diesem Jahr werde ich als Technical Learning Guide (TLG) auf der Microsoft
TechEd in Orlando arbeiten. Ich werde dort wieder Teilnehmer in den Hands-on-labs
unterstützen.
Zusätzlich werde ich ein Instructor Led Lab (ILL) präsentieren. ILLs sind Hands-on-labs,
bei denen es zusätzlich vorher eine ca. 15 minütige Präsentation zum Thema gibt, und
bei denen mehrere TLGs anwesend sind, die sich genau mit dem jeweiligen Lab auskennen.
Mir wurde ein Lab zum Thema Windows Mobile User Interfaces zugewiesen – nicht gerade
mein Erstwunsch, aber ich will mich auch nicht beschweren, schließlich ist eine Präsentation
auf der TechEd immer eine tolle Chance, egal zu welchem Thema.
Am Samstag nach der TechEd werde ich wahrscheinlich auch noch eine Train-the-trainer
Session zum Thema CardSpace halten. Das wird eine besondere Herausforderung, denn
meine Zuhörer sind in diesem Fall Microsoft Trainer (MCTs) die zum größten Teil schon
viel länger als Trainer arbeiten als ich selbst.
Letztes Jahr hat die Arbeit auf der TechEd sehr viel Spaß gemacht und ich habe dort
viele interessante Leute kennen gelernt, von denen einige auch dieses Jahr wieder
dabei sein werden. Vielleicht treffe ich ja auch wieder auf Teilnehmer aus Deutschland.
Ich freue mich jedenfalls schon sehr darauf, dieses Jahr wieder dabei zu sein.
Private Anfragen zu Problemen und wieso ich diese nicht beantworte
22.04.2008 11:40:00
|
Peter Bucher
Ab und an bekomme ich über das Kontaktformular in meinem Blog, meiner Webseite oder aber per Private Message in Foren Private Anfragen zu Technischen Problemen.
Ich rege mich bei solchen Anfragen nicht auf, sondern verweise freundlich auf Online Foren in denen ich aktiv bin.
Das hat auch mehrere, plausible Gründe:
- Wenn die Frage in einem Forum gestellt wird, haben andere auch etwas von der Antwort
- In einem Forum sind im Normalfall mehrere Leute unterwegs
- Das ergibt - abgsehen davon, das die anderen Leute in verschiedensten Bereichen auch mehr Ahnung haben können als ich - auch mehrere Meinungen zu einem Problem
- Auch geschieht die gesamte Hilfeleistung auf kostenloser und freiwilliger Basis
Wenn jemand allerdings Privatsupport von mir wünscht, kann ich das gerne arrangieren, aber das würde natürlich etwas kosten.
Ich denke das geht anderen auch so und dieses Statement kann als Allgemein angesehen werden.
Kommentare erwünscht!
MSDN WebCast zum UI-Testing mit dem UI Automation Framework
22.04.2008 11:28:00
|
Thomas Schissler
Zusammen mit Christian Binder habe
ich einen MSDN Webcast zum Thema UI-Testing mit dem UI Automation Framework erstellt.
Der Webcast zeigt, wie man mit dem UI Automation Framework Anwendungen aus einer anderen
Anwendung heraus steuern kann. Diese Methode eignet sich sehr gut um z.B. Unit-Tests
zu erstellen, die die Oberfläche einer Anwendung testen. Damit lassen sich Oberflächentests
sehr schön automatisieren. Und das beste ist, dass UI Automation Framework ist Bestandteil
des .Net Framework 3.0 und damit kostenlos.
Download
des Webcasts
CSS: 100% Höhe bei DIVs
21.04.2008 21:39:00
|
Jürgen Gutsch
Hin und wieder kommt es vor, dass DIV Elemente 100% hoch sein müssen.
Wozu benötigt man 100% hohe DIV Elemente? Oftmals werden Websites so gestaltet, dass sie 100% der Höhe des Browserfensters ausnutzen sollen. In den Zeiten von AJAX und Web 2.0 sollen immer öfter DHTML Fensterchen aufgehen und der Rest der Seite ausgegraut werden.
Wenn man beachtet, wie eine HTML Seite aufgebaut ist, ist es eigentlich recht einfach.
Gegeben ist folgendes HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Page</title>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1">
<div id="page">
</div>
</form>
</body>
</html>
Das Element mit der ID "page" soll 100% der Seitenhöhe nutzen und 48.7em (das entspricht mit normalen Einstellungen ca 780px) breit sein. Damit das Element auf der weißen Seite sichtbar wird, so es temporär rot eingefärbt werden.
normalerweise würde man jetzt hingehen und folgende Formatierung für die ID "page" in die CSS Datei schreiben:
#page
{
height: 100%;
width: 48.7em;
background-color: red;
}
Damit es keine Ränder gibt wird man den BODY und das FORM ebenfalls formatieren:
body, form
{
margin: 0px;
padding: 0px;
}
Mit dem Resultat, das unser DIV jetzt genau eine Zeile hoch, rot und 48.7em breit ist, obwohl 100% angegeben ist.
Bis hier hin werden alle schon gekommen sein... ;-)
100% ist eine relative Angabe. Wir müssen uns also Fragen: "100% von was?"
Vom Fenster, klar. Aber woher weis das CSS wie hoch das Fenster ist? Gar nicht!
CSS formatiert Elemente, relativ zum vorhergehenden, oder relativ zum übergeordneten. So werden Positionierung in den meisten Fällen relativ zum vorherigen Element vorgenommen. Und das meiste andere, relativ zum übergeordneten.
Was heißt das? Das heißt, dass das DIV jetzt 100% die Höhe des vorhergehenden Elements hat, bzw. die Höhe des Whitespace Zeichens innerhalb des DIVs
Was tun? Die Lösung liegt auf der Hand. Wir müsse die Elemente HTML, BODY, und FORM ebenfalls auf 100% Höhe setzen:
html, body, form
{
height: 100%;
margin: 0px;
padding: 0px;
}
#page
{
height: 100%;
width: 48.7em;
background-color: red;
}
HTML als oberstes Element, ist damit genau so hoch wie die Frame des Browserfensters und die untergeordneten Elemente BODY und FORM sind genauso hoch wie das jeweilige übergeordnete.
Im IE7 muss der FORM Tag fälschlicherweise nicht berücksichtigt werden. Es würde also reichen nur HTML und BODY 100% groß zu machen. Firefox und Opera benötigen dagegen ein 100% hohes FORM Tag.
Freier Plattenplatz über Freigabe abfragen
21.04.2008 09:45:50
|
Thomas Schissler
Gerade hatte ich eine vermeintlich Fragestellung. ich wollte einfach nur wissen, wieviel
Platz auf einem Laufwerk im Netzwerk noch frei ist. Das hat sich aber als problematischer
herausgestellt als gedacht, da ich nur eine Freigabe auf dem Laufwerk hatte. Das ist
wohl gar nicht so einfach, damit herauszufinden, wieviel Platz auf der entsprechenden
Platte noch frei ist. Erst über die gute alte Command-Shell und den dir-Befehl hat
das geklappt. Damit wird der freie Plattenplatz problemlos angezeigt.
Na ja, es scheint manchmal wirklich so, dass früher einiges besser war ;-)
MERGE-Statement in Microsoft SQL Server 2008
20.04.2008 19:19:00
|
Ozgur Aytekin
Mit Hilfe des MERGE-Statements können die Daten aus der Quelle in die Ziel-Tabelle unter bestimmten Bedingungen transferiert werden.
Das MERGE-Statement in Microsoft SQL Server 2008 kann in die Ziel-Tabelle neuen Datensätze hinzufügen oder die bestehenden Datensätze aktualisieren. Dabei können Kriterien definiert werden, unter welche Bedingung ein Datensatz in der Ziel-Tabelle aktualisiert oder hinzugefügt werden soll. Die Löschung einen Datensatz in der Ziel-Tabelle kann ebenfalls mit Hilfe des MERGE-Statements implementiert werden.
Der folgende Beispiel-Code erstellt in der Datenbank zwei neue Datenbanktabellen mit dem Namen Country1 (C1) und Country2 (C2). Die Tabelle C1 wird als Ziel und C2 wird als Quelle in dem Beispiel verwendet. In der C1 werden drei neue Einträge und in der C2 werden vier neue Einträge erstellt.
-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'
-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')
Für den INSERT darf die ID der C2-Tabelle in der C1-Tabelle nicht vorkommen (TARGET NOT MATCHED THEN):
MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID
-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)
Und für den UPDATE muss die ID der C1-Tabelle in der C2-Tabelle vorhanden sein (MATCHED AND C1.ID = C2.ID):
-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;
Der ganze Beispielcode ist unten aufgelistet:
--BEGIN TRANSACTION
-- Wenn die Datenbanktabelle Country1 (Ziel) oder Country2 (Quelle) in der Datenbank bereits exisitiert,
-- werden sie zuerst gelöscht.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country1]') AND type in (N'U'))
DROP TABLE [dbo].[Country1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country2]') AND type in (N'U'))
DROP TABLE [dbo].[Country2]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'
-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')
-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2
-- Verwendung MERGE-Statement
MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID
-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)
-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;
-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2
--ROLLBACK TRANSACTION
Wenn die Daten der Tabelle C1 vor und nach Verwendung des MERGE-Statements verglichen werden, sehen die Daten wie folgt aus:
Bemerkung: Die Verwendung von BEGIN und ROLLBACK-Transaction haben keinen Einfluss auf das Beispiel. Ich wollte nur meine Datenbank sauber halten :-)

MSDN Magazine April 2008
20.04.2008 18:32:00
|
Ozgur Aytekin
WPF Performance Suite Download Location
19.04.2008 12:26:00
|
Klaus Bock
Wer WPF als UI verwendet der wird die WPF Performance Suite zu schätzen wissen. Hier der Direktlink zum Download der Suite. Der WPF Performance Blog ist immer einen Besuch wert um auf dem laufenden zu bleiben.
Technorati-Tags:
WPF |
Performance
.NET GUI Community
19.04.2008 11:43:00
|
Ozgur Aytekin
.NET Community rund um alle Graphical User Interface (GUI) Themen.
Auf .NET GUI, der .NET Community, die sich mit der Entwicklung von grafischen Oberflächen beschäftigt.
Gerade mit dem Aufkommen der Windows Presentation Foundation und Silverlight, haben sich viele neue Möglichkeiten ergeben.
Der Gestaltung von Oberflächen wird höhere Priorität zuteil.
Diese Community bietet die Chance, sich über alle Belange von grafischen Oberflächen auszutauschen.
Einzige Einschränkung: Die Basis muss durch das .NET Framework gegeben sein.
Die Community ist unter der URL: http://dotnet-gui.com/ erreichbar.

BE TypeTree
19.04.2008 07:17:55
|
Boas Enkler
Hier nun eine neue Version des BE Type Tree's
Hier erstmal ein kurzer Screencast zur Bedienung des Controls.
BETypeExplorerDemo.wmv (1,54 MB)
In der nächsten Version ist es geplant die einzelnen Controls für Ihre eigenen Projekte
freizuschalten, so dass sie das Tree z.bsp. in die eigene Anwendung einbinden können!
Hier eine erste Alpha Version. Ich kann nicht ausschließen dass es da noch Bugs gibt,
Benutzung auf eigene Gefahr. Über Feedback würde ich mich freuen !
BETypeTree.zip
(175,62 KB)
BE TypeTree
18.04.2008 12:19:11
|
Boas Enkler
Der Type tree näher sich einer ersten Beta version und schon hat man Feature wünsche an mich heran getragen ;)
- Suchen von Typen nach ihrem Name (!= FullName)
- Merken der letzten Einstellungen
- Filter über Namespaces
-...
Werde ich die Tage auch noch implementieren und dann gibts die erste Beta. Wer interesse
hat kann sich gern bei mir via ICQ oder Mail melden.
Hier noch einen kurzen Screencast
BE
Type Tree Demo.wmv (1,12 MB)
WebControls erweitern
17.04.2008 10:00:00
|
Jürgen Gutsch
Nachdem im Forum die Frage aufkam, wie man einen LinkButton um einige Features erweitern kann, habe ich mal schnell ein kleines Beispiel zusammengebastelt:
public class MyLinkButton : LinkButton
{
private string imageUrl;
/// <summary>
/// Link des anzuzeigenden Bildes
/// </summary>
public string ImageUrl
{
get { return imageUrl; }
set { imageUrl = value; }
}
private ImageAlign imageAlign;
/// <summary>
/// Ausrichtung des anzuzeigenden Bildes
/// </summary>
public ImageAlign ImageAlign
{
get { return imageAlign; }
set { imageAlign = value; }
}
/// <summary>
/// Render Contents überschreiben
/// </summary>
protected override void RenderContents(HtmlTextWriter writer)
{
Image img = new Image();
img.ImageAlign = this.ImageAlign;
img.ImageUrl = this.ImageUrl;
img.RenderControl(writer);
base.RenderContents(writer);
}
}
Diese Klasse erbt von LinkButton und enthält zusätzlich die Eigenschaften ImageUrl (für den Pfad zum anzuzeigenden Bild) und die Eigenschaft ImageAlign (wie beim Image Control für die Ausrichtung innerhalb eines Absatzes, oder einer Zeile zuständig)
Das wichtigste ist allerdings die Methode RenderContents, mit der deren Hilfe man weitere Controls (oder einfach nur Text) innerhalb des Control hinzufügen kann.
Damit unter anderem auch etwas im Designer zu sehen ist, habe ich der Klasse folgende Attribute hinzugefügt:
[Designer("System.Web.UI.Design.WebControls.LinkButtonDesigner, "+
"System.Design")]
[DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, " +
"System.Design")]
[ParseChildren(false)]
[DefaultEvent("Click")]
[DefaultProperty("Text")]
[SupportsEventValidation, ControlBuilder(typeof(LinkButtonControlBuilder))]
[ToolboxData("<{0}:MyLinkButton runat=\"server\">LinkButton</{0}:MyLinkButton>")]
[AspNetHostingPermission(SecurityAction.LinkDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
public class MyLinkButton : LinkButton
{
}
Nachdem ich das Control wie folgt in der Seite registriert habe:
<%@ Register Assembly="WebApplication1"
Namespace="WebApplication1" TagPrefix="cc1" %>
kann es so benutzt werden:
<div>
<asp:LinkButton ID="LinkButton" runat="server">
<asp:Image ID="Image1" runat="server"
ImageUrl="calendar.gif"
ImageAlign="AbsMiddle" />Calendar
</asp:LinkButton>
<br />
<br />
<cc1:MyLinkButton ID="MyLinkButton1" runat="server"
ImageUrl="calendar.gif"
ImageAlign="AbsMiddle"
Text="Calendar" />
</div>
Zum Vergleich habe ich oben drüber das gleiche mit herkömmlichen ASP.NET Control zusammengebaut. Die resultierende Ausgabe ist die selbe:
Nur im Designer wird der Unterschied zwischen dem herkömmlichen Konstrukt und dem erweiterten Control sichtbar:

Das Beispiel Projekt (für VS 2008, die einzelnen Dateien können natürlich auch mit VS 2005 angesehen werden) kann hier heruntergeladen werden:
WebApplication1.zip (21 KB)
Mein erster Flug: Frankfurt - Seattle
17.04.2008 00:19:00
|
Peter Bucher
Ja, richtig gelesen. Ich bin noch nie auf die Nase geflogen :-)
Aufgrund des MVP Summits bin ich jetzt aber in den Genuss gekommen, meine Flug-Jungfräulichkeit zu verlieren :))
Irgendwie hatte ich davor ein komisches Gefühl, aber drücken konnte ich mich ja nicht mehr, hehe.
Ich hatte ein Fensterplatz und schaute schon beim Start aus dem Fenster. Irgendwie war das gaaanz cool und gar nicht schlimm :-)
Im weiteren Verlauf des Fluges konnte die Langeweile per Entertainment System mit mehr oder weniger aktuellen Kinofilmen vertrieben werden.
Während dem Flug ein paar Fotos geschossen und kurz geschlafen. Der Flug an sich verlief ohne auch nur die kleinste Störung und war im Prinzip wie eine Reise per Bus (Ausgenommen war ein kleines Luftloch, was doch etwas Adrenalin ausgeschüttet hat :).
Das coolste an der Geschichte war die Landung, als der Pilot schräg angeflogen ist (Vor dem Geradebiegen des Fliegers für den Landeanflug :). Ein spezielles Gefühl.
In Konklusion kann ich sagen: Ich habe keine Flugangst und fliege gerne wieder, Spass hats gemacht (-:
Hier noch ein paar Eindrücke vom Flug in Bildern:
|
|
Vor dem Flug
|
Sicht nach unten, nach dem Start |
|
|
Das legendäre "Flügelfoto" :)
|
Sieht doch einfach toll aus, über den Wolken |
|
|
| Grönland oder sowas (jaa Stefan, konnste mich nicht aus dem Fenster schmeissen^^) |
Kurz vor der Landung |
Von der Schweiz nach Frankfurt
16.04.2008 00:23:09
|
Peter Bucher
Donnerstag nach dem Mittag ging ich in Biel auf Zug in Richtung Basel.
Bei Basel musste ich dann umsteigen und wäre bin leider nicht, in einem Stück dann nach Frankfurt Flughafen gefahren.
Ich stieg in den vorderen Zug ein, und die Nachricht das dies nicht der Zug zum Flughafen ist, kam eine Minute vor Abfahrt beider Züge. Na toll ;-)
Egal, in Mannheim ausgestiegen und dort wieder auf den richtigen Zug gesprungen.
Schliesslich war ich in Frankfut im Flughafen. Ein riesen Areal, keinen Durchblick :))
Ich schnappte mir ein Taxi, und hatte das Glück Pech, einen wirklich netten doofen Taxifahrer erwischt zu haben.
Sogar wärend der Fahrt vertraute ich nicht wirklich auf dessen Fahrkünste... aber schlussendlich kam ich beim Hotel an.
Im Hotel klappte das Internet leider nicht, aber ein bisschen Offline tut auch gut :))
Morgen gehts dann auf nach Amerika. Redmond ich komme (-:
Achja, das Hotel war cool, und günstig teuer, sehr teuer... aber cool :)

PowerCommands for Visual Studio 2008 Verion 1.1 veröffentlicht
13.04.2008 14:48:05
|
Thomas Schissler
Die PowerCommands for Visual Studio 2008 sind jetzt in der Version 1.1 veröffentlicht
worden und bieten in dieser neuen Version einige neue Funktionen. Bei den PowertCommends
for Visual Studio 2008 handelt es sich um eine kostenlose Sammlung von nützlichen
Erweiterungen für die Visual Studio IDE. Einen Überblick über die Funktionen bietet
dieses Dokument.
Da hat es viele Sachen dabei, die sicher schon jeder beim Arbeiten mit Visual Studio
2008 vermisst hat.
PowerCommands for Visual Studio
2008 - Home
AfterLaunch in Köln - ich war dabei!
13.04.2008 13:22:50
|
Thomas Schissler
Der AfterLaunch Event in Köln war eine sehr gute Veranstaltung und sehr professionell
organisiert. Für die lächerliche Teilnahmegebühr von nur 8,-- € haben die Teilnehmer
hochkarätige Vorträge rund um die 2008er Launch-Produkte von Microsoft erhalten. Großer
Wert wurde dabei auf den Praxisbezug der Vorträge gelegt. Auch ich war dabei und hatte
zwei Sessions zum Einsatz des Team Foundation Servers 2008 in der Praxis. Leider hatte
ich etwas mit dem Beamer zu kämpfen, ich hoffe aber dass die Teilnehmer dennoch einige
Tipps zum Einsatz des TFS mitnehmen konnte und ich den einen oder anderen animieren
konnte dieses Tool nun doch einmal zu installieren und sich näher damit zu beschäftigen.
BE TypeTree
13.04.2008 13:16:07
|
Boas Enkler
Ich bin ein großer Fan des Reflector Tools von Lutz Roeder s.
http://www.aisto.com/roeder/dotnet/
Allerdings fehlten mir dort schon immer einige Features.
Häufig möchte ich innerhlab von Projekten mir schnell einen Überblick verschaffen.
Welche Ableitungen einer Klasse gibt es in einem Projekt. Gibt es vielleicht eine
Ableitung die nicht der geplanten Strategie entspricht ( falsche Basisklasse?).-
Man bekommt diese Informationen zwar mit dem Reflector heraus allerdings gibt es meines
Wissens keine "schöne" Übersicht dafür.
Deswegen habe ich den TypeTree entwickelt ( gibts demnächst hier als Free Download)
Dort stellt ein Baum die Vererbungsverbindungen zwischen klassen dar.
Hier mal noch ein kleiner Screenshot

Variable Deklaration und Wert-Zuweisung in Microsoft SQL Server 2008
13.04.2008 08:44:00
|
Ozgur Aytekin
Die Variablen Deklaration und Wert-Zuweisung in T-SQL erfolgte in zwei Schritten. Zuerst musste die Variable deklariert und dann der gewünschte Wert zugewiesen werden.
Der folgende Beispielcode wird vielen T-SQL Entwickler bekannt vorkommen:
DECLARE @Variable1 INT
DECLARE @Variable2 NVARCHAR(50)
SET @Variable1 = 100
SET @Variable2 = 'Text Variable'
Neu in Microsoft SQL Server 2008 wurde dieser Vorgang vereinfacht. Es sind nicht mehr zwei Schritten Notwendig um einen Variablen zu deklarieren und einen Wert zuzuweisen.
DECLARE @Variable1 INT = 100
DECLARE @Variable2 NVARCHAR(100) = 'Text Variable'
Wenn die Deklaration und Wert-Zuweisung von den Variablen hintereinander erfolgt, kann auch die folgende Syntax verwendet werden:
DECLARE @Variable1 INT = 100,
@Variable2 NVARCHAR(100) = 'Text Variable'

dotnet-forum.de mit eigener Mitgliederkarte
12.04.2008 19:49:22
|
Jan Welker
Aus vielen Internetforen kennt man Mitgliederkarten, in denen zu sehen ist, wo welches
Mitglied zu Hause ist. So kann man auf einen Blick erkennen, wer in der Nähe wohnt.
Für das dotnet-forum.de setze ich den CommunityServer
ein, eine hervorragende Community Plattform mit sehr vielen netten Features.
Leider gibt es keine "Membermap".
Auf externe Dienste, wie zum Beispiel Frappr, wollte ich nicht zurückgreifen, weil
sie kaum konfigurierbar und meiner Meinung nach, auch nicht schön sind.
Solch eine Karte kann mit bestehenden APIs relativ schnell entwickelt werden. Ich
habe mich als Grundlage für die Microsoft
Virtual Earth API entschieden. Schnell musste ich allerdings feststellen, dass
die Microsoft Klassen und Methoden viel zu langsam sind um einige hundert User auf
der Karte darzustellen. Dies liegt daran, dass die komplette Logik auf dem Client
läuft. Wenn z.B. 200 User dargestellt werden sollen, muss das clientseitige JavaScript
bei jedem Seitenaufbau alle geografischen Koordinaten bei Microsoft abfragen. Das
dauert bei 200 Usern und einer schnellen Internetverbindung etwas über 20 Sekunden.
Ich habe mich entschieden, die geografischen Koordinaten auf dem Server in der Datenbank
zu speichern. Dank des ASP.NET Ajax Frameworks
ist es nicht sehr schwer, die Daten im Hintergrund vom Server zu laden.
Wenn ein User seinen Wohnort im Profil ändert oder ein neuer User hinzukommt, holt
der Webserver sich nur einmal die neuen Geodaten.
Ich hab zwei weitere Gimmicks implementiert: Jeder User wird mit einem farbigen Pushpin
angezeigt Dabei werden User, die gerade online sind, mit einem grünen Pin gezeigt.
Der eigene Pushpin ist rot, alle anderen sind blau.
Die benötigten Daten frage ich mit Hilfe der CommunityServer
API ab.
Weiterhin habe ich eine Umkreissuche implementiert, auch hier ist wieder die komplette
Logik auf dem Server.
Die Karte ist ab sofort online und ist für jedes registrierte Mitglied
des dotnet-forum.de nutzbar.
Es können natürlich nur Mitglieder angezeigt werden, die auch einen Wohnort im eigenen
Profil angegeben haben. ;-)
Die Umkreissuche
Mouseover Effekt
Vortrag zu QM mit VSTS 2008 bei der UG Braunschweig
12.04.2008 12:10:04
|
Thomas Schissler
Am Donnerstag, 10.04 war ich zu Gast bei der Usergroup Braunschweig und habe dort
den Vortrag zum Thema Qualitätsmanagement mit Visual Studio Team System 2008 und Team
Foundation Server gehalten. Der Vortrag war für mich sehr interessant, da es eine
rege Beteiligung und viele Fragen durch die Teilnehmer gab.
Vielen Dank an Lars für die Einladung.
Folien
zum Vortrag
Beispielcode
zum Vortrag
Free E-Learning - .NET Framework 3.5 and Visual Studio 2008
12.04.2008 01:00:00
|
Ozgur Aytekin
Afterlaunch - er ist vorbei
11.04.2008 22:55:04
|
Albert Weinert
Aus Sicht eines Veranstalters und Sprechers, schön, schön anstrengend, ein wenig Stress, alles gut verlaufen (stand jetzt :). Somit insgesamt eine gelungene Veranstaltung auf der sich 152 Teilnehmer, 14 Sprecher, 7 Mitarbeiter von Sponsoren sowie ein überall helfender Kassenwart tummelten.
Vielen Dank an alle 174 Personen sowie den Mitarbeitern der Sponsoren die nicht vor Ort waren, das sie diesen Tag möglich gemacht haben.
http://www.afterlaunch.de
Wer mag; Lob bitte hier rein, konstruktive Kritik auch.

Logoff
10.04.2008 19:19:00
|
Peter Bucher
So, Heute ist mein letzter ganzer Tag in der Schweiz für ca 8 Tage.
Morgen nach dem Mittag gehts zuerst per Zug nach Deutschland, Frankfurt, wo ich dann erst mal eine Nacht überleben muss :-)
Danach gehts am Freitag Morgen ab zum Flughafen, wo ich dann endlich mal Stefan Falz und viele andere Kollegen persönlich sehe.
Der Flug führt mich nach Amerika, Seattle, Redmond... ja, ihr denkts euch schon: Microsoft Campus zum globalen Treffen aller MVPs die sich Ferien nehmen können :)
Während diesen 8 Tagen werde ich wohl viel weniger direkte Zeit für Internet und die Community haben,
aber wenn es geht, schreibe ich auch mal einen Bericht oder poste Fotos vom sonnigen verregneten Seattle.
Achja, man glaubts kaum, aber das ist mein erster Flug. Hoffentlich geht das gut :))
Eine neue Community für GUI mit .NET ist online
10.04.2008 14:32:00
|
Peter Bucher
Norbert Eder befasst sich jetzt schon eine ganze Zeit mit GUIs unter WindowsForms und auch schon länger mit GUIs und allem was dazugehört unter .NET 3.5, d.h. WPF.
Jetzt hat er eine Community online gestellt, die für den Austausch von GUI-Fragen / -Antworten und -Meinungen bereitsteht.
Ich werde dort - je nach dem wie die Zeit reicht - im ASP.NET GUI Part reinschauen.
Folgend zitiere ich aus dem Willkommensbeitrag aus dem Forum:
Ab sofort steht den deutschsprachigen .NET Communites eine weitere Community zur Seite. .NET-GUI.com. Eine Community, die sich mit der Erstellung von grafischen Benutzeroberflächen beschäftigt.
Unter anderem werden die folgenden Themen behandelt:
Ziel ist es, eine Plattform zu schaffen, auf der sich alle Beteiligten rund um Ihre Anliegen und Erfahrungen zur Entwicklung von grafischen Oberflächen auf Basis von .NET austauschen können.
Viel Spass auf http://www.dotnet-gui.com/ !
Launch 2008 - Welche Sprachversion des Team Foundation Servers installieren?
10.04.2008 10:24:41
|
Christian Binder
Die Teilnehmer der Launch-Veranstaltung in Frankfurt konnten bei der kostenlosen Software zwischen der englischen und der deutschen Sprachversionen wählen.
Da beim Visual Studio Team System 2008 Team Foundation Server (TFS) ein nachträgliches Wechseln der Sprache speziell von deutsch auf englisch technisch nicht möglich ist (siehe auch Plan Language Blog Eintrag), sollte vor der Installation die Sprach-Entscheidung getroffen werden. Neben der Oberfläche sind auch die Projektinhalte von der Sprache betroffen.
Wenn Sie auf der Launch-Veranstaltung eine deutsche Version des TFS gewählt haben, können Sie trotzdem die englische Version installieren.
Bitte gehen Sie dabei wie folgt vor:
(1) Laden Sie die englische TFS Trial Version herunter und installieren Sie diese komplett. Diese finden Sie hier: http://msdn2.microsoft.com/de-de/vstudio/aa700831.aspx
(2) Anschließend die Installation erneut aufrufen (über die Windows-Systemsteuerung), die Option „TRIAL aktivieren“ steht direkt im ersten Dialog zur Verfügung.
(3) Den Key der deutschen TFS-Version aus dem Launch Kit eingeben und damit die englische Version des TFS aktivieren.
Ein ausführlichere Beschreibung finden Sie auch auf Brian Harry´s Blog unter:
http://blogs.msdn.com/bharry/archive/2008/01/15/how-to-i-upg...
Chris
Das .NET-Snippets.de Vista Gadget ist da
09.04.2008 22:59:14
|
Jan Welker
Hole Dir den Snippet des Tages auf den Desktop!
Dieses Gadget für die Vista Sidebar zeigt jeden Tag ein Snippet des Tages von der
Webseite .NET-Snippets.de an.
In einem Flyout werden zu dem Snippet auch die Beschreibung und selbstverständlich
der Quellcode angezeigt.
Wird das Gadget auf den Desktop gezogen (undocked mode) werden Links zu weiteren 4
Snippets angezeigt.
Die Auswahl der angezeigten Snippets erfolgt zufällig, jedoch werden nur Snippets
ausgewählt, die von den .NET-Snippets.de Usern
mit mindestens 8 Punkten bewertet wurden.
Entwickelt wurde das Gadget von Robert Tanev,
vielen herzlichen Dank dafür!
Viel Spaß mit dem Gadget!
Jetzt
downloaden!
Fehler beim Ausführen eines Web-Tests
09.04.2008 22:41:35
|
Thomas Schissler
Wenn man aus Visual Studio einen Web-Test startet und diese Meldung bekommt, muss
man die Bowser-Extensions im IE enablen.
Hierzu im IE unter Internetoptionen auf dem Reiter Advanced die Option "Enable third-party
browser extensions" aktivieren. Dann kann der Web Test Recorder im IE ausgeführt werden.
Vorlesung BA Heidenheim - Verteilte Anwendungen mit WCF
09.04.2008 14:29:33
|
Thomas Schissler
Ich halte momentan eine Vorleseung bei der Berufsakademie Heidenheim mit dem Titel
"Implementierung verteilter Anwendungen auf Basis von Microsoft .NET". Im Zentrum
dabei steht natürlich WCF. Hier nun die Folien und das WCF-Demo vom ersten Tag. Die
Demos der beiden folgenden Termine werde ich hier auch noch veröffentlichen.
Folien
(Powerpoint 2007)
Folien
(PDF)
Code
Fehler beim installieren von NetAdvantage 2008.1 unter Vista
08.04.2008 23:30:23
|
Thomas Schissler
Habe gerade die neue Infragistics Netadvantage Suite 2008.1 intalliert. Bei der Installation
der ASP-Komponenten muss man allerdings eine kleine Einstellung machen, sonst erhält
mein einen "Fatal error".
Erst wenn man in den Windows Features die IIS6 Management Compatibility aktiviert
hat, klappt die Installation
Mehrere Sprachen in eine Assembly kompilieren / mergen
08.04.2008 20:49:00
|
Peter Bucher
Ich dachte lange, wenn ich ein VB.NET- und ein C#-Projekt habe, geht es nicht, daraus eine einzige Assembly zu erzeugen.
Und wenn, dann nur mit Abstrichen in der Handlichkeit des ganzen, also keine Visual Studio Integration, Debuggin, Intellisense, etc..
Nun, eine kleine Resserche Heute Abend und ich wurde gleich zweimal vom Gegenteil überzeugt.
Vorneweg, ich möchte das im Normalfall natürlich niemandem empfehlen, wenn es jedoch unvermeindlich ist, oder aber Vorteile mit sich bringt, wieso nicht? :-)
Ganz nützlich wenn eine Control Sammlungs Assembly erstellt werden muss, und Controls in VB.NET, wie auch C# bestehen :-)
Hier die erklärenden Links (Englisch):
Vortrag UG München - Qualitätsmanagement mit VSTS
08.04.2008 18:00:21
|
Thomas Schissler
Zusammen mit meinem Kollegen Mark werde ich am 22.04.08 bei der UG
München den Vortrag zum Thema Qualitätsmanagement mit VSTS nachholen.
Thema des Vortrags:
Dass Qualitätsmanagement heute ein fester Bestandteil eines modernen Entwicklungsprozesses
sein sollte, ist inzwischen - zumindest in der Theorie – keine Frage mehr. Die Wirklichkeit
ist aber leider immer noch sehr häufig eine andere. Woran liegt das? Terminstress,
sich ändernde Anforderungen im Projektverlauf und in vielen Fällen ein erheblicher
bürokratischer Overhead bei der Ausführung von QM vereitelt erfolgreich, die definierten
Maßnahmen auch zu leben.
Die Test-Tools von Visual Studio hat wohl schon fast jeder einmal gesehen, evtl. auch
genutzt. Entscheidend beim Einsatz dieser Tools ist aber die Integration in den Gesamtprozess.
So besteht ein erfolgreiches QM nicht nur aus Tests, sondern auch Requirementmanagement,
Releasemanagement, Testability und andere Aspekte spielen hierbei eine wichtige Rolle.
Die Kunst besteht darin, diese verschiedenen Aspekte über den Gesamtprozess miteinander
zu verbinden. Wie dieses Ziel mit VSTS und TFS erreicht werden kann, zeigt der Vortrag.
Die ideale Zielgruppe für diesen Vortrag sind: Entwickler, Qualitätsmanager, Testexperten
und IT-Entscheider mit der Bereitschaft, sich auch das ein oder andere Prozessdetail
live anzusehen.
Weitere Details finden sich hier
Problem beim Anlegen eines Ordners in der TFS Versionsverwaltung
08.04.2008 15:40:22
|
Thomas Schissler
Mit der Versionsverwaltung im Team Foundation Server kann man ja bekannter maßen nicht
nur Code verwalten, sondern auch andere Dateien wie z.B. SQL-Skripte, Dokumentationen
etc. Hierzu ist es sinnvoll, entsprechende Ordner anzulegen. Doch das will manchmal
nicht recht gelingen. Will man unterhalb dem Root eines Projektes einen neuen Ordner
anlegen, kann es vorkommen, dass der Button dazu disabled ist.
Der Grund dafür ist einfach (wenn man's weiß). Ein Blick in den Workspace verdeutlicht
das Problem.
Hier sieht man, dass im Workspace ein Mapping für den Unterordner "Benutzerverwaltung"
eingerichtet ist. Da die Versionsverwaltung alle Operationen, also auch das Anlegen
eines neuen Ordners aber auf dem lokalen Pfad ausführen muss, tritt hier ein Problem
auf. Die Anwendung weiß nicht, wo sie den Ordner lokal anlegen soll. Abhilfe schafft
hier, wenn man das Mapping auf der Projkektebene einstellt, also so:
Alternativ kann man natürlich auch ein separates Mapping für den Root-Ordner des Projektes
einrichten. Jetzt kann der Ordner lokal einem gültigen Pfad zugeordnet werden und
der Button ist auch wieder enabled.
Die Afterlaunch-Konferenz ist ausgebucht
08.04.2008 12:21:29
|
Albert Weinert
Ich freue mich der Welt mitzuteilen dass die Afterlaunch-Konferenz am Freitag den 11. April 2008 restlos ausgebucht ist.
Die glücklichen Ticket-Besitzer werden am Freitag in Köln erwartet, es kann nur großartig werden!

{smartassembly} testen und Lizenz bekommen
07.04.2008 20:36:42
|
Jan Welker
{smartassembly} ist ein Entwicklungswerkzeug
zum Optimieren und Schützen (Obfuscator) von .NET Assemblys.
Einige Keyfeatures sind:
- Anwendung verkleinern durch Entfernen von ungenutztem Code
- Alle zusätzlich eingebundenen DLLs in der Anwendung integrieren
- Sehr gute Code Obfuscation
- Ausschließung von nicht abgeleiteten Klassen (ClassSealing)
- Strings unlesbar machen
Mehr Informationen über {smartassembly} gibt es auf
der Webseite des Herstellers.
Die Firma Cachupa bietet
2 Lizenzen für dotnet-forum.de Mitglieder
kostenlos an.
Was zu tun ist, um die Lizenz zu bekommen, kann im Forum nachgelesen werden.
Nachtrag:
Der erste Testbericht ist online: zum
Artikel
Der zweite Testbericht ist online: zum
Artikel
Zum Forum...
Buchbeschreibung SharePoint & Co. - Technologien und Tools im Teamwork
07.04.2008 08:26:37
|
Thomas Schissler
In loser Folge schreibe ich über besonders gute oder schlechte Bücher an dieser Stelle.
Nun habe ich vor Kurzem das Buch ScharePoint & Co gelesen und finde dieses Buch
durchaus empfehlenswert. Gleich vorneweg, das Buch enthält keine Informationen, wie
man für SharePoint Web-Parts entwickelt. Es war für mich als Entwickler aber dennoch
sehr interessant, weil es sehr gut die verschiedenen Einsatzmöglichkeiten von SharePoint
in Zusammenarbeit mit anderen Office-Anwendungen beschreibt. Es wird anhand verschiedener
praxisorientierter Beispiele gezeigt wie man Daten in Excel- oder Access-Tabellen
innerhalb von SharePoint nutzt, wie man auf der SharePoint Plattform Kommunikation
effizient gestaltet, z.B. mit dem Exchange-Server oder Groove, wie man InfoPath-Formulare
nutzt und wie man mit dem SQL-Server Business Intelligence realisiert.
Das Buch hat mir die eine oder andere Möglichkeit aufgezeigt, die ich bisher noch
nicht kannte und wo ich früher vielleicht erst mal selbst ein WebPart oder eine andere
Lösung geschrieben hätte. Das Buch hat mir verdeutlicht, dass SharePoint mehr kann,
als ich bisher wusste. Das gibt mir die Möglichkeit, unser Portal um Funktionen zu
erweitern, die bisher wegen zu viel Aufwand einfach außen vor geblieben sind.
Aus meiner Sicht ein absolut empfehlenswertes Buch, auch für Entwickler.
SharePoint
& Co. - Technologien und Tools im Teamwork von MindBusiness und HanseVision erschienen
bei Microsoft-Press
Team Foundation Build 2008 API Dokumentation
06.04.2008 01:38:11
|
Thomas Schissler
First und FirstOrDefault Operatoren
05.04.2008 23:20:00
|
Ozgur Aytekin
Mit beiden Operatoren kann das erste Element aus einer Liste ermittelt werden.
Die Operatoren verhalten sich anders, wenn der Abfrage ein leeres Resultat zurück liefert. Der Operator First feuert eine InvalidOperationException. FirstOrDefault Operator liefert einen NULL-Wert zurück.
In dem folgenden Beispiel wird die AdventureWorks-Datenbank als Datenquelle verwendet. Es wird versucht, mittels folgende Abfrage die Produkt zu ermitteln, welche an die Produktekategorie (ProductCategory) Bikes und Produktesub-Kategorie (ProductSubcategory) Mountain Bikes zugeortned sind. Als letzte Bedingung wird der Listenpris (ListPrice) kleiner als 500 vernwendet.
AdventureWorksDataContext db = new AdventureWorksDataContext();
IQueryable<Product> qry = from pc in db.ProductCategories
join psc in db.ProductSubcategories on pc.ProductCategoryID equals psc.ProductCategoryID
join p in db.Products on psc.ProductSubcategoryID equals p.ProductSubcategoryID
orderby p.ListPrice
where pc.Name == "Bikes" && psc.Name == "Mountain Bikes" && p.ListPrice < 500
select p;
Die obige Abfrage liefert keine Produkte zurück, weil in der Datenbanktabelle Product kein Produkt die WHERE-Bedingung entspricht.
Wenn jetzt versucht wird, mit dem Operator First den ersten Produkt zu ermitteln, wird eine Exception gefeuert.
Dagegen, wenn der Operator FirstOrDefault verwendet wird, wird als Resultat einen NULL-Wert zurück geliefert.
Meine Empfehlung ist, den FirstOrDefault Operator verwenden, wenn das Resultat nicht immer einen Wert zurück liefert.

PropertyGrid mit dynamischen Datenobjekten verbinden
05.04.2008 00:17:09
|
Thomas Schissler
Über das PropertyGrid-Control habe ich ja mehrmals gebloggt (z.B. hier).
Dieses Control verwendie ich recht häufig um z.B. den Inhalt eigene Konfigurations-Klassen
zu editieren. Zusammen mit der XML-Serialisierung lassen sich so sehr flexible Konfigurationsmöglichkeiten
schaffen.
Nun hatte ich die Anforderung eine dynamische Datenstruktur an ein PropertyGrid zu
binden. Da stand ich zunächst vor einem Problem. Bisher habe ich nur Objekte mit Properties
unterschiedlicher Typen an das PropertyGrid gebunden. Nun habe ich eine Liste von
Objekten, die die Elemente im PropertyGrid beschreiben. Wie aber diese an das PropertyGrid
binden?
Das schöne ist, das das PropertyGrid sich hier als sehr flexibel erweist. Man muss
folgende Schritte durchführen:
-
Man brauch eine Klasse für ein einzelnes Property
-
Dann brauchen wir eine Collection für diese Properties. Diese leiten wir von CollectionBase
und ICustomTypeDescriptor ab und implementieren die Interfaces. Entscheidend ist hier
die Methode GetProperties. Hier werden nun ine PropertyDescriptionCollection aus unseren
Properties aufgebaut. Diese Methode ruft das PropertyGrid auf um sich dieProperties
zu besorgen, die es rendern soll. Hier können wir nun also von einer belibigen Datenstruktur
die benötigten
Informationen für das PropertyGrid aufbauen.
-
Dafür brauch wir jetzt noch einen cCustomPropertyDescriptor. Diesen leiten wir von
PropertyDescriptor ab und implementieren es.
-
Nun können wir unsere Properties aufbauen und an das PropertyGrid binden. Ich habe
das CustomPropertyGrid als eigenes Control angelegt. Der Code ist nun sehr simpel:
1: private void Form1_Load(object sender,
EventArgs e)
2: {
3: cPropertyCollection
props = new cPropertyCollection();
4: props.Add(new cPropertyItem("BoolValue", "This
is a boolean value", false, true, "Properties"));
5: props.Add(new cPropertyItem("StringValue", "This
is a string value", false, "Test123", "Properties"));
6: props.Add(new cPropertyItem("Folder", "Path
for folder", false, "", "Path"));
7:
8: this.artisoPropertyGrid1.SelectedObject
= props;
9: }
Damit erhält man folgendes Ergebnis. Man sieht die dynamisch angelegten Properties
mit ihrem Name, in die Kategorien untergliedert und mit der Beschreibung. Das PropertyGrid
wählt automatisch die gewohnten Controls abhängig vom Datentyp aus.
Dis ist schon ganz nett. Ich möchte aber für das Folder-Property einen entsprechenden
Editor angeben können. Bei statischen Klassen vrwendet man einfach Attribute, aber
bei dynamischen? Dazu wird die verfügbare Dokumentation sehr, sehr dünn. Hierzu haben
wir auf der Property-Klasse eine Attribute-Arary. Diese Attribute können wir nun in
der GetProperties-Klasse an den cCostomPropertyDescriptor übergeben. Der Aufbau der
Properties sieht dann so aus:
1: private void Form1_Load(object sender,
EventArgs e)
2: {
3: cPropertyCollection
props = new cPropertyCollection();
4: props.Add(new cPropertyItem("BoolValue", "This
is a boolean value", false, true, "Properties"));
5: props.Add(new cPropertyItem("StringValue", "This
is a string value", false, "Test123", "Properties"));
6: props.Add(new cPropertyItem("Folder", "Path
for folder", false, "", "Path",
7: new TypeConverterAttribute(),
8: new EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))));
9:
10: this.artisoPropertyGrid1.SelectedObject
= props;
11: }
Nun kann man im Feld für den Wert für das Property "Folder" auf einen Button klicken
und erhält einen Dialog zur Auswahl eines Verzeichnisses.
Rechnerkonfiguration
04.04.2008 10:46:04
|
Thomas Schissler
Bei der Neuinstallation eines Entwicklungsrechners dauert es immer ewig, bis man sich
die ganzen nützlichen Helferlein zusammengesucht hat, die man im Laufe der Zeit zu
schätzen gelernt hat. Deshalb habe ich mir gedacht, ich schreibe mir mal eine Liste,
die ich dann immer wieder ergänzen kann. Und vielleicht ist für den einen oder anderen
da auch noch was interessantes dabei. Also so könnte ein Entwicklungsrechner aussehen:
Betriebsystem / Standardanwendungen:
-
Windows Vista Ultimate
-
Office 2007
-
SQL-Server 2005 Express
-
SQL-Server 2005 Management Studio
Entwicklungsumgebung:
Tools
Stand 13.04.2008
To be continued...
String.GetHashCode und IIS7 auf Windows Server 2008 x64
03.04.2008 22:51:30
|
Jürgen Gutsch
Ein interessantes "Feature" habe ich gefunden, als ich nach erfolgreicher Installation des Windows Server 2008 meine alten Webs wieder einrichten wollte. Und zwar konnte ich mich in keines meiner sharpcms.net Webs mehr einloggen, wenn ich diese über den IIS7 aufgerufen habe. Aufrufe der Webs über den in im VS2008 integrierten Webservers liefen problemlos.
Nach längerem debuggen und suchen im IS7, fand ich dann die Lösung:
Der Grund hierfür ist, das die Methode String.GetHashCode die Strings anders Kodiert wenn die Anwendung im IIS7 läuft, als wenn die Anwendung im IIS6.1, oder im integrierten Webservers des VS2008 läuft.
Wieso im IIS7 diese Stolperfalle eingebaut ist weis ich nicht. Die Lösung ist auf jeden Fall die, dass ich in den Erweiterten Einstellungen des aktuellen ApplicationPools das Feld "Enable 32-Bit Applications" auf "true" stellen muss und schon werden meine Passwörter wieder wie vorher kodiert.
Man könnte fast annehmen, dass es was mit der 64-Bit Version des Server zu tun hat, allerdings hatte ich das Problem nicht mit der 64-Bit Version von Windows XP. Möglicherweise hat der IIS unter XP, sowie der der integrierten Webservers der IDE standardmäßig 32-Bit Applications zugelassen...
Sie haben Post...
02.04.2008 23:08:10
|
Thomas Schissler
Doch einigermaßen überraschend fand ich gestern eine Mail in meinem Postfach:
Sehr geehrte(r) Thomas Schissler,
Herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft®
MVP Award 2008 verleihen zu können. Mit dem MVP Award danken wir Ihnen für Ihren Einsatz
für die Community, mit dem Sie Tag für Tag dazu beitragen, das Leben der Menschen
zu bereichern und die Branche erfolgreicher zu machen. Wir schätzen Ihren außerordentlich
bedeutenden Beitrag in den technischen Communities zum Thema Microsoft Team System
im vergangenen Jahr hoch ein.
Als
Ausdruck unseres Dankes schickt Microsoft Ihnen bald ein MVP Award Paket zu. Damit
möchten wir nochmals sagen „Danke für Ihren Einsatz“. ..
Das freut mich ganz besonders. Schön dass mein Engagement hier honoriert wird. Für
mich bedeutet das Ansporn und Verpflichtung, meine Community-Aktivitäten mit unvermindertem
Einsatz fortzuführen.
Rest-Laufzeit der TFS Trail Version ermitteln
02.04.2008 22:05:53
|
Thomas Schissler
Wer sich nicht vom Ende der Trail-Laufzeit seines TFS überraschen lassen möchte, kann
ein kleines Tool verwenden. Damit kann man sich anzeigen lassen, wie lange der TFS
noch laufen wird. Außerdem kann man wenn die Laufzeit nicht mehr als 10 Tage beträgt,
diese auch noch einmalig um 30 Tage verlängern kann. Für eine zweiter Verlängerung
braucht man eine neue Trail ID, die man bei Microsoft anfordern muss. Das Tool gibt
es auch für TFS 2005 wobei ich mir kaum vorstellen kann, das heute noch jemand den
TFS 2005 evaluiert.
TFSVersionDetection.zip
Weitere Informationen bei Brian
Harry
Ein hexadezimaler Farbcode als String in Color konvertieren
02.04.2008 19:21:00
|
Peter Bucher
Das ist zwar etwas, das eher selten gebraucht wird, trotzdem nett wenns im Accessoire ist :-)
System.Web.UI.WebControls.WebColorConverter
Eine Hilfsfunktion dazu (Wäre auch nett als Extension Method [Natürlich mit entsprechender Namenskonvention]):
/// <summary>
/// Konvertiert einen Farbwert der als String im Hex-Format
/// vorliegt, in ein System.Drawing.Color Wert.
/// </summary>
/// <param name="hex">Farbcode als Hex String</param>
/// <returns>Farbe vom Typ System.Drawing.Color</returns>
public static Color GetColorFromHexString(string hex) {
if(!hex.StartsWith("#"))
hex = "#" + hex;
WebColorConverter c = new WebColorConverter();
return (Color)c.ConvertFrom(hex);
}
Beispielanwendung:
Color c = Tools.GetColorFromHexString("#ffffff"); bool b = c.Equals(Color.White); // <- true
TFS API mit x64
02.04.2008 09:39:04
|
Thomas Schissler
Nachdem wir immer mehr Anfragen bezgl. unseres artsio
WorkitemManager und x64 Systemen erhalten haben, haben wir hier in den letzten
Tagen mal versucht, die TFS API unter Vista x64 zum Laufen zu bekommen und ich möchte
das hier auch mal posten. Das Problem stellt sich in der Entwicklungsumgebung folgendermaßen
dar. Direkt nach dem Start der Anwendung bekommt man folgenden Fehler:
Die Assembly ist natürlich da. Die Lösung dafür ist sehr einfach. Man muss dem Projekt
lediglich sagen, dass es eine x86 Anwendung ist. Dann wird es unter x64 als x86 Anwendung
ausgeführt und kann damit auch die TFS API verwenden. Dazu muss man lediglich in den
Eigenschaften des Projektes als Plattform explizit x86 auswählen.
Nach unseren bisherigen Tests scheint damit die API auch auf x64 Systemen problemlos
zu funktionieren.
TechDays'08 ein Rückblick
02.04.2008 06:55:00
|
Jürgen Gutsch
Am 19. und 20. Februar fanden in Basel die TechDays'08 statt auf denen das Neueste aus den Bereichen .NET, Silverlight, SQL Server, Live und vielen anderen vorgestellt wurden. Highlight sollte die am Mittwochabend stattfindende Launch Party sein. Da ich den Fehler machte und auf der deutschen Seite des Rheins nach Basel gefahren bin kam ich 20 Minuten zu spät an und musste die Keynote auf einer Leinwand in einem anderen Saal mit verfolgen.
Der verpasste Start wurde gleich durch die erste Session von Ronnie Sauermann, zum Thema Silverlight 2.0, wieder wett gemacht. Nach dieser Session traf ich dann auch endlich Thomas Huber und Peter Bucher von ASP.NET Zone. (Leider gibt es noch keine ASP.NET Zone T-Shirts... wär ganz lustig gewesen...)
Die zweite Session zum Thema VS2008 & .NET 3.5 konnten wir leider nicht sehen, da der Saal bereits voll war. Ebenfalls interessant war die Session von Sascha Corti zum Thema VS2008 für Webanwendungen. An diesem Abend besuchte ich außerdem noch die Sessions "Windows Server 2008 und IIS 7 for Devlopers" (von Alain Schneble) und VSTS 2008 & Rosario (von Roger Bösch)
Und die Launch Party? Ja, die Launch Party die war interessant... :-) Im angekündigten Weltrekordversuch ging es darum das ein Jonglierlehrer es schaffen sollte innerhalb von 33 Minuten so vielen Laien wie möglich das Jonglieren mit 3 Bällen bei zu bringen. Das von Microsoft angestrebte Ziel von 111 Jongleuren wurde weit übertroffen. Am Ende waren es dann 240 jonglierende IT Professionals (mehr dazu). Leider war das alles was es so an Party gab und wir (Thomas, Peter und ich) flüchteten uns in die Stadt, auf die Suche nach einem gemütlichen Bier.
Am folgenden Tag hab ich noch folgende Sessions besucht:
Windows Live Services (Part 1 und 2) - Stefano Mallè
WPF: Expression Blend for Developers - Christian Moser
Spricht Ihre Anwendung Open XML - Jens Häupel
Become a Build Master (Build Automation mit TFS) - Roger Bösch
Ein überraschend interessantes Thema war Open XML, vor allem wenn man bereits unter Office 2003 mit den verschiedenen Office Markup Languages gearbeitet hat (Office XML, bzw. WordML und ExcelML). Gerade im Web Bereich, wo ein Office nichts auf einem Webserver zu suchen hat, kann jetzt ein MS Office Dokument erstellt werden.
Fazit:
Die Sessions waren alle zusammen hervorragend, leider aber nicht die Location. So waren die einzelnen Sessions teilweise zu weit auseinander, so das 20 bis 30 Minuten Pause kaum bis garnicht ausreichten um zwischendurch etwas zu Trinken, oder zu Essen zu holen, oder mit Anderen über die letzte Session zu Diskutieren. Teilweise waren auch einfach die Schlangen vor den Essensausgaben zu lang. Ebenso beim Mittagessen: Als wir am ersten Tag mehr als eine halbe Stunde angestanden sind, hatten wir am zweiten Tag - nachdem wir die Schlange gesehen hatten - beschlossen außerhalb essen zu gehen.
Übrigens sind seit Montag Bilder von der Veranstaltung und Präsentationen, sowie Demos zu den einzelnen Sessions online.
Vortrag zum Thema VSTO bei der .net Developer Group Ulm
02.04.2008 00:32:47
|
Thomas Schissler
Am 28.04 kommt Lars Keller, Group-Lead
der .net Usergroup Braunschweig zu uns nach Ulm und wird hier einen Vortrag zu VSTO
halten.
Die mit Visual
Studio 2008 ausgelieferte VSTO 3.0 Komponente und die frisch erschienenen VSTO
Power Tools bringen zahlreiche Neuerungen für die Office Entwicklung mit sich.
Ein wichtiges neues Feature in Office 2007 ist die Ribbon UI. Aber wie kann
man diese anpassen? Was kann der neue Ribbon-Designer in VS 2008? Kann WPF in
Office angewendet werden und wie passt LINQ dazu? Diese und weitere Fragen
werden in dem Vortrag von Lars Keller behandelt. Die Theorie wird dabei durch viele
kleine Live-Coding Beispiele abgerundet.
Weitere Infos unter www.dotnet-ulm.de
Diese Veranstaltung wird unterstützt von
Ein simples Listen Menü mit ASP.NET
01.04.2008 19:18:00
|
Peter Bucher
Das mitgelieferte Menü Control von ASP.NET rendert Tabellen und vieles unnötiges Markup.
Mit den CSS Adapters wird das ganze zwar ausgebogen, erfordert aber eine Installation bzw. Einrichtung im Projekt und ist vielen (auch mir) nicht so symphatisch.
Nicht nur aus oben genanntem Grund, sondern auch weil es eine suboptimale Lösung darstellt, der generierte Markup der Adapters ist m.E. auch noch nicht optimal.
Ein Menü braucht ja jeder, und korrektes und einfaches Markup ist beim Menü noch viel wichtiger, als dies bei anderen Seitenteilen der Fall ist.
Im Prinzip liefert ASP.NET schon ein komplettes fast komplettes Menü mit, ohne es danach zu Benennen ;-)
Ich meine damit das "BulletedList" Control. Wenn dieses leicht abgeändert wird, wird daraus ein super funktionales Menü, das deklerativ, per Code oder sogar per DataBinding mit Daten gefüllt werden kann.
Natürlich hat dieses Control dann die Beschränkung auf eine Dimension, doch vielfach reicht dies aus.
Ansonsten muss die ganze Gschicht dann auf einer anderen Basis aufgebaut werden.
Genug der Worte, sehen wir uns den Code an...
web.config (Beispiel siehe hier, geht aber auch in der Seite selber, für eine Seite):
<add tagPrefix="pb" namespace="pb.Web.UI.WebControls" assembly="ListMenuTest"/>
ASPX:
<pb:ListMenu ID="testMenu" runat="server">
<asp:ListItem Text="Home" Value="?url=1" />
<asp:ListItem Text="Produkte" Value="?url=2" />
<asp:ListItem Text="Kontakt" Value="?url=3" />
<asp:ListItem Text="FAQ" Value="?url=4" />
</pb:ListMenu>
Ein bisschen CSS:
#testMenu {
list-style-type: none;
border: 1px dotted gray;
padding: 15px;
width: 200px;
}
#testMenu a {
font-family: Tahoma;
font-size: 1.5em;
font-style: oblique;
color: Black;
border-left: solid 20px #878787;
padding-left: 4px;
text-decoration: none;
}
#testMenu a.active,
#testMenu a:hover {
border-left: solid 20px #000446;
padding-left: 4px;
color: #878787;
}
Test Code für das Beispiel im Codebehind der Testseite:
protected void Page_Load(object sender, EventArgs e) {
string activeValue = this.Request.QueryString["url"] as string;
if (activeValue != null)
this.testMenu.ActiveValue = "?url=" + activeValue;
}
Das Control selber:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace pb.Web.UI.WebControls
{
public class ListMenu : BulletedList
{
private string _activeValue;
public string ActiveValue {
get { return this._activeValue; }
set { this._activeValue = value; }
}
protected override void RenderContents(HtmlTextWriter writer) {
foreach (ListItem item in this.Items) {
writer.WriteFullBeginTag("li");
writer.AddAttribute("href", item.Value);
if (item.Value == this._activeValue) {
writer.AddAttribute("class", "active");
}
writer.RenderBeginTag("a");
writer.Write(item.Text);
writer.RenderEndTag();
writer.WriteEndTag("li");
writer.Write(Environment.NewLine);
}
}
}
}
Wie man sehen kann, nehme ich das BulletedList Control, füge eine neue Eigenschaft "ActiveValue" hinzu und nehme das Rendering des Contents (Alle innenliegenden <li>-Tags) selber in die Hand.
Hierbei wird dem aktiven Item jeweils die CSS Klasse "active" zugewiesen.
Zuweisung der Styles erfolgt hier jetzt über die ID, die ID kann sich - je nach Gegebenheit - aber ändern, das heisst am besten eine Klasse dafür nehmen, oder über das umschliessende Div ansprechen.
Thats it, viel Spass damit!
Beispielanwendung gibts hier zum Download
ImgBurn - Schnell ein Image Brennen
01.04.2008 19:03:00
|
Peter Bucher
Wenn keine Brennsoftware zur Verfügung steht, oder keine erwünscht ist, wäre es doch schön, eine kleine feine Lösung zu haben.
Ich habe meine Lösung mit ImgBurn gefunden und möchte sie hier weiterempfehlen.
Das Ding läuft auch auf Vista und Server-Betriebssystemen.
Zitat:
ImgBurn is a lightweight CD / DVD / HD DVD / Blu-ray burning application that everyone should have in their toolkit!
Ganze 1.8 Megabyte bringt das Programm auf die Waage, genau nach meinem Geschmack :-)
Zum zweiten mal mit dem Microsoft MVP Award ausgezeichnet
01.04.2008 17:29:43
|
Albert Weinert
Vor ein paar Minuten in meinem Postfach.
Sehr geehrte(r) Albert Weinert,
Herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2008 verleihen zu können. Mit dem MVP Award danken wir Ihnen für Ihren Einsatz für die Community, mit dem Sie Tag für Tag dazu beitragen, das Leben der Menschen zu bereichern und die Branche erfolgreicher zu machen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema Microsoft ASP/ASP.NET im vergangenen Jahr hoch ein.
Da sage ich danke!
