Neues rund um's Thema .Net, Team Foundation Server und SCRUM RSS 2.0
# Thursday, April 17, 2008

Möchte man aus Anwendungen wie z.B. Word auf Dokumente auf einem SharePoint Portal zugreifen. kann man dies sowohl über einen UNC-Pfad (\\ServerName\sites\SiteName) oder über eine URL (http://ServerName/sites/SiteName) zugrifen. Nöch schöner wäre allerdings, wenn man eine direkte Verknüpfung hätte, die auch im Browse-Fenster der Anwendungen genutzt werden kann. Wie man eine solche Verknüpfung einrichtet, zeige ich im folgenden Video:

Thursday, April 17, 2008 10:48:02 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Monday, April 14, 2008

Jens Häupel beschreibt in einem Blog-Eintrag, wie man per ClickOnce Setup DateiTypen mit seiner Anwendung verknüpfen kann. Klasse, dass das nun endlich funktioniert. Danke für den Artikel Jens.

File Extension per ClickOnce mit Anwendung assoziieren

Monday, April 14, 2008 12:16:09 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Sunday, April 13, 2008

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

Sunday, April 13, 2008 2:48:05 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tools | VS 2008

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.

P1010005 P1010011

Sunday, April 13, 2008 1:22:50 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
Vorträge
# Saturday, April 12, 2008

.NET Developer Group Braunschweig Logo

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

Saturday, April 12, 2008 12:10:04 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Vorträge
# Wednesday, April 09, 2008

Wenn man aus Visual Studio einen Web-Test startet und diese Meldung bekommt, muss man die Bowser-Extensions im IE enablen.

 image

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.

image

Wednesday, April 09, 2008 10:41:35 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
VS 2008

image

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

Wednesday, April 09, 2008 2:29:33 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Eigene Tutorials
# Tuesday, April 08, 2008

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

image

Tuesday, April 08, 2008 11:30:23 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Komponenten und Bibliotheken

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

Tuesday, April 08, 2008 6:00:21 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News | Team System Server | VS 2008

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.

image

Der Grund dafür ist einfach (wenn man's weiß). Ein Blick in den Workspace verdeutlicht das Problem.

image

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:

image

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.

Tuesday, April 08, 2008 3:40:22 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server
# Monday, April 07, 2008

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

Monday, April 07, 2008 8:26:37 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Buchbeschreibung
# Sunday, April 06, 2008

Es gibt eine aktualisierte Dokumentation für die API zum Team Build hier zum Download:

http://download.microsoft.com/download/5/f/8/5f872c2e-4221-410b-b86e-4c3cd831b0c4/Team Foundation Build Managed Reference.chm

Achtung die Datei muss auf der lokalen Platte gespeichert und dann über rechte Maustaste / Properties mit Hilfe des Unblock-Buttons entsperrt werden bevor sie korrekt angezeigt wird.

Sunday, April 06, 2008 1:38:11 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server
# Saturday, April 05, 2008

Ü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:

  1. Man brauch eine Klasse für ein einzelnes Property
  2. 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.
  3. Dafür brauch wir jetzt noch einen cCustomPropertyDescriptor. Diesen leiten wir von PropertyDescriptor ab und implementieren es.
  4. 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.

image

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.

image

Saturday, April 05, 2008 12:17:09 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Know-How | Tipps und Tricks
# Friday, April 04, 2008

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...

Friday, April 04, 2008 10:46:04 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -

# Wednesday, April 02, 2008

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“. ..

image

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.

Wednesday, April 02, 2008 11:08:10 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [5] -
News

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.

image

TFSVersionDetection.zip

Weitere Informationen bei Brian Harry

Wednesday, April 02, 2008 10:05:53 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server

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:

image

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.

image

Nach unseren bisherigen Tests scheint damit die API auch auf x64 Systemen problemlos zu funktionieren.

Wednesday, April 02, 2008 9:39:04 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server

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

Wednesday, April 02, 2008 12:32:47 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News
# Monday, March 31, 2008

Die Tatasache, dass sich Visual Studio Team System inzwischen zu einem Produkt mit einer enormen Funktionsvielfalt entwickelt hat, wird schon alleine dadurch dokumentiert, dass es vom 22.04 bis 24.04 eine Konferenz gibt, die sich nur mit diesem Produkt beschäftigt. Die Vorträge decken dabei einen großen Bereich von Projektmanagement über Qualitätsmanagement bis hin zu Best Practices und Erfahrungsberichte ab. Ich selbst werde auch mit einem Vortrag zum Thema hierarchische Workitems vertreten sein.

Wer schon mal einen Blick in die Zukunft werfen möchte, dem sei der Vortrag von Christian Binder zum Thema Rosario ans Herz gelegt.

Würde mich freuen, den einen oder anderen Leser meines Blogs auf der TeamConf persönlich kennen zu lernen. Wer auch dort ist, kann mir einfach einen Kommentar hinterlassen.

clip_image002

Monday, March 31, 2008 8:33:04 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News | Team System Server
# Thursday, March 20, 2008

Bin gerade auf das Jing-Projekt gestoßen. Damit lassen sich ganz einfach Screenshoots und Screencasts erstellen. Auf Wunsch kann man die Ergebnisse bei Screencast.com hochladen (ein kostenloser Account wird bei der Installation mit eingerichtet) oder in Flickr bzw. auf einem eigenen FTP-Server oder einem Fileshre ablegen.

Werde das mal testen, ob sich damit meine Blog-Beiträge etwas aufwerten lassen.

Download Jing-Projet

Thursday, March 20, 2008 8:51:57 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools

Weitgehend unbemerkt von der breiten Masse der Entwickler bringt das .net Framework 3.0 auch eine Bibliothek zum Erstellen von automatisierten UI-Tests mit. Unter %PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\v3.0 finden sich folgen sich die benötigten DLLs. Damit kann man UI-Tests selbst programmieren und auch in Unit-Tests integrieren. Das entspricht zwar nicht der weit verbreiteten Erwartungshaltung, die eher von einer "Record & Play" Methode ausgehen, bietet aber verschiedene Vorteile in Bezug auf Wartbarkeit und Stabilität.

Ich habe hier mal ein kleines Beispiel gebaut, das den Einsatz demonstriert:

Ich werde in Kürze weitere Details bloggen und verschiedene Einsatzgebiete, Erweiterungen und auch Grenzen aufzeigen. Auch ein Webcast ist zu dem Thema geplant. Bis dahin erst mal ein paar weiterführende Dokumente. Leider ist da im Moment noch nicht sehr viel publiziert worden.

http://msdn2.microsoft.com/en-us/magazine/cc163288.aspx
http://msdn2.microsoft.com/en-us/accessibility/bb892133.aspx

Das Tool ist auf jeden Fall interessant und da es kostenlos mit dem .net Framework mitkommt, sollte jeder der sich mit Software-Tests beschäftigt mal einen Blick drauf werfen.

Thursday, March 20, 2008 12:45:12 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
.Net 3.0 | Qualitätsmanagement | Tipps und Tricks
# Wednesday, March 19, 2008

Leider ist die TFS SDK Dokumentation im VS2008 SDK "verschwunden". Diese kann nun endlich wieder heruntergeladen werden.

http://msdn2.microsoft.com/en-us/library/bb130146.aspx

Wednesday, March 19, 2008 9:24:12 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Tuesday, March 18, 2008

In diesem White Paper werden verschiedene Konzepte für das Requirement Management mit Visual Studio und einigen 3rd Party Tools beschrieben. Leider fehlt bei den 3rd Party Tools unser artiso WorkitemManager ;-)

http://www.microsoft.com/downloads/details.aspx?FamilyId=EEF7BB41-C686-4C9F-990B-F78ACE01C191&displaylang=en#filelist

Tuesday, March 18, 2008 12:27:12 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Know-How | Team System Server
# Monday, March 17, 2008

Mit diesem DSL Tool kann man WCF-Services einfach un komfortabel mit Hilfe eines Designers im Visual Studio bauen. Echt schick!

Wie der Class-Designer hat man Two-Way-Synchronisation zwischen Code und Designer. Alle wichtigen Code-Elemente können durch den Designer erstellt werden.

Schade nur, daß das Tool unter VS2008 momentan noch nicht verfügbar ist.

The WCF Designer

Ein Video in dem man das Tool in Aktion sehen kann gibt es hier.

Weitere Infos und Downloads gibt es hier.

Monday, March 17, 2008 11:54:52 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2] -

# Wednesday, March 12, 2008

Ich bin in den nächsten Wochen wieder unterwegs Wer mich mal gerne persönlich kennenlernen möchte, gerne bei einem der folgenden Termine:

13.03.2008  

UG Karlsruhe Vortrag zum Thema "Qualitätsmanagement mit VSTS und TFS - für Entwickler!"
18.03.2008 UG München Vortrag zum Thema "Qualitätsmanagement mit VSTS und TFS - für Entwickler!"
    Dieser Vortrag ist auf einen späteren Termin verschoben. Neuer Termin wird noch bekanntgegeben
10.04.2008 UG Braunschweig Vortrag zum Thema "Qualitätsmanagement mit VSTS und TFS - für Entwickler!"
11.04.2008 AfterLaunch Köln Doppelsession zum Thema "Team Foundation Server in der Praxis"
24.04.2008 TeamConf München Vortrag zum Thema "Programmierung mit dem TFS SDK - Hierarchische Workitems im TFS 2008"
29.04.2008 artiso Innovationsdialog Innovationsdialog zum Thema "SOA in der Praxis"
30.04.2008 UG Stuttgart Vortrag zum Thema "Qualitätsmanagement mit VSTS und TFS - für Entwickler!"
27.05.2008 artiso Innovationsdialog Innovationsdialog zum Thema "Windows, Web, WCF - Oberflächentechnologien heute und in Zukunft"
26.06.2008 artiso Innovationsdialog Innovationsdialog zum Thema "Software-Architektur - das Fundament jeder Anwendung"
Wednesday, March 12, 2008 8:51:13 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
News

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 12.03.2008
To be continued...

Wednesday, March 12, 2008 8:06:17 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Jeder vermisst so die eine oder andere Funktion im Visual Studio. Ein paar kleine nützlichen Erweiterung kann man sich kostenlos mit den Power Commands für Visual Studio 2008 herunterladen. Wer wollte nicht schon immer solche netten Sachen machen wie...

.. alle Projekte in einer Solution einklappen

image

... Referenzen in ein anderes Projekt zu kopieren

image

.. und vieles mehr.

Download und Source Code gibt es hier

Wer zuerst mal lesen will, welche Funktionen es gibt, hier klicken

Wednesday, March 12, 2008 8:01:56 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools | VS 2008
# Monday, March 10, 2008

Die Frage "Wie lösche ich ein Team Projekt von meinem Team Foundation Server?" taucht immer wieder auf. Deshalb hier ein paar Infos dazu:

1.) Im Sourcecontrolexplorer kann man nur Dateien aus der Quellcodeverwaltung löschen
2.) Auch mit dem Commandozeilentool tf delete werden nur Quellcode-Dateien gelöscht.
3.) Zum Löschen eines kompletten Team-Projekts verwendet man das Commandozeilentool
       TfsDeleteProject /server:myteamserver “My Project“

Monday, March 10, 2008 8:33:00 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Friday, February 29, 2008

Beim Betrieb des TFS gibt es hin und wieder Probleme mit dem lokalen Cahce. Vor allem wenn man mit mehreren Servern arbeitet, kommt es da immer wieder mal zu Problemen. Diese lassen sich durch Löschen des Caches lösen.Für mich selbst zur Erinnerung hier nochmals die Pfade:

Unter XP: C:\Dokumente und Einstellungen\<User>\Lokale Einstellungen\Anwendungsdaten\Microsoft\Team Foundation\2.0\Cache

Unter Vista: C:\Users\<User>\AppData\Local\Microsoft\Team Foundation\2.0\Cache
Friday, February 29, 2008 11:34:29 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Um SQL-Projekte aus dem Management-Studio mit der Versionsverwaltung des Team Foundation Server zu verwalten gibt es einen recht einfachen Weg. Zunächst muss der MSSCCI-Provider installiert werden. Dann geht man im Management-Studio unter Tools / Options auf Source_Control und prüft, ob der richtige Provider eingestellt ist.

image

Dann kann man seine Management-Studio Projekte einfach in die Quellcode-Verwaltung einfügen, wie man das aus Visual Studio gewohnt ist. Also einfach rechte Maustaste auf die Solution und Add Solution to Source Control.

image

Nach der Auswahl des Servers und erfolgter Anmeldung wählt man den Ordner in der Versionsverwaltung aus.

image

Und schon kann man seine SQL-Scripts in der Versionsverwaltung auschecken, einchecken etc.

image

Friday, February 29, 2008 10:17:25 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
SQL | Team System Server
# Thursday, February 28, 2008

Ich bin gerade von der BASTA! Spring zurückgekehrt. Ich hatte dort 2 Vorträge.

Der absolute Oberknüller war mein erster Vortrag:

Beginn: 17:30 Uhr
Thema: Qualitätsmanagement mit VSTS

ich hatte mich eigentlich schon darauf eingestellt, in einer kleinen überschaubaren Runde das Thema mit zwei Leuten zu diskutieren, die sich eigentlich nur verlaufen haben oder in den anderen Sessions keinen Platz mehr bekommen haben. Aber was soll ich sagen. Die Bude war voll! Den Vortrag haben sich ca. 50 Leute angehört und keiner ist vorzeitig gegangen oder eingeschlafen (glaube ich mal). Ich habe dann in dem Vortrag versucht, das Tooling aus dem VSTS, das bereits einige Speaker vor mir vorgestellt haben, in einen Prozess einzubinden, damit am Ende möglichst viel Qualität rauskommen. Danke für das große Interesse.

image

Hier noch meine Folien zu dem Vortrag:

Die zweite Session war zum Thema Programmierung mit dem TFS SDK.

Zu diesem Vortrag gibt es die Folien, das Demo  und auch noch das Video, das ich ganz am Anfang gezeigt habe.

Thursday, February 28, 2008 3:02:02 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Wednesday, February 27, 2008

Das TFS DataWarehouse wird standardmäßig jede Stunde aktualisiert. Das kann oft zu lange sein, gerade wenn man Reports neu anlegt. Will man nicht bis zur nächsten automatischen Aktualisierung warten, kann man das auch manuell anstarten. Hierzu ruft man die folgende URL auf dem TFS Application Tier auf:

http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx?op=Run

Dann einfach auf Invoke klicken uns schon startet der Aktualisierungs-Prozess

Wednesday, February 27, 2008 4:20:24 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Team System Server
# Tuesday, February 26, 2008

Das Veröffentlichen von Test Results auf dem TFS-Server ist eine schöne Sache, die vor allem die Kommunikation zwischen Tester und Entwickler erleichtert Aber damit gibt es immer wieder Probleme. Ich hatte gerade so einen Fall und möchte den hier kurz beschreiben, vielleicht kann jemand anderer sich damit Zeit sparen.

Nach dem Publish erhielt ich immer die Meldung "The test result share \\notebook_thomas\builds\WVBuild_20080226.3\TestResults\41577b87-2935-473c-bf03-423c777cd030 is not accessible. You might not have permission to use this network resource. Contact the administrator of this server to find out if you have access permissions. Failed to upload test run results to the drop location '\\notebook_thomas\builds'. Ask your server administrator to make the drop location available."

Das Problem liegt, wie sich aus der Fehlermeldung vermuten lässt, in den Berechtigungen. Ich hatte als Szenario den Build-Agent auf dem selben Rechner eingerichtet, auf dem ich auch entwickle. Wichtig sind hier zwei Dinge:

  1. Es müssen die Berechtigungen auf dem Verzeichnis und auf dem Build Share eingerichtet sein.
  2. Es müssen Berechtigungen für den lokalen User eingerichtet sein.

Bei mir war Punkt 2 das Problem. Ich hatte für den lokalen Benutzer, mit dem ich im Visual Studio arbeite, keine Berechtigungen auf dem Share, deshalb diese Meldung. Nachdem ich diese Berechtigung eingetragen habe, funktionierte es ohne Probleme.

Tuesday, February 26, 2008 2:22:46 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Monday, February 25, 2008

In den letzten Tagen wurde ich häufiger gefragt, welche Edition von Visual Studio man benötigt, um mit dem Team Foundation Server zu arbeiten. Viele sind irrtümlicherweise der Meinung, dass der TFS nur mit dem VSTS zusammenarbeitet, aber das stimmt glücklicherweise nicht. Bereits ab der Standard-Edition wird der Team-Explorer in Visual Studio integriert und man hat Zugriff auf die Quellcode-Verwaltung und Workitems, wie man das auch aus dem VSTS zusammen mit dem TFS gewohnt ist. Da der Team-Explorer sich ja auch als Standalone installieren lässt, wäre theoretisch auch ein Arbeiten mit der Express-Edition möglich, aber das ist natürlich nicht mehr sehr komfortabel.

Ich würde aber auf jeden Fall dei Professional-Edition von Visual Studio 2008 empfehlen, da diese nun auch Unit-Tests unterstützt und für einen normalen Entwickler damit eigentlich ausreichend sein sollte.

Monday, February 25, 2008 11:28:48 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Friday, February 22, 2008

Brian Harry beschreibt in diesem Beitrag verschiedene Upgrade-Szenarien, so z.B. auch wie eine Workgroup-Edition auf eine Full Version upgegraded (furchtbar diese Entwickler, können einfach kein Deutsch, hat jemand dafür eine Übersetzung?) werden kann.

Danke an Lars für den Link

bharry's WebLog : How do I upgrade to TFS 2008?

Friday, February 22, 2008 3:29:21 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Team System Server
# Thursday, February 21, 2008

In Köln wird von den regionalen Communities ein Event organisiert. Für alle, die den Launch-Event von Microsoft in Frankfurt verpasst haben oder denen dabei die Praxis etwas zu kurz kam, sollten sich diesen Event vormerken.

Ich selbst werde dort in 2 Tracks einen Überblick über den Team Foundation Server geben.

Hier noch ein paar Infos zum Event:

Es braut sich etwas zusammen in Nordrhein-Westfalen! Anlässlich der Vorstellung von Windows Server 2008, SQL Server 2008 und Visual Studio 2008 haben sich die User Groups aus Bonn (Bonn-to-Code.Net), Köln (.net User Group Köln) und vom Niederrhein (VfL Niederrhein) zusammengetan, um unter der Schirmherrschaft des JustCommunity e.V. ergänzend zum offiziellen Launch ein Community-Event der besonderen Art auf die Beine zu stellen:

  • Ein ganzer Tag voller Vorträge, verteilt auf drei parallele Tracks
  • Sprecher, die als Entwickler und IT-Professionals aus ihrer täglichen Arbeit heraus Praxiswissen vermitteln
  • Große Verlosung u.a. von Windows Server 2008, SQL Server 2008 und Visual Studio 2008 (not-for-resale-Versionen)
  • Vielfältige Möglichkeiten zum Networking mit anderen Teilnehmern und Firmen aus der Region

Und das zu einem Preis von 8,- Euro, in dem auch noch Verpflegung und Parkausweis enthalten sind.

AFTERLAUNCH
Launch war gestern - heute ist Praxis
Freitag 11. April 2008, KonferenzZentrum im Technologiepark Köln

Anmeldung und weitere Infos auf
www.afterlaunch.de

Thursday, February 21, 2008 9:47:41 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Ich war die vergangenen 3 Tage auf dem Launch-Event von Microsoft in Frankfurt als ATE. Das war wirklich mal eine Konferenz wie ich Sie bisher im .Net Umfeld noch nicht kannte. 7.500 Teilnehmer! Als Veranstaltungort hatte Microsoft die Messe Frankfurt ausgewählt und durch die langläufigen Gebäude waren leider die Wege recht weit.

P1000745 Das war nur die AUssteller-Halle. Hier bekommt man eine Ahnung wie groß die Veranstaltung war.


Ich war als ATE (Ask the Expert) mit dem Schwerpunkt Team Foundation Server aktiv und habe in den 3 Tagen viele Fragen zu dem Thema beantworten können und auch viele interessante Diskussionen geführt. Schön für mich war, dass man merkte, dass der Team Foundation Server nun langsam an Fahrt aufnimmt und immer mehr Verbreitung findet. Das konnte man sicher an der Zahl der Fragen zu dem Thema ablesen und sicher hat auch die Tatsache, dass sich eine Vollversion im Give-Away-Paket der Teilnehmer befand, dazu beigetragen, das der eine oder andere sich mit dem Thema nun doch auseinandersetzt.

P1000750 Der ATE-STand

Christian Binder hatte eine ganze Reihe von Vorträgen zum Thema VSTS und hatte mich im Vorfeld gebeten, einen kleinen Praxisbericht einzubauen. Ich konnte dann in einer seiner Sessions vor rund 600 Zuschauern in 10 Min. demonstrieren, wie wir den TFS im Rahmen unseres Entwicklungsprozesses nutzen. Da eine Live-Demo in dieser Zeit unmöglich ist, habe ich eine für mich neue Präsentationsform gewählt. Ich habe die Aktionen in einem Video aufgezeichnet und das Video dann live kommentiert. Damit konnte ich dann Sequenzen in denen beispielsweise Daten erfasst werden beschleunigt ablaufen lassen und so viel Zeit sparen. Ich schätze mal Live hätte das Ganze sicher 45 Minuten gedauert. In 10 Min. einen Entwicklungsprozess vom Kundengespräch bis zur Implementierung zu zeigen, man kann sich das Tempo des Vortrags vorstellen.

P1000737 Zusammen mit Christian Binder auf der Bühne

Für alle, denen das zu schnell ging oder wer nicht dabei war, hier ist das Video nochmal zum Download. Danke an Chris. War echt eine geile Show. Das Feedback danach auf dem ATE-Stand war einfach überwältigend.

Für mich war es eine echt coole Veranstaltung und ich habe viele neue Eindrücke und Kontakte mit nach Hause genommen. Bleibt nur zu hoffen, dass das Thema TFS nun endlich die breite Masse der Entwickler erreicht - ein echt cooles Tool, das sich jeder mal anschauen sollte.

Thursday, February 21, 2008 9:46:12 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [3] -

# Thursday, February 14, 2008

Habe gerade einen guten Tipp gefunden. Über eine entsprechende Optionseinstellung kann man im Management-Studio beim Copy & Paste die Spaltenüberschriften der Results mit kopieren.

HP's Blog - Microsoft SQL Server Management Studio - Spaltenüberschriften fehlen beim kopieren der Abfrageergebnisse

Thursday, February 14, 2008 11:17:21 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
SQL | Tipps und Tricks

Ich war am 13.02 und 14.02 auf der VSOne und habe dort insgesamt 4 Sessions gehalten. Für mich war es eine tolle Veranstaltung, die Resonanz auf meine Vorträge war sehr positiv und ich konnte viele interessante Diskussionen mit Teilnehmern und Sprecherkollegen führen.

P1000618

Hier nun meine Slides und den Code zum Download:

Session Requirement Management mit Team Foundation Server
Bei dieser Session habe ich vorgestellt, wie wir bei uns im Hause mit Hilfe des Team Foundation Servers Requirements verwalten. Hierbei kommt auch der artiso Workitem-Manager zum Einsatz um Workitems hierarchisch zu strukturieren.

Spezifikationsdokumente Verwalten
Spezifikationsdokumente werden oft als monolithische Worddokumente verwaltet Daraus ergeben sich eine Reihe von Problemen, die wir mit unserem Ansatz lösen, die Spezifikation in kleine Dokumente aufzuteilen und so jede einzelne Funktion zu Spezifizieren. Hierzu nutzen wir ein Word-AddIn das Bestandteil des artiso Workitem-Managers ist.

Mit 3 Schichten zum Erfolg
Das war der Titel meiner Architektur-Session. Hier habe ich zunächst den Aufbau und die Vorteile einer 3-Schicht-Architektur beschrieben. Anschließend erläuterte ich Komponentenorientierung. An einem kleinen Demo-Projekt zeigte ich die Planung und den Aufbau eines Projektes vom Architekturdesign bis zur Implementierung und demonstrierte dabei einige Best Practices aus unseren Projekten. Am Ende beschrieb ich noch die Auswirkungen für verteilte Systeme. Interessant für mich war, dass der Meister der Komponentenorientierung Ralf Westphal der Session beiwohnte uund den Vortrag mit interessanten Fragen bereicherte.

                   

XML-Serialisierung zur Persistierung von Objekten
XML-Serialisierung ist eine Technologie, mit der Objekte schnell und einfach in ein XML-Format überführt und auch wieder zurück konvertiert werden kann. Dies Technik ist nicht neu und viele Entwickler kennen und nutzen sie. Ich habe in der Session verschiedene Möglichkeiten aufgezeigt, wie sich XML-Serialisierung nutzen lässt, von der Persistierung von kompletten Datenobjekten über Konfigurationsdateien bis hin zur Optimierung der Speicherung von Listenobjekten in der Datenbank.

              

Nächste Woche bin ich dann auf dem Launch Event als ATE. Das wird sicher interessant bei diesem Mega-Event (6.500 Teilnehmer!).

Thursday, February 14, 2008 9:46:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Eigene Tutorials | Tipps und Tricks

Wir nutzen in unserem Entwicklungsprozess seit einiger Zeit den Team Foundation Server. Für das Requirement Management setzen wir Workitems ein. In der aktuellen Version des Team Foundation Servers fehlte uns dabei bisher allerdings die Möglichkeit, Workitems hierarchisch zu organisieren. Glücklicherweise verfügt der Team Foundation Server über ein leistungsfähiges API (siehe auch meinen MSDN-Webcast zu diesem Thema). Auf Basis dieser API haben wir ein Tool, den artiso Workitem Manager, entwickelt, mit dem wir nun Workitems so strukturieren können, wie wir das in unseren Projekten brauchen. Neben der hierarchischen Struktur können auch Iterationen in Baumstrukturen abgebildet werden.

Ebenfalls Bestandteil des artiso Workitem Manger ist ein Word-AddIn mit der Spezifikationsdokumente auf Funktionsebene verwaltet werden können. Damit lassen sich verschiedene Probleme mit Spezifikationsdokumente als monolithische Worddokumente lösen.

Den artiso Workitem Manager kann als Beta-Version kostenlos heruntergeladen werden. Die frei verfügbare Version ist auf 50 Workitems begrenzt.

Weitere Informationen finden sich hier.

Thursday, February 14, 2008 9:15:30 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [3] -
Team System Server | Tools
# Monday, February 04, 2008

...sollte man sich mal die AsyncPostbackTriggers anschaen, evtl. liegt das Proble dort begraben. Aber erst mal der Reihe nach.

Ich hatte eine Web-Seite, die sich plötzlich nicht mehr aufrufen lies. Ich habe unterschiedliche Fehler erhalten. Mit dem IIS wurde einfach angezeigt, dass die Seite nicht verfügbar ist, im Debug meldete Visual Studio eine OutOfMemoryException und der Developer Web Server ist gleich mal abgeschmiert. Nach einigem Suchen haben wir dann das Problem entdeckt. Auf der Seite war ein AsyncPostbackTrigger auf eine Textbox eingetragen. Diese Textbox wurde aber irgendwann entfernt. Dies scheint das oben beschriebene Problem ausgelöst zu haben.

Vielleicht hat ja mal jemend einen ähnlichen Fehler und kann ihn mit dieser Info schnell beheben.

Monday, February 04, 2008 12:23:28 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
ASP.Net
# Wednesday, January 30, 2008

Mit Hilfe der neuen Extension Methods in C# 3.0 können einfache Matrizenoperationen ganz einfach als Methoden auf bestehende Objekttypen eingefügt werden. Ich habe hier mal ein Beispiel mit SortedDictionaries. Diese Extension Method erlaubt das addieren zweier Matrizen.

public static void AddDictionary(this SortedDictionary<int, decimal> resultDictionary, SortedDictionary<int, decimal> insertDictionary)
{
    foreach (int key in insertDictionary.Keys)
    {
        if (!resultDictionary.ContainsKey(key))
            resultDictionary.Add(key, insertDictionary[key]);
        else
            resultDictionary[key] += insertDictionary[key];
    }
}

 

Der Aufruf gestaltet sich dann sehr einfach:

SortedDictionary<int, decimal> a = new SortedDictionary();
SortedDictionary<int, decimal> b = new SortedDictionary();

//Werte in Dictionaries einfügen

a.AddDictionary(b);

 

Ich finde die Extension Methods ne feine Sache. Natürlich sind auch beliebige andere Operationen möglich.

Wednesday, January 30, 2008 5:47:30 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2] -
C# 3.0
# Saturday, January 26, 2008

Gemeinsam mit Christian Binder von Microsoft habe ich einen Webcast zum Thema Team Foundation Server SDK aufgenommen.

Thema des Webcasts:

Leider unterstützt der Team Foundation Server 2008 keine hierarchischen Workitems. Dies lässt sich mit Hilfe des TFS SDKs jedoch einfach selbst erweitern. Der Webcast vermittelt zunächst die Grundlagen zur Programmierung mit dem SDK. Im zweiten Teil wird dann gezeigt, wie das SDK genutzt werden kann, um einen hierarchischen Workitem-Manager zu erstellen.

Diese hierarchische Organisation der Workitems bietet bei der kompletten Projektorganisation enorme Vorteile. So lassen sich damit komplette Funktionsbäume aufbauen. Ich werde in Kürze hier noch verschiedene Vorgehensweisen bloggen, die auf hierarchischen Workitems basieren. Vorab hier schon ein paar begleitende Informationen zum Webcast.

Der Webcast kann hier heruntergeladen werden.

Das fertige Projekt aus dem Webcast kann hier als Solution heruntergeladen werden

Und hier habe ich noch ein Dokument, das den Aufbau der Anwendung Schritt für Schritt erläutert.

Danke noch an Chris, hat echt Spass gemacht.

Saturday, January 26, 2008 8:58:18 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2] -
Team System Server

Des TFS SDK enthält ein Control um Workitems in Winforms zu bearbeiten. Dieses Control löst damit das Problem, wie die hochflexible Struktur von Workitems in einer eigenen Anwendung dargestellt und bearbeitet werden kann. Mit dem neuen TFS SDK 2008 gibt es allerdings ein kleines Problem beim Einsatz des Controls. Wird das Control in eine Winform eingebaut, kommt es zu einer NullReferenceException.

Object reference not set to an instance of an object.

Dieses Problem konnte ich bei mir umgehen, indem ich nicht die DLL aus dem SDK sondern aus dem TeamExplorer. Ich habe die beiden DLLS, die ich hier ausgetauscht habe hier zum Download bereitgestellt.

Saturday, January 26, 2008 8:30:05 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Thursday, January 24, 2008

Über die TFS-API kann der Namen eines TFS-Servers einfach abgefragt werden. Dazu kann folgender Code verwendet werden:

private TeamFoundationServer tfs;
NetworkCredential account = new NetworkCredential(user, password);
tfs = new TeamFoundationServer(server, account);
string ServerName = tfs.Name;

Dabei habe ich allerdings folgendes Problem festgestellt: Der Servername ist nicht konsistent. Ist der Server im Team-Explorer noch nicht geristriert, enthält der Servername auch den Port. Nachdem der Server im Team-Explorer dann registriert wurde, wird nur noch der Server-Name zurückgegeben. Das sollte man auf jeden Fall berücksichtigen, wenn man mit dem Name-Property vom tfs arbeitet.

Thursday, January 24, 2008 9:14:11 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Tuesday, January 08, 2008

Mit diesem kostenlosen Add-In lassen sich Feiertage in MS-Project und Outlook im Kalender eintragen und auch wieder entfernen.

SetHolidays - Import von Feiertagen in Outlook und Microsoft Project

Tuesday, January 08, 2008 10:52:54 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools
# Monday, January 07, 2008

Unter Access 2003 gabe es Access-Datenbankprojekte (*.adp) mit denen man wunderbar auf bestehende SQL-Datenbanken zugreifen konnten. Sind diese mit Access 2007 verloren gegangen? Das nicht, aber sie sind jetzt gut versteckt. Um ein Datenbankprojekt mit Access 2007 anzulegen geht man wie folgt vor:

  1. Access ganz normal starten
  2. Access fragt nun nach einer Vorlage für eine neue Datei. Hier das Icon "Blank Database" auswählen.
  3. Im rechten Bereich kann man nun den Dateiname angeben. Hier den File-Dialog öffnen.
  4. In diesem Dialog kann man nun als Dateityp "Microsoft Office Access Projects" auswählen.

     image
  5. Wenn mann dann auf den "Create"-Button klickt kann man noch auswählen, ob man sich zu einer bestehenden Datenbank verbinden möchte oder eine neue anlegen will. Der Rest dürfte dann wieder vertraut erscheinen.
Monday, January 07, 2008 6:16:04 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Wednesday, January 02, 2008

Eine schöne Liste mit Tools und Erweiterungen zum Team Foundation Server und Visual Studio Team System findet sich unter http://widgets.accentient.com/

TFS-Widgets

Wednesday, January 02, 2008 3:42:50 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Aus dem Fenster mit Fehlermeldungen und Wahrnungen im Visual Studio heraus kann man direkt Workitems auf dem Team Foundation Server anlegen. Dazu einfach die entsprechende Zeile mit der rechten Maustaste anklicken und im Kontextmenü "Create Work Item" wählen.

image

Es werden automatisch Informationen in den Titel und den Verlauf übernommen, wobei meiner Meinung nach die Details eher in das Beschreibungs-Feld gehören als in den Verlauf.

image

Wednesday, January 02, 2008 2:45:07 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server | VS 2008
# Sunday, December 30, 2007

Schick ist es, wenn man in der Anwendung demBenutzer die verfügbaren SQL-Server als Auswahl anzeigt. Die kann man mit folgendem Code bewerkstelligen:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SQLInstances
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dataTable = System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources();

            foreach (DataRow datarow in dataTable.Rows)
            {
                string datasource = datarow["ServerName"].ToString();
                if (datarow["InstanceName"] != DBNull.Value)
                {
                    datasource += String.Format("\\{0}", datarow["InstanceName"]);

                    ComboBox1.Items.Add(datasource);
                }

                DataGridView1.DataSource = dataTable;
            }
        }
    }
}

 

Das Beispiel gibt die verfügbaren SQL-Server in einem GridVie aus.

Um auch Zuisatzinformationen wie Version etc. zu erhalten, muss auf dem SQL-Server der SQL-Browser laufen:

clip_image001

Sunday, December 30, 2007 9:20:27 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
SQL | Tipps und Tricks
# Wednesday, December 05, 2007

Der Visual Studio 2008 Team Explorer kann unabhängig vom Team Foundation Server mit folgendem Link heruntergeladen werden.

Download details: Visual Studio Team System 2008 Team Explorer

Wednesday, December 05, 2007 8:39:13 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Tuesday, December 04, 2007

Unter http://entwickler-press.de/ kann man einen Adventskalender öffnen. Hinter jedem Türchen steht ein e-Book zum kostenlosen Download. Aber Achtung das Türchen geht immer nur an dem jeweiligen Tag auf.

Tuesday, December 04, 2007 10:36:43 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Durch Zufall habe ich gerade herausgefunden, dass man im IE auch mehrere Startseiten eintragen kann. Einfach in der Liste mehrere zeilen mit den verschiedenen URLs eingeben. Die werden dann beim Start alle geöffnet.

image

image

Tuesday, December 04, 2007 10:35:10 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Thursday, November 29, 2007

Folgende Anforderung: Ich möchte in einer Tabelle, die über die gesamte Bildschirmbreite geht, den Inhalt einer Zelle scrollbar haben.

Mein Ansatz: Ich mache in die Tabellenzelle ein DIV mit Overflow:auto

Problem: Das funktioniert zwar im FireFox, aber nicht im IE. Der IE geht wohl her und schaut sich den Inhalt des DIVs an und macht die Tabelle dann so breit, dass der gesamte Inhalt reinpasst und berücksichtigt dabei nicht, dass das DIV ja auch scrollen könnte. Dieser Effekt tritt auf, wenn das DIV eine prozentuale Breite hat.

Folgender Code verdeutlichd das Problem. Das obere DIV verhällt sich korrekt, da es nicht in eine Tabelle eingebettet ist. Bei den unteren beiden tritt aber das beschriebene Problem auf.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ValuePlanner_2008.Web.ProductArea.WebForm1" %>

<html>
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="width: 100%; overflow: auto">
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br />
        <br />
    </div>

    <script language="javascript" type="text/javascript">
   1:  
   2:    function fnRefreshScrollPosition(source)
   3:         {
   4:             document.getElementById("staticUnits").scrollLeft = source;
   5:         }
   6:     
</script> <div style="width: 100%"> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="staticUnits" style="width: 100%; overflow: auto;"> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br /> <br /> </div> </td> </tr> </table> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="units" style="width: 100%; overflow: auto;" onscroll="fnRefreshScrollPosition(this.scrollLeft);"> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<br /> <br /> </div> </td> </tr> </table> </div> </form> </body> </html>

 

Lösung 1:
Ich kann den DIVs eine feste Breite geben. Aber eigentlich will ich ja, dass der gesamte zur Verfügung stehende Platz genutzt wird und wenn dieser nicht ausreicht gescrollt wird. Um das zu erreichen müsste ich über ein Resitze-Event die Breite der Tabellenzeile ermitteln und diese dann jedesmal auf die DIVs anwenden. Das wird aber schnell sehr hässlich wenn Margins etc. mit berücksichtigt werden müssen.

Lösung 2:
Ich positioniere die DIVs einfach absolut. Dann werden Sie nicht mehr als Inhalt der Tabelle berücksichtigt und die Tabelle erstreckt sich über genau 100% der Breite. Gut nutzen kann man hier den Effekt, dass die Positionsangaben bei absoluter Poistionierung sich immer auf den Container, also in unserem Fall auf die Tabellenzelle beziehen. Ein Stolperstein dabei ist, dass das DIV natürlich auch keinen Einfluss mehr auf die Höhe der Tabellenzelle hat. Diese muss man nun explizit angeben, ich habe da einfach mal 50px vorgegeben. Der Code sieht dann so aus. Hier scrollen nun alle 3 DIVs wie gewünscht.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ValuePlanner_2008.Web.ProductArea.WebForm1" %>

<html>
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="width: 100%; overflow: auto">
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br />
        <br />
    </div>

    <script language="javascript" type="text/javascript">
   1:  
   2:    function fnRefreshScrollPosition(source)
   3:         {
   4:             document.getElementById("staticUnits").scrollLeft = source;
   5:         }
   6:     
</script> <div style="width: 100%"> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="staticUnits" style="width: 100%; overflow: auto; position: absolute"> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br /> <br /> </div> </td> </tr> </table> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="units" style="width: 100%; overflow: auto; position: absolute;" onscroll="fnRefreshScrollPosition(this.scrollLeft);"> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<br /> <br /> </div> </td> </tr> </table> </div> </form> </body> </html>
Thursday, November 29, 2007 2:28:56 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
ASP.Net
# Wednesday, November 28, 2007

Events in eigene WebUserControls (.ascx) einzubauen ist im Prinzip ganz einfach:

   1: public event ClickEventHandler Clicked;
   2: public delegate void ClickEventHandler(object sender, EventArgs e);
   3: protected virtual void OnClicked(EventArgs e)
   4: {
   5:     if (Clicked != null)
   6:         Clicked(this, e);
   7: }


Man deviniert ein Event mit einem Eventhandler-Typ (Zeile1), definiert einen Delegaten für den Eventhandler (Zeile 2) und kann dann eine Methode definieren, die den Event auslöst. Diese Methode ruft man dann auf, wenn das Event ausgelöst werden soll.

Wenn man das UserControl in eine Seite einbaut kann man jetzt im CodeBehind ganz einfach einen Eventhandler auf den Event registrieren und fertig:

this.ucButton.Clicked += new ClickEventHandler(ucButton_Clicked);


Auch im Markup kann man den Event angeben, vorausgesetzt man hat den entsprechenden Eventhandler angelegt.

<uc3:ucButton ID="ucButton" runat="server" Text="Gross" ImageURL="~/Images/Status/GreenBox.png" OnClicked="ucButton_Clicked" />

Was bei mir aber nicht funktioniert, ist der Designtime-Support. Bei anderen Controls kann ich die Events im Property-Grid sehen und ich kann per Doppelclick auch einen Standard-Eventhandler einrichten und registrieren. Das geht bei mir nicht. Hat jemand dafür eine Lösung? Wenn ja, dann bitte her damit.
Wednesday, November 28, 2007 4:04:12 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [5] -
ASP.Net

Sicher ein alter Hut, aber für mich war's gerade neu und ich finde das echt klasse. Mit CSS kann man Elemente auch mit einem Abstand zum rechten Rand positionieren.

<DIV style="position:absolute; right:20px; top:350px; width:300px; height:150px;"></DIV>

erzeugt ein DIV das immer exakt 20px vom Rechten Rand entfernt ist, auch nach einem Resize des Fensters. Genauc das was ich gerade brauche. Man muss dabei nur beschten, dass right offensichtlich die schwächste Einstellung ist, d.h. wenn left und width ebenfalls angegeben sind, wird right ignoriert. Wenn aber nur zwei der Werte angegeben sind, wird der dritte automatisch ermittelt, also z.B. bei left und right wird die Breite automatisch angepasst. Das selbe funktioniert natürlich auch mit top, bottom und height.

Wednesday, November 28, 2007 11:46:03 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
ASP.Net
# Tuesday, November 27, 2007

Im TFS 2008 hat Microsoft endlich die Lizenzbedingungen angepasst. Für folgende Aktionen wird nun keine CAL mehr benötigt:

  • Anlegen eines Workitems
  • Anzeigen der Workitems, die ein Benutzer selbst angelegt hat
  • Bearbeiten der Workitems außer Änderung des Status des Workitems

Damit ist es nun endlich möglich, Kunden etc. in das Projekt besser einzubinden, ohne dafür Unsummen für CALs auszugeben.

adamga's WebLog : TFS for Defect Tracking! Licensing Change!!!

Tuesday, November 27, 2007 10:32:17 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Dieser Artikel beschreibt ein paar Punkte, die bei der Erstellung von ASP.NET Server Controls berücksichtigt werden sollten und gibt verschiedene Tipps.

Writing Good ASP.NET Server Controls « Enter the Tatrix

Tuesday, November 27, 2007 10:21:24 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
ASP.Net
# Friday, November 23, 2007

Noch ein Update zu meinem vorhergehenden Post. Man kann sich den Wizard, den ich dort als Bestandteil von Visual Studio 2008 beschrieben habe, auch separat runterladen und als eigenständiges Tool oder integriert in VS2005 ausführen.

Downloaddetails: SQL Server Database Publishing Wizard 1.1

Friday, November 23, 2007 11:13:25 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
SQL | VS 2005

Bei unserem heutigen Treffen der .Net Developer-Group Ulm hatten wir einen Vortrag zum Thema SQL-Projekte. Dabei kam die Frage auf, ob man Daten einer Datenbank nicht in ein SQL-Skript exportieren kann, das dann alle Daten über Insert-Statements einfügen kann. Ich habe hierzu eine Lösung in Visual Studio 2008 gefunden und das geht so:

1.) Server Explorer öffnen und die entsprechende Verbindung rechts anklicken, dann  "Publish to provider" auswählen.

image

2.) Dann die Datebank auswählen und darunter die Checkbox disablen (außer man will wirklich die Datenbank komplett scripten).

image

3.) Die nächsten Schritte sind dann soweit selbsterklären. In dieser Maske kann man dann auswählen, ob man Daten, Schema oder beides scripten möchte:

image

4. In dem erzeugten Script steht dan z.B. so etwas:

INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], 
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders', N'Sales Representative',
            N'Obere Str. 57', N'Berlin', NULL, N'12209', N'Germany', N'030-0074321', N'030-0076545') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo', N'Owner',
            N'Avda. de la Constitución 2222', N'México D.F.', NULL, N'05021', N'Mexico', N'(5) 555-4729', N'(5) 555-3745') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno', N'Owner',
            N'Mataderos 2312', N'México D.F.', NULL, N'05023', N'Mexico', N'(5) 555-3932', NULL) INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'AROUT', N'Around the Horn', N'Thomas Hardy', N'Sales Representative', N'120 Hanover Sq.',
            N'London', NULL, N'WA1 1DP', N'UK', N'(171) 555-7788', N'(171) 555-6750') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BERGS', N'Berglunds snabbköp', N'Christina Berglund', N'Order Administrator',
            N'Berguvsvägen 8', N'Luleå', NULL, N'S-958 22', N'Sweden', N'0921-12 34 65', N'0921-12 34 67') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BLAUS', N'Blauer See Delikatessen', N'Hanna Moos', N'Sales Representative',
            N'Forsterstr. 57', N'Mannheim', NULL, N'68306', N'Germany', N'0621-08460', N'0621-08924') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BLONP', N'Blondesddsl père et fils', N'Frédérique Citeaux', N'Marketing Manager',
            N'24, place Kléber', N'Strasbourg', NULL, N'67000', N'France', N'88.60.15.31', N'88.60.15.32') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BOLID', N'Bólido Comidas preparadas', N'Martín Sommer', N'Owner', N'C/ Araquil, 67',
            N'Madrid', NULL, N'28023', N'Spain', N'(91) 555 22 82', N'(91) 555 91 99') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BONAP', N'Bon app''', N'Laurence Lebihan', N'Owner', N'12, rue des Bouchers',
            N'Marseille', NULL, N'13008', N'France', N'91.24.45.40', N'91.24.45.41')

Das Script lässt sich dann wunderbar in Datenbankprojekte einbauen und in der Quellcode verwqlten. Dies bietet z.B. eine gute Möglichkeit, um Testdaten für die Durchführung von Tests mit der jeweiligen Anwendungs-Version in der Quellcode-Verwaltung zu verwalten.

In Visual Studio 2005 funktioniert das leider nicht. Dort muss auf entsprechende Tools zurückgegriffen werden, z.B. den kostenlosen Oracle SQL Developer http://www.oracle.com/technology/products/database/sql_developer/index.html der übrigens auch mit SQL-Server funktioniert ;-)

Friday, November 23, 2007 12:11:53 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [3] -
SQL | VS 2008
# Wednesday, November 21, 2007

Das Problem:

Ich habe in C# ein Objekt vom Typ System.Drawing.Color. Dieses möchte ich in einen String-Konvertieren, den ich im HTML verwenden kann. Das funktioniert gut bei benannten Farben wie z.B. "red". Dort kann man Color.Name verwenden. Aber bei nicht benannten Farben liefert dies einen ARGB-Wert mit dem HTML nichts anfangen kann. Dehalb habe ich diese kleine Mthode geschrieben:

private string GetColorString(Color color)
{
    if (color.ToKnownColor() != 0)
        return color.Name;
    else
        return "#" + color.Name.Substring(2);
}

 

Wenn jemand eine einfachere Lösung weiss, einfach her damit!

Update:

Jürgen hat noch eine viel einfacher Lösung (siehe Kommentar) mit
string htmlcolor = ColorTranslator.ToHtml(Color.Bisque)
Kannte ich bisher noch nicht, aber man lernt ja nie aus!

Wednesday, November 21, 2007 12:31:43 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Tipps und Tricks

Ein weniger bekannter Operator in C# ist der Operator ??. Damit kann ein Objekt auf null geprüft werden und wenn dies der Fall ist ein Alternativwert verwendet werden. Ein Beispiel kann das verdeutlichen:

   1: object a = null;
   2: object b = 5;
   3:  
   4: object c = a ?? b;

In dem Beispiel gilt c = b. Würde in der Zeile 3 a noch entsprechend inizialisiert, dass dieses nut mehr null ist, dann würde gelten c = a.

Wednesday, November 21, 2007 9:53:25 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
C# 3.0
# Monday, November 19, 2007

Visual Studio 2008 liegt nun als RTM-Version zum Downloadf bereit. Wer keine MSDN-Subscription hat, kann sich hier die Trail-Versionen herunterladen.

Visual Studio 2008 Trial Downloads

Monday, November 19, 2007 6:57:22 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
VS 2008
# Friday, November 16, 2007

Ich habe bei mir eine Liste die wiederum eine Liste mit Unterobjekten enthält. Ich möchte nun daraus ein Element der Unterliste mit einer bestimmten ID selektieren. Eine klare Sache für LINQ!

Als Leitfaden habe ich auf 101 LINQ Samples mir folgendes Beispiel rausgesucht:

   1: public void Linq15() {
   2:     List customers = GetCustomerList();
   3:  
   4:     var orders =
   5:         from c in customers,
   6:                 o in c.Orders
   7:         where o.Total < 500.00M
   8:         select new {c.CustomerID, o.OrderID, o.Total};
   9:  
  10:     ObjectDumper.Write(orders);
  11: }

 

Das sieht ganz eifach aus, hat bei mir aber absolut nicht funktioniert. Ich konnte das schon nicht sauber eingeben, da er in Zeile 6 für c keine Intellisense-Unterstützung geboten hat. Das Ganze konnte ich dann lösen, indem ich das etwas umgestellt habe, auf das Beispiel oben übertragen sieht meine Lösung so aus:

   1: public void Linq15() {
   2:     List customers = GetCustomerList();
   3:  
   4:     var orders =
   5:         from c in customers
   6:                from o in c.Orders
   7:         where o.Total < 500.00M
   8:         select new {c.CustomerID, o.OrderID, o.Total};
   9:  
  10:     ObjectDumper.Write(orders);
  11: }

 

Ich habe einfach in Zeile 6 statt des Kommas in der vorherigen Zeile nochmals ein from eingebaut. So funktioniert es bei mir nun, wie ich mir das gewünscht habe.

Friday, November 16, 2007 5:57:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
C# 3.0 | LINQ
# Wednesday, November 14, 2007

Na wenigstens nimmt Visual Studio einen Absturz nicht auf die leichte Schulter sondern gibt zu, dass das eine Katastrophe ist.

image

Wednesday, November 14, 2007 4:53:43 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Tuesday, November 13, 2007

Damit Ich habe ein Web User Control bei dem ich eine TextBox als Property nach außen geben möchte, damit man die Eigenschaften der Textbox editieren kann. Das kann man durch ein paar Attribute erreichen.

[Browsable(true),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
RefreshProperties(RefreshProperties.Repaint)]
public TextBox DropDownTextbox
{
    get
    {
        return this.TextBox1;
    }
    set
    {
        this.TextBox1 = value;                
    }
}
 
Damit werden auf dem UserControls zusätzliche Properties angelegt und zwar alle Properties einer Textbox mit dem Prefix "DropDownTexbox" also dem Namen des Properties auf dem Control.
 
image
 
Im Markup werden die Properties ganz normal als Attribute eingefügt. Was mich allerdings etwas gewundert hat war, dass ich im Markup über Intellisense die Textbox allerdings auch als separates Tag angeben kann und darauf meine Attribute definiere. Allerding wird das denn im Designer nicht mehr sauber gerendert.

 

<uc1:WebUserControl1 ID="WebUserControl11" runat="server" DropDownTextBox-BackColor="#FFCC00">
    <DropDownTextbox BackColor="red"></DropDownTextbox>
</uc1:WebUserControl1>

Tuesday, November 13, 2007 5:53:32 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
ASP.Net | Tipps und Tricks
# Monday, November 12, 2007

Der Team Foundation Server ist ein sehr flexibles Werkzeug. Es lässt sich an verschiedene Prozessmodelle anpassen. Die die beiden folgenden Links verweisen zu entsprechenden Kapiteln in der MSDN-Hilfe die beschreiben wie Workitem Typen und Prozessvorlagen angepasst werden können.

Customizing Work Item Types
Customizing Process Templates

Monday, November 12, 2007 9:13:20 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Der Team Foundation Server Guide liegt nun in der finalen Version vor. Dieses Dokument beschreibt viele gängige Szenarien in Zusammenhang mit dem TFS und bietet empfohlene Lösungen an. 

patterns & practices: Team Development with Visual Studio Team Foundation Server - View Release

Monday, November 12, 2007 9:10:04 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

LINQ erweitert ICollections, IEnumerable etc. mit einigen Extension Methods wie z.B. ToList() was sehr hilfreich ist. Ich hatte gerade das Problem, dass diese Extensions nicht im Intellisense angezeigt wurden. Nach einigem Suchen habe ich festgestellt, das lag daren, dass ich kein using System.Linq drin hatte, sondern nur auf System.Data.Linq und System.Data.Linq.Mapping. Nachdem ich das using ergänzt habe, funktionierte das problemlos.

Monday, November 12, 2007 6:31:35 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
C# 3.0 | LINQ

Das alte Jahr ist noch nicht zu Ende undf schon verspricht das neue Jahr ereignisreich zu werden. Im Februar bin ich wieder auf Tour:

13. / 14. Feb. 2008 - VSOne in München
Hier halte ich zwei Vorträge zu XML-Serialisierung und Architektur

19. / 20. Feb. 2008 - Launch Event Microsoft in Frankfurt
Hier bin ich als ATE (Ask the Expert) zum Thema Visual Studio Team System

26. / 27. Feb. 2008 - BASTA! Sprint Edition in Frankfurt
Auf der BASTA! werde ich zwei Vorträge zum Thema TFS halten.

Weitere Details folgen noch. Ich würde mich freuen, den einen oder anderen Leser meines Blogs auf einem dieser Events persönlich kennen zu lernen.

Monday, November 12, 2007 10:04:29 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2] -
News
# Wednesday, November 07, 2007

Ich hatte gerade ein Aha-Erlebnis der etwas anderen Art. Im Infragistics-Chart gibt es eine Zoom-Funktion für die Achsen. Bei einem Composite-Chart scheint das aber nicht zu funktionieren. Ich habe folgendes im Code stehen:

ChartObj.CompositeChart.ChartAreas[0].Axes[0].

Aber mein Intellisense zeigt kein passendes Property an. Im Forum steht auch die Aussage von einem Infragistics-Mitarbeiter, dass das nicht geht. Wenn ich dann "blind" das vervollständige zu

ChartObj.CompositeChart.ChartAreas[0].Axes[0].ScrollScale.Visible = true;


funktioniert der Code wunderbar! Mal abgesehen davon, dass ich gar nicht wüsste, wie man Properties im Intellisense versteckt aber dennoch verfügbar macht, warum um alles in der Welt haben die Jungs dieses Property nicht öffentlich zugänglich gemacht?

Wednesday, November 07, 2007 7:51:22 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Tipps und Tricks
# Monday, November 05, 2007

Das Problem kennt vermutlich fast jeder Notebook-Besitzer der an seinem Arbeitsplatz noch einen zusätzlichen PC hat. Wenn man am Arbeitsplatz sitrzt steht das Notebook entweder nutzlos in der Ecke oder man kommt mit den Mäusen und Tastaturen immer durcheinander. Wäre es nicht schön, das Notebook am Arbeitsplatz zu integrieren. Unter XP hatte ich hier eine geniale Lösung - Maxivista. Damit konnte man sogar eine Zweischirmlösung aufbauen indem das Notebook einfach den Desktop des Arbeitsplatzrechners erweiterte. Absolut klasse, nur funktioniert der Host unter Vista nicht (zumindest nur mit den WDDM-Treibern, was für mich allerdings keine Alternative ist).

Nun habe ich Synergy entdeckt. Dieses Opensource-Tool bitet die Möglichkeit, einen Rechner mit der Maus / Taststur eines zweiten Rechners fernzusteuern. Es unterschiedet sich zu Remote Desktop o. ä., indem es nicht den Bildschirm des PCs auf den Zweit-PC überträgt. Es lässt sich in meinem Szenario damit wunderbar nutzen. Ich habe auf meinem Desktop-PC Visual Studio laufen und kann dann einfach mit der Maus links zum Bildschirmrand rausfahren und schon bin ich auf meinem Notebook und kann damit mit der gleichen Tastatur / Maus z.B. Suchen im Internet, Downloads, E-Mail oder andere Funktionen aufrufen ohne dass mein Desktop-PC damit belastet wird. Das Ganze läuft auch problemlos unter Vista und ist zumindest mal ein brauchbarer Ersatz für MaxiVista.

Monday, November 05, 2007 8:22:54 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools
# Thursday, November 01, 2007

Ich habe mir gerade ein kleines Beispiel für den Zugriff auf einen Webservice per JavaScript per AJAX zusammengebaut. Da ich hier einige Informationen aus verschiedenen Quellen zusammengetragen habe, möchte ich das Beispiel hier kurz posten, vielleicht hilft es dem einen oder anderen, einige Informationen gesammelt zu finden.

Hier zunächst der Code für den Webservice:

   1: namespace ValuePlanner_2008.Services
   2: {
   3:     /// <summary>
   4:     /// Summary description for INNProjectExplorerWebService
   5:     /// </summary>
   6:     [WebService(Namespace = "http://tempuri.org/")]
   7:     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   8:     [GenerateScriptType(typeof(myData))]
   9:     [ToolboxItem(false)]
  10:     [ScriptService]
  11:     public class INNProjectExplorerWebService : System.Web.Services.WebService
  12:     {
  13:         [WebMethod]
  14:         [ScriptMethod]
  15:         public myData HelloWorld(int ID)
  16:         {
  17:             return new myData { ID = ID, Text = "Hello World" + ID.ToString() };
  18:         }
  19:     }
  20:     
  21:     public class myData
  22:     {
  23:         public int ID { get; set; }
  24:         public string Text { get; set; }
  25:     }
  26: }


Kurz zu erwähnen sind hier folgende Details: In Zeile 10 wird über ein entsprechndes Attribut der Webservice für die Zusammenarbeit mit AJAX konfiguriert. Das selbe gilt in Zeile 14 für die Methode, die der Webservicebereitstellt. Da die Methode einen eigenen Datentyp (myData) zurückgibt, wird in Zeile 8 dieser Typ ebenfalls für AJAX veröffentlicht. Man kan so beliebig komplexe Datenstrukturen zwichen JavaScript und dem WebService austauschen, solange diese auf Datentypen basieren, dieJavaScript auch verarbeiten kann (also z.B. keine generischen Listen etc.). Der restliche Code wird automatisch über das Webservice Template erzeugt bzw. sollte keiner weiteren Erklärung bedürfen.

In der ASPX-Seite muss ein Scriptmanager eingebaut werden und der Service darauf registriert werden. Da ich de Scriptmanager in meinem Beispiel in der Master-Page habe, verwende ich einen ScriptmanagerProxy, der es erlaubt, die Registrierungen für einzelne Seiten vorzunehmen und an den Scriptmanager in der Master-Page weiterleitet. Dies ist deshalb notwendig, da auf einer Seite nur ein einziger Scriptmanager vorkommen darf.

   1: <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
   2:     <Services>
   3:         <asp:ServiceReference Path="~/Services/INNProjectExplorerWebService.asmx" />
   4:     </Services>
   5: </asp:ScriptManagerProxy>


Noch ein wichtiger Hinweis: Ich hatte zuerst den ToolScriptManager aus dem AJAX Component Toolkit in meiner Masterpage. Dieser scheint nicht mit dem ScriptManagerProxy zusammenzuarbeiten, jedenfalls wurde bei mir die Proxy-Klasse nicht erstellt. Erst als ich einen "normalen" ScriptManager verwendet habe, funktionierte das problemlos.

Auf dem Client wird nun eine Proxy-Klasse erstellt, die die Datentypen und die Methoden des Webservices in JavaScript nachgebildet werden. Darüber lässt sich der WebService sehr einfach aufrufen.

   1: <script language="javascript" type="text/javascript">
   2:     
   3:    function fnCallWebService()
   4:     {
   5:         ValuePlanner_2008.Services.INNProjectExplorerWebService.HelloWorld(5, fnHelloWorlSuccess, fnHelloWorlFailed);
   6:     }
   7:     
   8:     function fnHelloWorlSuccess(results, context, methodName)
   9:     {
  10:         alert(results.Text);
  11:     }
  12:     
  13:     function fnHelloWorlFailed(results, context, methodName)
  14:     {
  15:         alert ("Error calling webservice");
  16:     }
  17: </script> 


in Zeile 5 wird der WebService mit der dem Namespace und dem Namen der Webservice Klasse aufgerufen. Zunächst wird der Parameter der HelloWorld-Methode übergeben. Da der Aufruf asynchron erfolgt kann wird noch eine Methode angegeben angegeb, die im Erfolgsfall aufgerufen wird, optional noch eine Methode, wenn der Aufruf fehlschlägt. In Zeile 10 sieht man schön, dass man in JavaScript nun auch das Datenobjekt des Rückgabewertes in gewohnter Weise zugreifen kann.

Thursday, November 01, 2007 9:10:45 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Eigene Tutorials
# Monday, October 29, 2007

Eines der neuen coolen Features in VS2008 ist der Intellisense-Support und das einfärben für Javascript-Code. Das hat bei mir aber nicht funktioniert. Das Problem liegt daran, dass bei der Installation zwei Registry-keys nicht korrekt gesetzt werden.

Setzt man folgende Registry-Keys korrekt dann funktioniert das Intellisense einwandfrei:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\CLSID\{014E9A41-54E5-44ED-B15E-EFFA8758BFFC}]

"CodeBase"=file:///C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE\\Microsoft.JScript.AuthoringServices.dll

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\CLSID\{014E9A41-54E5-44ED-B15E-EFFA8758BFFC}\InprocServer32\9.0.0.0]

"CodeBase"=file:///C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE\\Microsoft.JScript.AuthoringServices.dll

 

Nähere Infos findet man hier.

Monday, October 29, 2007 5:17:18 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
VS 2008
# Thursday, October 25, 2007

Auf dieser Seite sind jede Menge Beispiele zum Thema LINQ thematisch geordnet aufgelistet. Hier findet man wirklich für viele Einsatzgebiete entsprechende Beispiele. Wirklich empfehlenswert! 

101 LINQ Samples

Thursday, October 25, 2007 9:30:39 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
.Net 3.5 | LINQ

Wenn man eine Datei löscht, die in der Quellcode-Verwaltung eingecheckt war, kann man diese leicht aus der Quellcode-Verwaltung wiederherstellen. Dazu muss man aber zuerst eine kleine Einstellung vornehmen. Unter Tools / Options / Source Control / Visual Studio Team Foundation Server kann man die Option "Show deleted items in the Source Control Explorer" aktivieren.

image

Dann werden im Source Control Explorer gelöschte Elemente angezeugt, die man einfach "undeleten" kann.

image

Thursday, October 25, 2007 6:09:17 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
Team System Server | Tipps und Tricks
# Wednesday, October 24, 2007

Wer mal etwas mehr mit WCF programmiert hat, wird feststellen, dass es recht müßig ist, für jeden Service einen Host zu implementieren. Deshalb habe ich zusammen mit meinem Kollegen Tobi einen WCF Service-Managerr entwickelt. Dieser Servicemanager wird auf dem Application-Server als Windows-Dienst ausgeführt und ist in der Lage Services die in DLLs bereitgestellt werden dynamisch zu laden und auszuführen. Zur Steuerung dient ein Client der natürlich per WCF mit dem Service-Manager kommuniziert. Damit kann auch eine größere Zahl von Services auf einem Application-Server effizient verwaltet werden.

image

Der Service-Manager kann inkl. einer kleinen Doku kostenlos heruntergeladen und verwendet werden. Über ein Feedback würde ich mich freuen.

artisoServiceManager.zip (5,94 MB) Version 0.9.0
Wednesday, October 24, 2007 11:11:09 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Eigene Tutorials | Tools
# Friday, October 19, 2007

Während einer Präsentation hat man oft das Problem, dass man einen Bereich vergrößern möchte um ihn für das Publikum besser lesbar zu machen. Das kann man mit dem kleinen kostenlosen Tool ZoomIt ganz einfach bewerkstelligen. Zusätzlich bietet das Tool auch die Möglichkeit, dass man direkt auf dem Desktop Striche zeichnet. Dadurch kann man z.B. bestimmte Bereiche während der Präsentation kennzeichnen.

Den Download gibt's hier

Friday, October 19, 2007 12:55:51 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Wednesday, October 17, 2007

Preisfrage: Was passiert bei folgendem Code:

Dictionary<int, string> Names = new Dictionary<int, string> { { 1, "Thomas" }, { 2, "Chris" } };
Names[5] = "Luka";


Ich hätte erwartet, dass der eine KeyNotFoundException wirft. Tut er aber nicht. Statt dessen wird einfach ein neues Element dem Dictionary hinzugefügt mit dem Key 5 und dem Value "Luka". Ob man das verwenden sollte sei mal dahingestellt, aber zumindest gut zu wissen.

Wednesday, October 17, 2007 6:13:36 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
C# 3.0

Möchte man den kleinesten Key aus einem Dictionary abfragen, dann kann man das jetzt mit Hilfe von LINQ ganz einfach tun. Das Dictionary-Objekt ist in C#3.0 mit einer ensprechenden Extension versehen wordurch das Ganze so einfach ist, wie man sich das immer gewünscht hat.

Dictionary<int, double> ListObject = new Dictionary<int,double>
{
    {2004, 1.5}, {2005, 2.7}, {2006, 3.8}
};
int minYear = ListObject.Min(l => l.Key);
Wednesday, October 17, 2007 11:25:48 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
.Net 3.5 | C# 3.0 | VS 2008

Ich habe mich entschieden, von Zeit zu Zeit Kurzbeschreibungen zu Büchern, die ich aktuell lese zu posten. Vielleicht erhält der eine oder andere dadurch die Anregung, sich mit einem Buch näher zu beschäftigen. Ich poste hier meine ganz private Meinung und bekomme auch keine Provision dafür, wenn jemand das Buch kauft. Ich werde so objektiv wie möglich berichten, wie ich die Bücher einschätze.

image Den Anfang möchte ich mit einem Buch von Dino Esposito machen. In "ASP.Net AJAX Programmierung beschreibt Dino fundiert aber dennoch leicht verständlich, wie AJAX funktioniert, wie ASP.NET AJAX aufgebaut ist und wie das ASP.NET AJAX Component Toolkit eingesetzt werden kann.

Das Buch setzt entsprechende Kenntnisse in der Programmierung von ASP.NET und auch HTML und Javascript voraus und richtet sich damit an Entwickler die bisher bereits Web-Anwendungen mit ASP.NET entwickelt haben. Es bietet eine gute Grundlage für die Programmierung von AJAX Anwendungen und vermittelt auch die Hintergründe zur Technologie, so dass man bestimmte Probleme und Effekte besser verstehen kann. Dino bietet jede Menge Tipps, wie man mit ASP.NET AJAX seine Anwendungen aufbauen sollte und welche Fehler man vermeiden sollte. Damit ist das Buch eine wertvolle Unterstützung für alle die ihre ASP.NET Anwendungen mit Hilfe von AJAX optimieren wollen.

Die Beispiele sind nicht übermäßig ausführlich aber präzise beschrieben. Die oben Beschriebenen Grundkenntnisse vorausgesetzt kann man schnell folgen und vieles davon auch gleich in der Praxis einsetzen. Der Stil des Buches ist angenehm und gut lesbar, so dass ich dieses Buch auf jeden Fall empfehlen kann.


Microsoft ASP.NET AJAX-Programmierung von Dino Esposito erschienen bei Microsoft-Press

Wednesday, October 17, 2007 10:48:44 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Buchbeschreibung

Vor kurzem hatte ich in einem Post beschrieben, wie man mit C#3.0 Listen effizient initialisieren kann. Das Ganze funktioniert übrigens auch mit Dictionaries. Das siehtr dann einfach so aus:

productVersion.Sales = new Dictionary<int,double>
{
    {2004, 1.5}, {2005, 2.7}, {2006, 3.8}
};
Wednesday, October 17, 2007 10:29:20 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
.Net 3.5 | C# 3.0 | VS 2008
# Monday, October 08, 2007

Ich hatte gerade ein kleines Problem mit der Object Test Bench. Die Object Test Bench ermöglicht es, im Visual Studio Instanzen von Objekten zu erzeugen, auf denen man dann direkt Methoden aufrufen kann, ohne die Anwendung zu starten. Dazu geht man in den Class View oder den Class Designer, klickt die entsprechende Klasse mit der rechten Maustaste an und ruft dann aus dem Kontext-Menü den Befehl "Create Instance" auf ... Tja, wenn der Befehl denn da wäre. Bei mir war da nichts zu sehen. Nach einigem Versuchen habe ich dann rausgefunden, dass dies wohl nur auf dem Projekt funktioniert, das als Startprojekt ausgewählt wurde. Also habe ich meine Library als Startprojekt gekennzeichnet und siehe da, es funktioniert.

Schade ist allerdings, dass Methoden, die generische Datentypen zurückliefern nicht von der OTB unterstützt werden.

Weiterführende Informationen findet man hier: http://blogs.msdn.com/parthopdas/archive/2005/05/04/414704.aspx

Monday, October 08, 2007 2:23:09 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Saturday, October 06, 2007

Objekte und Listen lassen sich jetzt in C# 3.0 sehr schön initialisieren. War bisher um ein relativ einfaches Objekt zu initialisieren sehr viel Code erforderlich, hat sich das nun deutlich verkürzt:

Bisher:

List<cProduct> Products = new List<cProduct>();

cProduct Product = new cProduct();
Product.ID = 1;
Product.BusinessDevelopmentComment = "";
Product.MarketingComments = "";
Product.VersionDescriptions = new List<cProductVersionDescription>();
Product.INNs = new List<cProductINNItem>();

cProductVersionDescription VersionDescription = new cProductVersionDescription();
VersionDescription.ID = 1;
VersionDescription.LastPCMDate = DateTime.Now;
VersionDescription.LastPCMDecision = "Go";
VersionDescription.NPV = 689.54;
VersionDescription.ProductID = 1;
VersionDescription.ProductVersionID = 1;
VersionDescription.VersionName = "Version1";
Product.VersionDescriptions.Add(VersionDescription);

cProductINNItem INN = new cProductINNItem();
INN.INN = 8;
INN.Dosage = 1.5;
INN.DosageUnit = 1;
INN.Volume = 1;
INN.Comment = "Test-Comment";
INN.INNOrder = 1;
Product.INNs.Add(INN);

INN = new cProductINNItem();
INN.INN = 2;
INN.Dosage = 2.5;
INN.DosageUnit = 2;
INN.Volume = 2;
INN.Comment = "Test-Comment2";
INN.INNOrder = 2;
Product.INNs.Add(INN);
 

Neu mit C#3.0:

List<cProduct> Products = new List<cProduct>
{
    new cProduct{ ID = 1, BusinessDevelopmentComment = "", MarketingComments = "", 
        VersionDescriptions = new List<cProductVersionDescription>
        {
            new cProductVersionDescription{ ID=1, LastPCMDate=DateTime.Now, LastPCMDecision="Go", NPV=689.54, ProductID=1, ProductVersionID=1, VersionName="Version1"}
        }, 
        INNs = new List<cProductINNItem>
        {
            new cProductINNItem{ INN=8, Dosage=1.5, DosageUnit=1, Volume=1, Comment="Test-Comment", INNOrder=1},
            new cProductINNItem{ INN=2, Dosage=2.5, DosageUnit=2, Volume=2, Comment="Test-Comment2", INNOrder=2}
        }
    }
};

 

Bisher konnte man den Code noch etwas vereinfachen, indem man einen entsprechenden Konstruktor für die Objekte erstellt hat, in dem die Initialisierungswerte übergeben werden konnten. Hier bietet die neue Version aber den Vorteil, dass diese leichter zu leesen ist, da die Parameter hier entsprechend bezeichnet sind. Beim Konstruktor musste immer Intellisense zu Hilfe genommen werden um herauszufinden, um welchen Parameter es sich handelt.

Saturday, October 06, 2007 6:17:22 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
.Net 3.5 | Know-How | VS 2008

Möchte man ASP.Net Anwendungen mit VS2008 debuggen, dann ist entscheidend, welchen Servermode man in den Einstellungen für das Web-Projekt ausgewählt hat.

image

Mit dem Visual Studio Developer Server hat das bei mir auf anhieb funktioniert. Allerdings mit dem IIs gab es Probleme. Hier habe ich zuerst diese NMeldung bekommen:

Unable to start debugging on the web server. Strong name validation failed.

Diesen Fehler kann man beheben indem man folgendes Procedere durchführt:

  1. Visual Studio beenden!
  2. Den "Visual Studio Command Prompt" mit "Run as Administrator" starten.
  3. Dann folgenden Befehl ausführen: sn.exe -Vr "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\iisresolver.dll"

Damit sollte diese Meldung behoben sein. Dann kam aber bei mir der nächste Fehler:

Unable to start debugging on the web server. IIS does not list an application that matches the launched URL.

Um diesen Fehler zu beseitigen muss man die Windows Authentification aktivieren. Dazu geht man folgendermaßen vor:

  1. Im Explorer auf "Computer" Rechtsklick und dann "Manage"
  2. Den IIS Manager öffnen und die entsprechende Anwendung auswählen

    image
  3. "Authentication" unter IIS doppelklicken und dann "Windows Athentication" auf Enabled setzen

    image

Damit hat bei mir das Debuggen dann auch mit dem IIS funktioniert.

Saturday, October 06, 2007 5:39:24 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
ASP.Net | VS 2008
# Tuesday, September 18, 2007

Ich habe in einer Anwendung ein Objekt, das über ca. 30 List<double> Properties verfügt. Dieses Objekt möchte ich nun mit LINQ to SQL in die Datenbank schreiben. Natürlich unterstützt LINQ 1:n-Beziehungen in Objekten aber in der Datenbank müsste ich dann für jedes List-Property eine eigene Tabelle anlegen und für jedes Property einen eigenen Typ definieren. Das schien mir doch sehr umständlich.

Ich habe dann nach einer Möglichkeit gesucht, die List-Elemente etwas effizieter zu speichern, am einfachsten in einem Feld je Liste, da ich die für die Abfrage eh nicht brauche. Aber wie kann ich die Ausgabe von LINQ in die Datenbank steuern? Wie kann ich erreichen, dass LINQ meine Daten entsprechend formatiert?

Googeln brachte keine vernünftigen Ergebnisse und sonst bin ich auch nicht fündig geworden, aber dann kam die Idee (manchmal ist es schneller erst nachzudenken bevor man googelt, aber das vergisst man oft ;-)). Die Grundidee war, für jede Liste noch ein zusätzliches Property anlegen, das die Daten im Getter und Setter entsprechend formatiert. Die Hoffnung war, wenn ich dieses Property mit einem Column-Attribut versehe, wird LINQ den formatierten Inhalt schreiben und beim Lesen wieder zurückformatieren.

public List<string> Sales { get; set; }
[Column(Name="Sales", DbType = "nvarchar(4000)")]
private string SalesString
{
    get
    {
        return string.Join("|", Sales.ToArray());
    }
    set
    {
        if (value != null)
            Sales = value.Split('|').ToList();
    }
}

 

Ich habe einfach eine Text-Spalte in der Datenbank verwendet und die einzelnen List-Elemente mit einem Trennzeichen verbunden (der Einfachkeit halber habe ich mit einer List of Strings gearbeitet. Für die Tests ist das ausreichend und sollte auf beliebige andere Typen übertragbar sein).

Einen kleinen Stolperstein gibt es noch. Beim Ausführen erhielt ich folgende Meldung:

image

LINQ verwendet Optimistic Locking für das Schreiben und hat wohl Probleme, wenn der Inhalt des Property im Getter verändert wird. Abhilfe schafft hier das zusätzliche Attribut UpdateCheck, also sollte das Attribut zu dem Property so aussehen:

[Column(Name="Sales", DbType = "nvarchar(4000)", UpdateCheck=UpdateCheck.Never)]

 

Hier sind natürlich auch noch andere Möglichkeiten der Datenrepräsentation möglich. Hier mal ein Beispiel mit XML-Serialisierung und diesesmal auch mit Doubl-Werten.

public List<double> Sales { get; set; }
[Column(Name="Sales", DbType = "xml", UpdateCheck=UpdateCheck.Never)]
private string SalesString
{
    get
    {                
        UTF8Encoding encoding = new UTF8Encoding();
        MemoryStream ms = new MemoryStream();
        XmlSerializer xmlSer = new XmlSerializer(typeof(List<double>));
        xmlSer.Serialize(ms, Sales);
        return encoding.GetString(ms.ToArray());
    }
    set
    {
        if (value != null)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            MemoryStream ms = new MemoryStream(encoding.GetBytes(value));
            XmlSerializer xmlSer = new XmlSerializer(typeof(List<double>));
            Sales = (List<double>)xmlSer.Deserialize(ms);
        }
    }
}

 

Dank an Bernhard Gojer für den Lösungsansatz.

Tuesday, September 18, 2007 12:09:29 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
.Net 3.5 | LINQ
# Monday, September 17, 2007

Vom 10.Oktober bis 12.Oktober findet in Berlin die XTOPIA statt. Dabei handelt es sich um eine Web-Konferenz von Microsoft, die sich an Entwickler, Entscheider und Designer richtet. Im Zentrum dabei steht Silverlight.

Ich werde auf der XTOPIA als ATE (Ask The Expert) zum Thema Visual Studio Team System vertreten sein.

image

Monday, September 17, 2007 8:53:46 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News

Nutzt man LINQ in einer klassischen 2-tier Anwendung, dann funktioniert das wunderbar. Nur leider ist das eher ein Auslaufmodell. Bei modernen Anwendungen kommt häufig ein 3-tier Ansatz vor (SOA etc.). An einer kleinen WCF-Anwendung möchti ich das Problem kurz schildern:

Eine kleine Anwendung soll Daten darstellen und bearbeiten können. nehmen wir einfach mal eine Adress-Verwaltung. Die Anwendung soll service-orientiert augebaut sein, d.h. es gibt einen zetralen Service, der die Schnittstelle zur Datenbank implementiert.

Soll nun eine Liste der Adressen geladen werden, ruft der Client auf dem Service eine entsprechende Methode auf. Diese Methode nutzt nun LINQ um die Adressen aus der Datenbank zu lesen und als List<cAddress> zurückzuliefern. Diese kann der Client nun darstellen. So weit, so gut. Aber was passiert jetzt, wenn eine Adresse bearbeitet wird und diese wieder gespeichert werden soll. Der Client ruft eine entsprechende Methode auf dem Service auf und übergibt das neue Adress-Objekt. Durch die Übertragung zum Client und wieder zurück muss das Objekt serialisiert und wieder deserialisiert werden. Dadurch stellt es eine komplett andere Instanz dar, wenn es wieder beim Service ankommt und hat daher keine Verbindung mehr zum DataContext (vorausgesetzt dieser wäre überhaupt noch vorhanden, dazu müsste der in einer Session aufbewahrt werden, was recht problematisch ist). Wie bekommt man nun das neue Adress-Objekt in die Datenbank?

Die von Microsoft vorgschlagene Vorgehensweise geht über die Attach-Methode. Dabei erzeugt man einfach einen neuen DataContext und fügt das bearbeitete Objekt diesem hinzu. Das Problem dabei ist das Change-Tracking des DataContext. Dieser möchte nämlich wissen, was sich an dem Objekt geändert hat. Führt man nur einen Attach durch, dann bewirkt das gar nichts. Man kann entweder das gesamte Objekt als bearbeitet deklarieren, so wie ich das in diesem Post demonstriert habe, oder man muss ein Referenz-Objekt mit angeben, gegen das das Objekt evrglichen werden kann. Eine weitere Möglichkeit ist auch noch die Zuweisung aller geänderten Eigenschaften nach dem Attach, da ab diesem Zeitpunkt das Change-Tracking alle Änderungen registriert. Das ist alles nicht so schön.

Mit einem kleinen Trick kan man sich hier die Sache etwas einfacher machen, auch wenn das nicht gerade sauber ist. Man kann das Objekt einfach löschen und dann neu hinzufügen. Das angenehme ist, dass der DataContext das recht intelligent handhabt und intern aus dem Delete and Insert ein Update macht. Der Code sieht dann ungefähr so aus:

public void UpdateCompany(LINQTest.Contracts.DataContracts.cContactCompany company)
{
    cContactDataContext db = new cContactDataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=LINQ;Persist Security Info=True;");

    cContactCompany OrigCompany = db.Companies.Single<cContactCompany>(c => c.ID == company.ID);
    if (OrigCompany != null)
    {
        db.Companies.Remove(OrigCompany);
    }
    db.Companies.Add(company);
    db.SubmitChanges();
}

 

Auch wenn das, wie gesagt nicht besonders schön ist, ich konnte noch keine negativen "Nebenwirkungen" feststellen, der Code macht genau das, was ich von ihm erwarte und das auch noch mit relativ schönem SQL, wie mir der SQL-Profiler anzeigt. Erst wird mal ein SELECT gemacht um zu sehen, ob das Element schon vorhanden ist (diesen Punkt kann man sicher noch optimieren):

exec sp_executesql N'SELECT [t0].[ID], [t0].[CompanyName], [t0].[CompanyAddress], [t0].[CompanyTelephone]
FROM [tblCompanies] AS [t0]
WHERE [t0].[ID] = @p0',N'@p0 int',@p0=2

 

Dann wird der Update ausgeführt

exec sp_executesql N'UPDATE [tblCompanies]
SET [CompanyName] = @p1
WHERE [ID] = @p0',N'@p0 int,@p1 nvarchar(12)',@p0=2,@p1=N'Test-Company'

 

Das sieht doch eigentlich sehr schön aus.

Problematisch wird die Sache nun, wenn das Objekt Unterelemente enthält, also z.B. Ansprechpartner. Hier gibt es mit dem Attach keine saubere Lösung undauch der Delete and Insert Ansatz versagt hier zunächst. Es wird einfach für alle untergeordneten Elemente ein Insert ausgeführt, egal ob diese bereits existieren oder nicht. Das Ganze kann man lösen, indem man auch die Unterelemente zunächst löscht.

public void UpdateCompany(LINQTest.Contracts.DataContracts.cContactCompany company)
{
    cContactDataContext db = new cContactDataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=LINQ;Persist Security Info=True;User ID=sa;Password=admin");

    cContactCompany OrigCompany = db.Companies.Single<cContactCompany>(c => c.ID == company.ID);
    if (OrigCompany != null)
    {
        db.Companies.Remove(OrigCompany);

        foreach (cContactPerson p in OrigCompany.Persons)
        {
            db.Persons.Remove(p);
        }
    }
    db.Companies.Add(company);
    db.SubmitChanges();
}

 

Auch hier wird wieder ein schönes Update daraus gebaut.

Also so richtig toll finde ich das Ganze noch nicht. Hier bleibt zu hoffen, dass Microsoft an dieser Stelle schnellstens noch nachbessert. Das sieht im Moment aber eher schlecht aus, wie man hier und hier lesen kann. Vielleicht hat schon jemand von euch hier Erfahrungen gesammelt. Über einen Kommentar würde ich mich freuen, auch über "Bedenken" bezgl. des Delete and Insert Ansatzes. 

Monday, September 17, 2007 8:27:14 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
LINQ
# Friday, September 14, 2007

Ein Benkannter hatte gerade ein seltsames Problem. Unter VB.Net kann man sehr einfach einen Splash-Screen einrichten. Offensichtlich scheint es da allerdings ein Problem zusammen mit dem Virtual Server zu geben. Jedesmal wenn er die Anwendung innerhalb des Virtual Servers ausgeführt hat, wurde der Splash-Screen angezeigt und er erhielt dann eine Nullreference Exception. In der Host-Umgebung funktionierte das problemlos. Beidesmal kam Win2000 als Betriebssystem zum Einsatz. Hat schn mal jemand so ein Problem gehabt?

Hier der Stacktrace:

   at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
   at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
   at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
   at System.Windows.Forms.Control.Invoke(Delegate method)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.HideSplashScreen()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.MainFormLoadingDone(Object sender, EventArgs e)

   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
   at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Control.set_Visible(Boolean value)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at SplashScreen.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
   at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Friday, September 14, 2007 9:21:06 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [2] -

# Friday, September 07, 2007

Ich habe gerade eben eine Seite, die ich mit VS 2008 und dem Framework 3.5 erstellt habe, auf einen Test-Server deployed. Alles hat wunderbar funktioniert, aber bei einer Seite bekam ich die Meldung, dass die Ressource nicht gefunden werden kann.

image

Das konnte aber nicht sein, die Seite war da. Nach einigen Versuchen und einigem Wundern bin ich zufällig auf die Idee gekommen, mir mal den Source der Seite anzuzeigen. Und siehe da, hier steht nun endlich ein brauchbarar Hinweis. Im Source-Code war als Kommentar die Fehlermeldung versteckt. Der Grund war, dass eine Komponente auf ein verzeichnis zugreifen möchte, das auf dem Server nicht existiert.

Ich habe versucht, den Fehler mit einer Test-Seite zu reproduzieren, aber erfolglos. Hat jemand eine Idee, woran das liegt und wie man das abstellen kann? Na jedenfalls wenn mal jemand ein ähnliches Problem hat, kennt er jetzt den Workaround. Nicht schön, aber es funktioniert.

<html>
    <head>
        <title>Die Ressource kann nicht gefunden werden.</title>
        <style>
...
        </style>
    </head>

    <body bgcolor="white">

            <span><H1>Serverfehler in der Anwendung /ValuePlanner_2008.<hr width=100% size=1 color=silver></H1>

            <h2> <i>Die Ressource kann nicht gefunden werden.</i> </h2></span>

...

    </body>
</html>
<!--
[DirectoryNotFoundException]: Ein Teil des Pfades c:\temp\text.txt konnte nicht gefunden werden.
   bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   bei System.IO.File.Delete(String path)
   ...

--><!--
Diese Seite enthält möglicherweise vertrauliche Informationen, weil ASP.NET für die Anzeige ausführlicher Fehlermeldungen mit &lt;customErrors mode="Off"/&gt; konfiguriert ist. In Produktionsumgebungen sollten Sie &lt;customErrors mode="On"/&gt; oder &lt;customErrors mode="RemoteOnly"/&gt; verwenden.-->

Friday, September 07, 2007 6:05:02 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Wednesday, September 05, 2007

Folgende Aufgabenstellung: In einem Infragistics WinGrid soll eine DataTable angezeigt werden. Am Ende des Grids soll eine TemplateAddRow, also eine leere Zeile zum Anlegen einer neuen Row angezeigt werden. Das Infragistics WinGrid unterstützt diese Funktion von Haus aus so, dass man in diese leere Zeile klicken kann und sobald man beginnt hier Werte einzutragen, dann wird in der DataSource tatsächlich eine neue Row angelegt und in dieser die Werte abgelegt. Gleichzeitig wird eine neue TemplateAddRow angelegt, mit der man wieder eine neue Zeile anlegen kann. Was aber nun, wenn man die Werte nicht im Grid selbst eingeben möchte, sondern in separaten Eingabefeldern?

Dann geht man folgendermaßen vor:

1.) Zuerst erstellt man eine Form mit einer Bindingsource, einem Grid und diversen Eingabefeldern. Das Grid und die Eingabefelder werden an die BindingSource gebunden.

2.) Dann stellt man das Grid so ein, dass die TemplateAddRow angezeigt wird.

this.ultraGrid1.DisplayLayout.Override.AllowAddNew = Infragistics.Win.UltraWinGrid.AllowAddNew.TemplateOnBottom;

2.) Damit nach dem neu Anlegen einer Zeile das Databinding auf den Eingabefeldern funktioniert muss nun manuell eine neue Zeile angelegt werden. Das Grid erzeugt diese Row in der DataSource erst wenn Werte eingegeben werden, das ist für unseren Fall zu spät. Deshalb nutzen wir das BeforeRowIndert Event.

private void ultraGrid1_BeforeRowInsert(object sender, Infragistics.Win.UltraWinGrid.BeforeRowInsertEventArgs e)
{
   
this.myBindingSource.AddNew();
    this.myBindingSource.Position++;
    e.Cancel =
true;
}

3.) Jetzt funktioniert bereits das erste Einfügen. Allerdings erscheint danach keine neue TemplateAddRow mehr. Hier muss man einen kleinen Trick anwenden: Man setzt die ActiveRow auf die TemplateAddRow. Dadurch wird eigentlich die TemplateAddRow nun in eine "echte Row" umgewandelt (was wir bereits ja zuvor manuell gemacht haben. Danach erstellt das Grid eine neue TemplateAddRow (das ist genau das was wir brauchen). Etwas unschön ist nun, dass die neue TemplateAddRow automatisch selektiert wird und wir damit schon wieder einen neuen Datensatz anlegen. Schöner wäre, wenn der gerade erzeugte Datensatz aktiv bleibt. Dazu merkt man sich einfach die aktive Row und setzt die danach wieder. Das Ganze habe ich auf einen Button gelegt, mit dem der Anwender die Eingabe abschließt. Alternativ kann natürlich auch ein anderes Event dafür verwendet werden. Sinnvoll ist hier sicher auch das BeforeSelectChange-Event des Grids entsprechend einzubinden.

private void button1_Click(object sender, EventArgs e)
{
   
this.myBindingSource.EndEdit();
   
UltraGridRow temp = this.ultraGrid1.ActiveRow;
   
this.ultraGrid1.ActiveRow = this.ultraGrid1.Rows.TemplateAddRow;
   
this.ultraGrid1.ActiveRow = temp;
}

Wednesday, September 05, 2007 2:51:36 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Friday, August 31, 2007

Bin da gerade auf ein nettes Angebot gestoßen. SitePal bietet animierte Figuren, die man sich selber konfigurieren kann. Diese Figuren können dann Texte, die man vorgibt, sprechen, entweder aufgezeichnete Audio-Files oder auch über Texteingabe. Diese Figuren lassen sich dann in eine Web-Seite integrieren.

image

Ist sicher interessant, wenn man ein entsprechendes Projekt hat. Mal sehen, vielleicht kann ich das zukünftig mal nutzen. 

SitePal Homepage

Friday, August 31, 2007 6:37:12 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [2] -

# Tuesday, August 21, 2007

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 05.10.2007
To be continued...

Tuesday, August 21, 2007 10:30:22 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [9] -
Tools
# Monday, August 20, 2007

 Will man mit Visual Studio 2008 einem UserControl ein StyleSheet zuordnen, sieht das normalerweise so aus:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
    Inherits="Controls.WebUserControl1" %>
<head>
    <link href="../App_Themes/style.css" rel="stylesheet" type="text/css" />
</head>
<asp:Button ID="Button1" runat="server" Text="Button" /><asp:TextBox ID="TextBox1"
    runat="server"></asp:TextBox>


Damit scheint aber der Designer von Visual Studio 2008 Beta 2 Probleme zu haben. Sowohl im Split-View als auch im Design-View wird nach einem Refresh nichts mehr angezeigt.

image

Bei mir hat hier ein kleiner Trick geholfen. Man verschiebt einfach das Link-Tag mit dem Stylesheet ganz an's Ende des Codes. Dann kann man mit Hilfe der Refresh-Funktion aus dem Kontext-Menü des Design-Panes die Anzeige aktualisieren und siehe da, Button und Textbox werden wieder angezeigt.

image

Monday, August 20, 2007 4:45:30 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [3] -
ASP.Net | VS 2008

Ist eine ASP.Net Seite scrollbar, gibt es den unschönen Effekt, dass die Seite nach dem Postback wieder ganz oben steht. Ich habe mal eine kleine Beispiel-Seite, die diesen Effekt demonstriert:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="ValuePlanner_2008.Web.INN_ProjectArea.WebForm2" %>
<%@ Register Assembly="cTextBox" Namespace="artiso_lib.UserControls" TagPrefix="cc1" %>
<!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 runat="server">
 
 <title>Untitled Page</title>
 </head>
 <body>
 
<form id="form1" runat="server">
 
 <div> 
    <%

   1:  for (int i = 0; i < 50; i++)
   2:        {
   3:            Response.Write(i + "<br>");
   4:        } 
   5:         
    %> 
   </div>
  </form>
 </body>
</html>


Dieses Problem kann man ganz einfach umgehen, indem man in der Page-Direktive das Attribut MaintainScrollPositionOnPostback="true" einfügt, also:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="ValuePlanner_2008.Web.INN_ProjectArea.WebForm2" MaintainScrollPositionOnPostback="true"  %>

Monday, August 20, 2007 11:58:20 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
ASP.Net | Tipps und Tricks
# Saturday, August 18, 2007

Im ASP.Net AJAX Toolkit findet man ein ModalPopup, das sehr gute Dienste leistet, will man Meldungen etwas eleganter ausgeben als mit einem schlichten alert(). Die Handhabung ist relativ einfach. Man nehme ein beliebiges Serverseitiges Control und weise diesem den ModalPopupExtender zu. Dann gibt man noch mindestens die ID des Controls an, das den Inhalt des Popups repräsentieren soll und fertig. Will man das Popup allerdings client-seitig per Java-Script aufrufen, muss man ein wenig in die Trickkiste greifen. Das Problem dabei ist, dass der ModalPopupExtender immer ein TargetControl braucht. Ich habe dafür einfach ein unsichtbares DIV erzeugt, das mit runat="server" auch auf dem Server sichtbar gemacht wurde. Dann kann man mit $Find('<ID des ModalPopupExtenders>').show() das Popup aufrufen.

Neu war an diesem Beispiel für mich auch der Style filter: alpha(opacity = 70) mit dem man eine Transparenz erzeugen kann.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ValuePlanner_2008.Web.INN_ProjectArea.WebForm1" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<!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 runat="server">
    <title>Untitled Page</title>
    <style type="text/css">
        .modalBackground
        {
            filter: alpha(opacity = 70);
            background-color: #CCCCCC;
        }
        .ErrorMessage
        {
            background-color: #800000;
            color: #FFFFFF;
        }
    </style>
</head>

<script language="javascript" type="text/javascript">
   1:  
   2: function okScript()
   3: {
   4:     alert ("OK-Button wurde gedrückt");
   5: }
</script> <body> <form id="form1" runat="server"> <div id="PopupPseudoPanel" style="display: none" runat="server"> </div> <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> </cc1:ToolkitScriptManager> <cc1:ModalPopupExtender ID="ModalPopupExtender" runat="server" PopupControlID="Panel1" DynamicServicePath="" Enabled="True" TargetControlID="PopupPseudoPanel" BackgroundCssClass="modalBackground" OkControlID="OkButton" CancelControlID="CancelButton" OnOkScript="okScript();"> </cc1:ModalPopupExtender> <br /> <br /> <input id="Button2" type="button" value="button" onclick="$find('ModalPopupExtender').show();" /> <asp:Panel ID="Panel1" runat="server" CssClass="ErrorMessage" style="display:none"> <h1> Popup</h1> <p> Das ist ein Popup!</p> <center> <asp:Button ID="OkButton" runat="server" Text="OK"></asp:Button> <asp:Button ID="CancelButton" runat="server" Text="Cancel"></asp:Button> </center> </asp:Panel> </form> </body> </html>

 

Saturday, August 18, 2007 1:57:57 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
ASP.Net | Tipps und Tricks
# Friday, August 17, 2007

Wie man an meinen letzten Posts sieht, beschäftige ich mich momentan sehr intensiv mit LINQ to SQL. Eine wichtige Lektion habe ich gerade eben gelernt. Folgende Ausgangssituation:

Ich habe eine ASP.Net Anwendung. In einem DAL lese ich per LINQ ein Objekt aus der Datenbank und schreibe das dann in eine Session-Variable. Der Anwender bekommt das Objekt an der Oberfläche angezeigt und kann es verändern. Nun möchte ich das Objekt wieder in die Datenbank zurückschreiben. Fast alle Tutorials zu LINQ beschreiben, wie einfach es ist, Daten via LINQ zu schreiben. Aber dort wird in einer einzigen Funktion erst gelesen, dann werden die Daten verändert und dann wieder zurückgeschrieben. Das tritt ja aber in der Praxis eher selten auf.

Also habe ich mich gefragt, was LINQ tut, wenn ich den DataContext einfach neu instanziere und dann einfach mein Objekt per Add an die Tabelle hinzufüge. Na ja,wie zu erwarten, hat LINQ gemeldet, dass der entsprechende Primary Key bereits existiert. Also was tun? Den gesamten DataContext in die Session legen? Dass das keine gute Idee ist, habe ich ziemlich schnell rausgefunden. Der DataContext skaliert sehr schlecht, da er ein eingebautes Change-Tracking, Identity Tracking und sonst noch ein paar Nettigkeiten hat, die sich aber in einer Web_Anwendung recht eklig verhalten können.

Nach einigem Suchen bin ich dann drauf gekommen, dass es auch noch eine Attach-Methode gibt. Damit konnte ich mein Problem schön lösen. Das Ergebnis für das Schreiben sieht nun so aus:

public void SaveProductVersion(cProductVersion _ProductVersion)
{
    DataContext dataContextProducts = new DataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=ValuePlanner_2008;Integrated Security=True");

    if (_ProductVersion.ID == 0)
    {
        dataContextProducts.GetTable<cProductVersion>().Add(_ProductVersion);
    }
    else
    {
        dataContextProducts.GetTable<cProductVersion>().Attach(_ProductVersion, true);
    }
    dataContextProducts.SubmitChanges();
}

 

Hier wird abgefragt, ob es eine neue Produktversion ist (ID == 0). Wenn ja, dann füge ich die per Add hinzu (die ID wird von LINQ automatisch vergeben). Bei einem bestehenden Projekt verwende ich die Attach-Methode. Ganz einfach, wenn mans weiss. Wichtig ist noch, dass alle Properties des Objektes das Attribut UpdateCheck=none benötigen.

Friday, August 17, 2007 8:53:05 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
LINQ
# Thursday, August 16, 2007

Scott Mitchell hat 75 Tutorials zum Thema Data Access mit ASP.Net 2.0 geschrieben. Hier ist praktisch alles an Technologie beschrieben, was für die Programmierung von datenbankbasierten Webanwendungen mit ASP.Net 2.0 notwendig ist. Einzig LINQ wird momentan noch ausgespart. Eine wirklich tolle Sammlung an guten Informationen.

image

Data Access Tutorials : The Official Microsoft ASP.NET 2.0 Site

Thursday, August 16, 2007 11:06:18 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
ADO.Net | ASP.Net | Know-How | Lernen | SQL

Wenn man mit LINQ to SQL arbeitet, dann steht man sehr schnell vor dem Problem, dass man sehen möchte, wass denn LINQ mit der Datenbank so treibt. Der SQL Profiler kann zwar die abgesetzten SQL-Statements anzeigen, die zurückgegebenen Ergebnisse muss mann dann aber von Hand abfragen. Viel eleganter geht es mit dem LINQ to SQL Debug Visualizer von Scott Guthrie. Damit kann man die Abfrage im Debug-Modus von Visual Studio 2008 einfach anzeigen lassen:

Mit dem Execute-Button kann man die Abfrage einfach ausführen und das Ergebnis anzeigen lassen.

Ein echt cooles Tool. Download und eine Installationsanleitung gibt es hier.

LINQ to SQL Debug Visualizer - ScottGu's Blog

Thursday, August 16, 2007 10:53:05 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
LINQ
# Wednesday, August 15, 2007

Ich habe folgendes Datenmodell mit dem LINQ To SQL Designer aufgebaut:

image

So, eigentlich ganz einfach. Mit folgendem Code kann ich die Daten einlesen:

    var formList = from f in listDataContext.cFormListItems
                   orderby f.FormShort                            
                   select f;
    var countryList = from c in listDataContext.cCountryListItems 
                      orderby c.CountryName 
                      select c;

Damit liest LINQ die Daten für die Forms bzw. die Countries ein, die zugeordneten Tabellen bleiben leer, bis man auf das entsprechende Element zugreift, dann wird das nachgeladen (lazy loading). Dieser Effekt ist super, wenn ich z.B. eine Liste der Kunden habe und den Kunden Bestellungen zugeordnet sind und ich teilweise Kunden mit mehreren tausend Bestellungen habe. Dann will ich die Bestellungen nicht gleich alle mitladen. Aber in meinem Fall war es so, dass in den verknüpften Tabellen nur wenige Datensätze stehen und ich deshalb lieber alles auf einen Rutsch laden wollte. Das geht dann so:

    listDataContext = new cListDataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=ValuePlanner_2008;Integrated Security=True");
    
    // Define LoadOptions to load some related tables with their parent tables in one select statement
    DataLoadOptions loadOptions = new DataLoadOptions();
    loadOptions.LoadWith<cFormListItem>(f => f.FormType);
    loadOptions.LoadWith<cCountryListItem>(c => c.Market);
    listDataContext.LoadOptions = loadOptions;

Diesen Code muss man vor der ersten Abfrage ausführen. Hier werden zwei LoadWith (jeweils für eine untergeordnete Tabelle) mit angegeben. Dies bewirkt, dass die untergeordneten Tabellen mit der jeweiligen Haupttabelle in einem einzigen SELECT Statement aus der Datenbank geladen werden! Ein paar Sachen muss man allerdings beachten:

  • Die LoadOptions können nur vor der ersten Abfrage auf dem DataContext zugewiesen werden.
  • Die Loadoptions können nicht mehr verändert werden, wenn sie einmal einem DataContext zugewiesen wurden.
  • Für mehrere Tabellen ruft man das LoadWith einfach mehrfach auf.

Ich hätte das zwar schöner gefunden, wenn man das auch mit im Designer einstellen könnte, aber es funktioniert einwandfrei.

Hier noch als Beweis das SQL-Statement, das dann tatsächlich auf der Datenbank ausgeführt wird:

SELECT [t0].[ID], [t0].[FormLong], [t0].[FormShort], [t0].[FormTypeID], [t1].[ID] AS [ID2], [t1].[FormTypeLong], [t1].[FormTypeShort]
FROM [values_Forms] AS [t0]
INNER JOIN [values_FormTypes] AS [t1] ON [t1].[ID] = [t0].[FormTypeID]
ORDER BY [t0].[FormShort]
Wednesday, August 15, 2007 7:17:42 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

Archive
<April 2008>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2014
Thomas
Sign In
Statistics
Total Posts: 620
This Year: 11
This Month: 0
This Week: 0
Comments: 356
Themes
All Content © 2014, Thomas
DasBlog theme 'Business' created by Christoph De Baene (delarou)