<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-26544185</id><updated>2009-10-17T02:00:44.364+02:00</updated><title type='text'>Tipps, Tricks and Tracks</title><subtitle type='html'>Visual Studio, ASP.NET, C#, and more ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default?start-index=26&amp;max-results=25'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26544185.post-5050545395937247718</id><published>2009-04-10T13:05:00.002+02:00</published><updated>2009-04-10T13:09:49.144+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET MVC</title><content type='html'>Nachdem ich mich nun seit rund einem Jahr mit dem ASP.NET MVC Framework beschäftige, durfte ich an den TechDays 2009 in Bern einen entsprechenden Vortrag halten. Die Slides und Demos werden in Kürze unter &lt;a href="http://www.microsoft.com/switzerland/msdn/de/techdays"&gt;TechDays&lt;/a&gt; verfügbar sein.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-5050545395937247718?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/5050545395937247718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=5050545395937247718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/5050545395937247718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/5050545395937247718'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2009/04/aspnet-mvc.html' title='ASP.NET MVC'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-4898620005841655818</id><published>2008-03-11T08:33:00.008+01:00</published><updated>2008-03-11T21:36:22.906+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Virtual, new and override - the differences</title><content type='html'>Auf die Frage was ist der Unterschied zwischen new und override, im konkreten Fall für ein Property verwendet, bekommt man stehts die korrekte Antwort. New versteckt das Property in der Basisklasse, override überschreibt dieses. Gut, aber was heisst das genau? Nun werden die sinnvollen Antworten doch eher rare.&lt;br /&gt;&lt;br /&gt;Folgendes Beispiel zeigt die Funktionsweisen auf. Parent ist die Basisklasse, die zwei Properties Foo und Bar anbietet. Child ist eine Klasse die von Parent ableitet und die beiden Properties einmal mit new und einmal mit override überschreibt. In der Klasse MyClass werden zwei Instanzen von Child erzeugt, wobei im ersten Fall die Deklaration auf die Basisklasse Parent lautet. Die beiden Properties der beiden Instancen werden abgefragt und ausgedruckt.&lt;br /&gt;&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;Parent p = new Child();&lt;br /&gt;Child c = new Child();&lt;br /&gt;Console.WriteLine(p.Foo);&lt;br /&gt;Console.WriteLine(p.Bar);&lt;br /&gt;Console.WriteLine(c.Foo);&lt;br /&gt;Console.WriteLine(c.Bar);&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;public class Parent&lt;br /&gt;{&lt;br /&gt;public string Foo {get{return "ParentFoo";}}&lt;br /&gt;public virtual string Bar {get{return "ParentBar";}}&lt;br /&gt;}&lt;br /&gt;public class Child : Parent&lt;br /&gt;{&lt;br /&gt;public new string Foo {get{return "ChildFoo";}}&lt;br /&gt;public override string Bar {get{return "ChildBar";}}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Das aufschlussreiche Ergebniss sieht so aus:&lt;br /&gt;ParentFoo&lt;br /&gt;ChildBar&lt;br /&gt;ChildFoo&lt;br /&gt;ChildBar&lt;br /&gt;&lt;br /&gt;Da zwei Instancen von Child erzeugt wurden ist der Ausdruck ParentFoo doch für den einen oder anderen erstaunlich. Wie kommt das? Die Antwort liegt im Early- und Late Binding.&lt;br /&gt;&lt;br /&gt;Im Fall von Foo wurde das Property auf der Parent Klasse nicht mit virtual deklariert. Somit wird das Early Binding verwendet. Das heisst, der Compiler legt zur Kompilierzeit fest welches Property aufgerufen wird. Da im ersten Fall die Variable als Parent deklariert ist, wird in jedem Fall (egal was für eine Instanz effektiv vorhanden ist) das Property Foo der Klasse Parent aufgerufen und im zweiten Fall das Property der Klasse Child.&lt;br /&gt;&lt;br /&gt;Im Fall von Bar wurde das Property auf der Basisklasse mit virtual deklariert und somit das Early Binding verhindert. Das heisst, das zur Laufzeit die Instance analysiert wird und entsprechend das Property der effektiv vorhandenen Klasse (in unserem Fall Child) aufgerufen wird.&lt;br /&gt;&lt;br /&gt;Und zum Schluss noch einen Blick auf den IL Code:&lt;br /&gt;&lt;br /&gt;.method public hidebysig static void Main() cil managed&lt;br /&gt;{&lt;br /&gt;.entrypoint&lt;br /&gt;.maxstack 1&lt;br /&gt;.locals init (&lt;br /&gt;[0] class Parent parent,&lt;br /&gt;[1] class Child child)&lt;br /&gt;L_0000: newobj instance void Child::.ctor()&lt;br /&gt;L_0005: stloc.0&lt;br /&gt;L_0006: newobj instance void Child::.ctor()&lt;br /&gt;L_000b: stloc.1&lt;br /&gt;L_000c: ldloc.0&lt;br /&gt;L_000d: callvirt instance string Parent::get_Foo()&lt;br /&gt;L_0012: call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;L_0017: ldloc.0&lt;br /&gt;L_0018: callvirt instance string Parent::get_Bar()&lt;br /&gt;L_001d: call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;L_0022: ldloc.1&lt;br /&gt;L_0023: callvirt instance string Child::get_Foo()&lt;br /&gt;L_0028: call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;L_002d: ldloc.1&lt;br /&gt;L_002e: callvirt instance string Parent::get_Bar()&lt;br /&gt;L_0033: call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;L_0038: call string [mscorlib]System.Console::ReadLine()&lt;br /&gt;L_003d: pop&lt;br /&gt;L_003e: ret&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Würde man nicht erwarten, dass beim Early Binding ein call und nicht ein callvirt aufgerufen wird? Eigentlich schon. Das callvirt wird generiert, damit die Klasse auf null geprüft werden kann. Der JIT Compiler wird aber nach der null Prüfung diesen Aufruf effektiv in einen non-virtual Aufruf umsetzen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-4898620005841655818?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/4898620005841655818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=4898620005841655818' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4898620005841655818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4898620005841655818'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2008/03/virtual-new-and-override-differences.html' title='Virtual, new and override - the differences'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-2407368915703822297</id><published>2008-01-02T17:58:00.000+01:00</published><updated>2008-01-02T19:06:46.265+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Mehrere Tabellen auf eine Entität mappen</title><content type='html'>Meistens sind Daten in einer Datenbank normalisiert abgelegt. In der Applikation möchte man aber oft mit den nicht normalisierten Daten arbeiten. Ist das ADO.NET Entity Framework die Lösung?&lt;br /&gt;&lt;br /&gt;Jein lautet die Antwort. Und um es vorne weg zu nehmen, ein Mapping von mehreren Tabellen auf eine Entität ist möglich, aber nur wenn diese eine 1:1 Beziehung haben. Das heisst, in den meisten Fällen wird man besser fahren, wenn auf der Datenbank eine geeignete View erstellt, diese auf die Entität gemapped und das Update, Insert und Delete über Stored Procedures gelöst wird.&lt;br /&gt;&lt;br /&gt;Nun aber zur Lösung. Zuerst wird ein Model mit dem Assistenten erstellt, das alle gewünschten Tabellen enthält.&lt;br /&gt;&lt;br /&gt;Die Anpassungen am Conceptual Model (CSDL) sind einfach. Auf der Entität werden die gewünschten Attribute aus den weiteren Tabellen hinzugefügt. So wurde etwa hier die Entität Cars um das Attribut Value erweitert.&lt;br /&gt;&lt;br /&gt;&amp;#060?xml:namespace prefix = edmx /&amp;#062&amp;#060edmx:conceptualmodels&amp;#062&lt;br /&gt;&amp;#060schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm" alias="Self" namespace="Model"&amp;#062&lt;br /&gt;&amp;#060entitycontainer name="Entities"&amp;#062&lt;br /&gt;&amp;#060entityset name="Cars" entitytype="Model2.Cars"&amp;#062&lt;br /&gt;&amp;#060/entitycontainer&amp;#062&lt;br /&gt;&amp;#060entitytype name="Cars"&amp;#062&lt;br /&gt;&amp;#060key&amp;#062&lt;br /&gt;&amp;#060propertyref name="ID_Cars"&amp;#062&lt;br /&gt;&amp;#060/key&amp;#062&lt;br /&gt;&amp;#060property name="ID_Cars" nullable="false" type="Guid"&amp;#062&amp;#060/property&amp;#062&lt;br /&gt;&amp;#060property name="Brand" type="String" maxlength="50"&amp;#062&amp;#060/property&amp;#062&lt;br /&gt;&amp;#060property name="Model" type="String" maxlength="50"&amp;#062&amp;#060/property&amp;#062&lt;br /&gt;&lt;em&gt;&amp;#060property name="Value" type="String" maxlength="50"&amp;#062&amp;#060/property&amp;#062&lt;/em&gt;&lt;br /&gt;&amp;#060/entitytype&amp;#062&lt;br /&gt;&amp;#060/schema&amp;#062&lt;br /&gt;&amp;#060/edmx:conceptualmodels&amp;#062&lt;br /&gt;&lt;br /&gt;Anpassungen am Storage Model (SSDL) sind keine notwendig, da sich an der Datenbank, welche durch dieses Model repräsentiert wird, nichts ändert.&lt;br /&gt;&lt;br /&gt;Durch Anpassung des Mappings werden die neu definierten Attribute auf der Entität nun auf die im Storage Model vorhandenen gemapped. Dies wird realisiert durch Hinzufügen eines zusätzlichen Mapping Fragment.&lt;br /&gt;&lt;br /&gt;&amp;#060edmx:mappings&amp;#062&lt;br /&gt;&amp;#060mapping xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS" space="C-S"&amp;#062&lt;br /&gt;&amp;#060entitycontainermapping cdmentitycontainer="Entities" storageentitycontainer="dbo"&amp;#062&lt;br /&gt;&amp;#060entitysetmapping name="Cars"&amp;#062&lt;br /&gt;&amp;#060entitytypemapping typename="IsTypeOf(Model.Cars)"&amp;#062&lt;br /&gt;&amp;#060mappingfragment storeentityset="Cars"&amp;#062&lt;br /&gt;&amp;#060scalarproperty name="ID_Cars" columnname="ID_Cars"&amp;#062&lt;br /&gt;&amp;#060scalarproperty name="Brand" columnname="Brand"&amp;#062&lt;br /&gt;&amp;#060scalarproperty name="Model" columnname="Model"&amp;#062&lt;br /&gt;&amp;#060/mappingfragment&amp;#062&lt;br /&gt;&lt;em&gt;&amp;#060mappingfragment storeentityset="Extensions"&amp;#062&lt;br /&gt;&amp;#060scalarproperty name="ID_Cars" columnname="ID_Extensions"&amp;#062&lt;br /&gt;&amp;#060scalarproperty name="Value" columnname="Value"&amp;#062&lt;br /&gt;&amp;#060/mappingfragment&amp;#062&lt;/em&gt;&lt;br /&gt;&amp;#060/entitytypemapping&amp;#062&lt;br /&gt;&amp;#060/entitysetmapping&amp;#062&lt;br /&gt;&amp;#060/entitycontainermapping&amp;#062&lt;br /&gt;&amp;#060/mapping&amp;#062&lt;br /&gt;&amp;#060/edmx:mappings&amp;#062&lt;br /&gt;&lt;br /&gt;Nicht mehr benötigter Code wie EntitySets und AssociationSets sind im CSDL und dem Mapping zu löschen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-2407368915703822297?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/2407368915703822297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=2407368915703822297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/2407368915703822297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/2407368915703822297'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2008/01/mehrere-tabellen-auf-eine-entitt-mappen.html' title='Mehrere Tabellen auf eine Entität mappen'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8344600083623732073</id><published>2007-12-19T11:53:00.000+01:00</published><updated>2007-12-20T09:01:02.632+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Vom Namen zur Instanz mit DynamicMethod</title><content type='html'>Ein Kunde legt beim Logging unterschiedliche LogMessages (unterschiedliche Klassen) in einer Datenbank ab. Dabei werden der Typ der Message (der LogMessage Klassenname), die Message selber sowie weitere Felder in der Tabelle gespeichert.&lt;br /&gt;Nun sollten diese Einträge gelesen und die ursprünglichen Objekte wieder hergestellt werden.&lt;br /&gt;&lt;br /&gt;Für die erste Lösung wurde der offensichtliche Weg mit Reflection gewählt:&lt;br /&gt;&lt;br /&gt;string s = "Namespace.Name.FromDB";&lt;br /&gt;Assembly a = Assembly.GetAssembly(typeof(ThisClass));&lt;br /&gt;Type t = a.GetType(s);&lt;br /&gt;BaseType b = (BaseType)Activator.CreateInstance(t);&lt;br /&gt;&lt;br /&gt;Da dies nicht sehr performant ist, wurde der Code wie folgt verbessert:&lt;br /&gt;&lt;br /&gt;string s = "Namespace.Name.FromDB";&lt;br /&gt;Assembly a = Assembly.GetAssembly(typeof(ThisClass));&lt;br /&gt;Type t = a.GetType(s);&lt;br /&gt;ConstructorInfo i = t.GetConstructor(Type.EmptyTypes);&lt;br /&gt;BaseType b = (BaseType)i.Invoke(null);&lt;br /&gt;&lt;br /&gt;Wobei der Klassenname und die zugehörige ConstructorInfo in einem statischen Dictionaire abgelegt werden, damit diese nicht bei jedem Aufruf neu evaluiert werden müssen. So haben wir vom zweiten bis x-ten Aufruf den gewünschten Performancegewinn. Der Code dazu sieht folgendermassen aus.&lt;br /&gt;&lt;br /&gt;ConstructorInfo c = null;&lt;br /&gt;if (_cinfo.TryGetValue(s, out c))&lt;br /&gt;{&lt;br /&gt;c = t.GetConstructor(Type.EmptyTypes);&lt;br /&gt;lock(_cinfo)&lt;br /&gt;{&lt;br /&gt;if (_cinfo.ContainsKey(s))&lt;br /&gt;{&lt;br /&gt;_cinfo.Add(s, c);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Noch eleganter und viel performanter geht's mit Dynamic Methods. Der von der dynamischen Methode zurückgegebene Delegate wird wie zuvor die ConstructorInfo in einem Dictionaire abgelegt und für die Folgeaufrufe wieder verwendet:&lt;br /&gt;&lt;br /&gt;public delegate BaseType CtorDelegate();&lt;br /&gt;&lt;br /&gt;DynamicMethod dm = new DynamicMethod&lt;br /&gt;("MyCtor", typeof(BaseType), Type.EmptyTypes, typeof(BaseType).Module);&lt;br /&gt;ILGenerator ilgen = dm.GetILGenerator();&lt;br /&gt;ilgen.Emit(OpCodes.Newobj, t.GetConstructor(Type.EmptyTypes));&lt;br /&gt;ilgen.Emit(OpCodes.Ret);&lt;br /&gt;CtorDelegate d = (CtorDelegate)dm.CreateDelegate(typeof(CtorDelegate));&lt;br /&gt;&lt;br /&gt;Der Aufruf ist dann genau so kurz (d wird zuvor aus dem Dictionaire gelesen) und unheimlich schnell:&lt;br /&gt;&lt;br /&gt;t message = (t)d();&lt;br /&gt;&lt;br /&gt;Nun muss nur noch alles in einer Factory Klasse schön verpackt werden und fertig. Mehr zu diesem Thema inklusive Performance Messungen findet man wie immer bei Google ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8344600083623732073?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8344600083623732073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8344600083623732073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8344600083623732073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8344600083623732073'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/12/vom-namen-zur-instanz-mit-dynamicmethod.html' title='Vom Namen zur Instanz mit DynamicMethod'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-9189945132973124847</id><published>2007-11-05T19:39:00.000+01:00</published><updated>2007-11-05T21:36:09.982+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Sprachfeatures C# 3.0 und wie sie die Welt verändern</title><content type='html'>Mit dem .NET Framework 3.5 kommen erneut etliche Features zur Sprache C# 3.0 hinzu, die dem Entwickler das Leben bedeutend erleichtern (ausser man ist auf der Wartungsseite).&lt;br /&gt;Automatic Properties, Extension Methods, Lambda Expressions, Anonymous Types, usw. bieten dem Entwickler vollkommen neue Möglichkeiten, was zu sehr schickem Code führen kann. Bei exzessivem Anwenden nur des Features oder der Eleganz wegen kann das aber zu schwer wartbarem und unübersichtlichen Code- und Sprachauswüchsen führen.&lt;br /&gt;&lt;br /&gt;Trotzdem, ganz hübsche ist folgendes (auch wenn nicht sehr sinnvoll ;-):&lt;br /&gt;7.TimesPrint("MeinText");&lt;br /&gt;&lt;br /&gt;Wesentlich eleganter als:&lt;br /&gt;for (int i = 0; i &lt; 7; i++)&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine("MeinText");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Doch damit es funktioniert braucht's noch eine Extension Method:&lt;br /&gt;Public static void TimesPrint(this int no, string s)&lt;br /&gt;{&lt;br /&gt;    for (int i = 0; i &lt; no; i++)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(s);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Etwas allgemeiner formuliert könnte der Aufruf so aussehen und so auch wirklich Sinn machen (die Extension Method muss natürlich entsprechend angepasst werden):&lt;br /&gt;7.Times(i =&gt; Console.WriteLine("MeinText"));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ob die Wartbarkeit durch die schwerer erkennbare Funktionalität komplexer oder durch die elegante Syntax doch eher erleichtert wird, wird spätestens die Praxis zeigen.&lt;br /&gt;&lt;br /&gt;So oder so, die neuen Features machen viel Spass!&lt;br /&gt;&lt;br /&gt;PS: Eine gute Übersicht zu den neuen Features gibt's &lt;a href="http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/csharp_3.0_specification.doc"&gt;hier&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-9189945132973124847?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/9189945132973124847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=9189945132973124847' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/9189945132973124847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/9189945132973124847'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/11/sprachfeatures-c-30-und-wie-sie-die.html' title='Sprachfeatures C# 3.0 und wie sie die Welt verändern'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-963221008621752229</id><published>2007-10-25T08:54:00.000+02:00</published><updated>2007-10-25T10:12:34.829+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Output Parameter in dynamischem T-SQL</title><content type='html'>In einer Stored Procedure werden in einem ersten Schritt zwei Variablen gesetzt, die für die weitere Verarbeitung benötigt werden. Dies könnte so aussehen:&lt;br /&gt;&lt;br /&gt;SELECT @var1 = Var1, @var2 = Var2&lt;br /&gt;FROM MyTable&lt;br /&gt;WHERE ID = @ID&lt;br /&gt;&lt;br /&gt;Nun muss das Statement aber dynamisch zusammengestellt werden und der Select-String danach ausgeführt werden. Dies könnte so aussehen:&lt;br /&gt;&lt;br /&gt;SET @query = '&lt;br /&gt;SELECT @var1 = Var1, @var2 = Var2&lt;br /&gt;FROM MyTable&lt;br /&gt;WHERE ID = ' + CAST(@ID as CHAR(15))&lt;br /&gt;EXEC (@query)&lt;br /&gt;&lt;br /&gt;In meinem Fall wird das Statement auf einem Hostsystem ausgeführt und der Aufruf muss über Openquery gemacht werden. Dies könnte so aussehen:&lt;br /&gt;&lt;br /&gt;SET @query = '&lt;br /&gt;SELECT @var1 = Var1, @var2 = Var2&lt;br /&gt;FROM OPENQUERY(MySystem, ''SELECT Var1, Var2 FROM MyTable WHERE ID = '&lt;br /&gt;+ dbo.MyTypeConverter(@id) + ''')'&lt;br /&gt;EXEC (@query)&lt;br /&gt;&lt;br /&gt;Ganz klar, dass die beiden Variablen so nicht mehr abgefüllt werden, sondern zu einem Fehler führen. Wie können diese gesetzt werden?&lt;br /&gt;Gemäss einer ersten Idee wurde eine Variable vom Typ TABLE verwendet und das Openquery-Resultat mit INSERT INTO angefügt. Danach das erste Select-Statement verwendet um die Variablen zu setzten. Funktioniert! Ist aber nicht sehr elegant.&lt;br /&gt;Hübscher ist's so:&lt;br /&gt;&lt;br /&gt;SET @params = ' @var1 int OUTPUT, @var2 nvarchar(max) OUTPUT'&lt;br /&gt;SET @query = '&lt;br /&gt;SELECT @var1Out = Var1, @var2Out = Var2&lt;br /&gt;FROM OPENQUERY(MySystem, SELECT Var1, Var2 FROM MyTable '&lt;br /&gt;+ dbo.MyTypeConverter(@id) + ''')'&lt;br /&gt;EXEC sp_executesql @query, @params, @var1Out = @var1 OUTPUT, @var2Out = @var2 OUTPUT&lt;br /&gt;&lt;br /&gt;Dieser Ansatz mit der System Procedure sp_executesql bietet zudem noch weitere Vorteile die in der SQL Server Hilfe nachgelesen werden können.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-963221008621752229?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/963221008621752229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=963221008621752229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/963221008621752229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/963221008621752229'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/10/output-parameter-in-dynamischem-t-sql.html' title='Output Parameter in dynamischem T-SQL'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-2701691671051447937</id><published>2007-10-05T10:15:00.000+02:00</published><updated>2007-10-05T10:57:52.173+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Dynamic Method Performance</title><content type='html'>In einem interessanten Artikel im &lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/07/Reflection/"&gt;MSDN Magazine&lt;/a&gt; wird auf unterschiedliche Performance Probleme, im Speziellen im Zusammenhang mit Reflection, eingegangen. Mich interessierte vor allem die gelobte Performance der dynamischen Methoden, die seit der .NET Framework Version 2.0 zur Verfügung stehen. Eine einfache Testanwendung hat gezeigt, dass der Artikel recht behält.&lt;br /&gt;In der Testanwendung wird einem Objekt ein String eine Million mal zugewiesen. Dies zuerst direkt verdrahtet, danach mit dynamischer Methode und zuletzt via Reflection. Das Ergebnis ist eindeutig. Die direkt verdrahtete Methode ist natürlich die Schnellste, die dynamische Methode braucht dafür doppelt so lange (was ich immer noch sehr gut finde) und mittels Reflection dauert es 100mal länger. What a gain!&lt;br /&gt;Übrigens, die Assembly habe ich mit Lutz's Reflector untersucht, um sicher zu stellen, dass die Schlaufe auch wirklich bei allen drei Varianten ausgeführt wird.&lt;br /&gt;&lt;br /&gt;Und hier noch der Code:&lt;br /&gt;&lt;br /&gt;public class Program&lt;br /&gt;{&lt;br /&gt;private delegate void DemoDelegate(Foo arg);&lt;br /&gt;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;Stopwatch stopwatch = new Stopwatch();&lt;br /&gt;&lt;br /&gt;Foo f = new Foo();&lt;br /&gt;stopwatch.Start();&lt;br /&gt;for (int i = 0; i &lt; 1000000; i++)&lt;br /&gt;{&lt;br /&gt;f.Text = "Hello World!";&lt;br /&gt;}&lt;br /&gt;stopwatch.Stop();&lt;br /&gt;Console.WriteLine("Direct: {0}", stopwatch.Elapsed);&lt;br /&gt;&lt;br /&gt;stopwatch.Reset();&lt;br /&gt;&lt;br /&gt;DemoDelegate del = createMethod();&lt;br /&gt;stopwatch.Start();&lt;br /&gt;for (int i = 0; i &lt; 1000000; i++)&lt;br /&gt;{&lt;br /&gt;del(f);&lt;br /&gt;}&lt;br /&gt;stopwatch.Stop();&lt;br /&gt;&lt;br /&gt;Console.WriteLine("Dynamic method: {0}", stopwatch.Elapsed);&lt;br /&gt;&lt;br /&gt;stopwatch.Reset();&lt;br /&gt;&lt;br /&gt;PropertyInfo property = f.GetType().GetProperty("Text");&lt;br /&gt;stopwatch.Start();&lt;br /&gt;for (int i = 0; i &lt; 1000000; i++)&lt;br /&gt;{&lt;br /&gt;property.SetValue(f, "Hello World!", null);&lt;br /&gt;}&lt;br /&gt;stopwatch.Stop();&lt;br /&gt;Console.WriteLine("Reflection: {0}", stopwatch.Elapsed);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Console.ReadKey();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static DemoDelegate createMethod()&lt;br /&gt;{&lt;br /&gt;Type[] parameterTypes = new Type[] { typeof(Foo) };&lt;br /&gt;DynamicMethod method = new DynamicMethod("Demo", null, parameterTypes, typeof(Program));&lt;br /&gt;&lt;br /&gt;ILGenerator iLGenerator = method.GetILGenerator();&lt;br /&gt;iLGenerator.Emit(OpCodes.Ldarg_0);&lt;br /&gt;iLGenerator.Emit(OpCodes.Ldstr, "Hello World!");&lt;br /&gt;MethodInfo setMethod = typeof(Foo).GetProperty("Text").GetSetMethod();&lt;br /&gt;iLGenerator.EmitCall(OpCodes.Call, setMethod, null);&lt;br /&gt;iLGenerator.Emit(OpCodes.Ret);&lt;br /&gt;&lt;br /&gt;return (DemoDelegate)method.CreateDelegate(typeof(DemoDelegate));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Foo&lt;br /&gt;{&lt;br /&gt;private string _text;&lt;br /&gt;&lt;br /&gt;public string Text&lt;br /&gt;{&lt;br /&gt;get { return _text; }&lt;br /&gt;set { _text = value; }&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-2701691671051447937?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/2701691671051447937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=2701691671051447937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/2701691671051447937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/2701691671051447937'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/10/dynamic-method-performance.html' title='Dynamic Method Performance'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-435154505005376419</id><published>2007-09-14T16:17:00.000+02:00</published><updated>2007-09-14T16:21:49.557+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Remote Debbuging</title><content type='html'>Wenn man eine Applikation remote debuggen soll, wird man feststellen, dass verschiedene Punkte beachtet werden müssen, damit das Ziel erreicht wird. Einige hoffentlich nützliche Hinweise möchte ich hiermit weitergeben:&lt;br /&gt;&lt;br /&gt;1. Remotedebugging heisst, mit dem lokalen Visual Studio eine laufende Applikation auf einer anderen Maschine, typischerweise einem Server, zu debuggen.&lt;br /&gt;2. Der Applikationscode (dll und pdb Files) muss auf beiden Systemen identisch sein.&lt;br /&gt;3. Auf der Remotemaschine muss der Remote Debugger, im Speziellen das File msvsmon.exe vorhanden sein. Auf der lokalen Maschine muss Visual Studio vorhanden sein.&lt;br /&gt;4. Der lokale Account (unter dem Visual Studio läuft) muss auf dem Remotesystem Administratorrechte haben, damit sich Visual Studio attachen kann.&lt;br /&gt;5. Auf dem Remotesystem muss der Remotedebugger (msvsmon.exe) unter dem lokalen Account (unter demselben wie Visual Studio läuft), gestartet werden (im Contextmenü Run as ... ausführen).&lt;br /&gt;6. In Visual Studio muss unter Tools, Options, Debugging, General die Option ‚Enable just my Code’ inaktiv sein, damit die Symbols geladen werden und Breakepoints gesetzt werden können.&lt;br /&gt;7. In Visual Studio kann nun unter Debug, Attach to Process der Remoteprozess angebunden werden. Dazu Transport: Default und Qualifier: SERVERNAME wählen. Nun den gewünschten Prozess, z. Bsp. W3wp.exe auswählen. Ist der gewünschte Prozess nicht aufgelistet, muss sichergestellt werden, dass die Applikation wirklich läuft. Dazu z. Bsp. Die Webseite aufrufen.&lt;br /&gt;8. Nun wie gewohnt debuggen.&lt;br /&gt;&lt;br /&gt;Viel Spass.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-435154505005376419?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/435154505005376419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=435154505005376419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/435154505005376419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/435154505005376419'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/09/remote-debbuging.html' title='Remote Debbuging'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8106921365791919927</id><published>2007-09-14T15:56:00.000+02:00</published><updated>2007-09-14T16:01:24.118+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>http und Textfile</title><content type='html'>Für einen Kunden sollte ich von einer Webseite (&lt;a href="http://.../mytext.php"&gt;http://.../mytext.php&lt;/a&gt;) ein File downloaden und den Text auf einem Server Share speichern. Und so einfach ist das mit .NET 2.0.&lt;br /&gt;&lt;br /&gt;// Get stream from any webserver over HTTP response object&lt;br /&gt;WebRequest request = (WebRequest)WebRequest.Create(new Uri("http://.../mytext.php"));&lt;br /&gt;WebResponse response = request.GetResponse();&lt;br /&gt;// create reader to read the stream and save it in a string&lt;br /&gt;StreamReader reader = new StreamReader(response.GetResponseStream());&lt;br /&gt;// write string to a file&lt;br /&gt;File.WriteAllText(@"c:/test.txt", reader.ReadToEnd());&lt;br /&gt;// close objects&lt;br /&gt;reader.Close();&lt;br /&gt;response.Close();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8106921365791919927?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8106921365791919927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8106921365791919927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8106921365791919927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8106921365791919927'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/09/http-und-textfile.html' title='http und Textfile'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-7035778679426062927</id><published>2007-02-14T08:05:00.000+01:00</published><updated>2007-09-14T15:53:12.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><title type='text'>Microsoft Expression - Tools for Designer or Developer?</title><content type='html'>Vier neue Produkte aus dem Hause Microsoft warten auf uns Entwickler... oder doch nicht?&lt;br /&gt;&lt;br /&gt;* Microsoft Expression Media (endgültige Version erscheint voraussichtlich Mitte 2007)&lt;br /&gt;Expression Media ist ein Produkt für das Digital Asset Management. Basierend auf der Software iView MediaPro, die im Juni 2006 von Microsoft übernommen wurde, dient es der Katalogisierung und Verarbeitung von Mediendateien wie Grafiken und Videos.&lt;br /&gt;&lt;br /&gt;Ich denke nicht, dass dieses Produkt für Entwickler von Interesse ist.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Microsoft Expression Design (Beta 1 verfügbar, endgültige Version erscheint voraussichtlich Mitte 2007)&lt;br /&gt;Expression Design ist das Bildbearbeitungsprogramm, also der PhotoShop von Microsoft. Das Produkt deckt höchste Anforderungen ab, könnte aber auch einige Entwickler überfordern. Vielleich hält man sich da doch besser ans Paint.NET 3.0 mit dem auch ein Entwickler das gewünschte Resultat erreicht und zudem erst noch der Sourcecode vorliegt (siehe letzte Posts).&lt;br /&gt;&lt;br /&gt;Ich denke nicht, dass dieses Produkt für Entwickler von Interesse ist.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Microsoft Expression Web (bereits verfügbar)&lt;br /&gt;Das aus Microsoft FrontPage hervorgegangene Expression Web ist eine Web-Entwicklungsumgebung die leider nicht alles bietet was man sich wünscht. Ich war total entäuscht von diesem Produkt. Zum Beispiel werden keine Themes und Skins von ASP.NET 2.0 unterstützt aber auch Basics wie ein tabellenloses Layout (mit DIV Tags und CSS) wird nicht unterstützt. Das heisst, der Designer kann's nicht anzeigen und es gibt auch keine Tools, Intellisense, ... um damit zu arbeiten.&lt;br /&gt;&lt;br /&gt;Ich denke nicht, dass dieses Produkt für Entwickler von Interesse ist.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Microsoft Expression Blend (Beta 2 verfügbar, endgültige Version erscheint voraussichtlich Mitte 2007)&lt;br /&gt;Expression Blend ist ein Designwerkzeug für das Erstellen von interaktiven Benutzeroberflächen. Es fungiert als WYSIWYG-Editor für XAML, eine in XML formulierte Sprache zur Beschreibung und Erstellung von Oberflächen der Windows Presentation Foundation (WPF und WPF/E). Vektorgrafiken, Rastergrafiken, 3D-Objekte aus bekannten 3D-Programmen, Videos, Sound und Text lassen sich miteinander vereinen und mit Hilfe einer Zeitleiste animieren.&lt;br /&gt;&lt;br /&gt;Ich denke, dass dieses Produkt bis zu einem bestimmten Punkt auch für Entwickler von Interesse ist. Um alle Möglichkeiten auszuschöpfen, sollte es allerdings in die Hände eines Grafikers gelegt werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-7035778679426062927?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/7035778679426062927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=7035778679426062927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/7035778679426062927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/7035778679426062927'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/02/microsoft-expression-tools-for-designer.html' title='Microsoft Expression - Tools for Designer or Developer?'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-6982723972629860593</id><published>2007-02-07T12:30:00.000+01:00</published><updated>2007-09-14T15:54:46.970+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>UpdatePanel und Validation Controls</title><content type='html'>Natürlich wollen wir alle das UpdatePanel einsetzen. Speziell wenn wir ein oder mehere GridViews auf der Seite haben, die ein Paging, Sorting und Edit bieten.&lt;br /&gt;Gerade im Edit Fall kommen aber sicher die Validator Controls ins Spiel, die aber leider im UpdatePanel nicht funktionieren.&lt;br /&gt;&lt;br /&gt;Das Problem wird gelöst, in dem AJAX-Compatible Validators verwendet werde, die im CTP auch bereits vorhanden waren. Im RTM sind sie aber nicht dabei, sondern ausgelagert in den ASP.NET AJAX January Futures CTP, den man &lt;a href="http://ajax.asp.net/futures/default.aspx?tabid=47"&gt;hier&lt;/a&gt; downloaden kann.&lt;br /&gt;&lt;br /&gt;Wer weder verzichten, noch den CTP einsetzen will, der kann auf den Validater Controls einfach die Property enableclientscript="false" setzen und das Ganze funktioniert. Ein paar Einschränkungen gibt's natürlich. Z.Bsp. showmessagebox="true" auf dem ValidationSummary funktioniert nicht.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-6982723972629860593?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/6982723972629860593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=6982723972629860593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/6982723972629860593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/6982723972629860593'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/02/updatepanel-und-validation-controls.html' title='UpdatePanel und Validation Controls'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-180434569135940596</id><published>2007-02-04T11:02:00.000+01:00</published><updated>2007-09-14T15:55:13.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>GridView and Formating</title><content type='html'>Ich will ein Datum im GridView formatieren und es gibt auch eine entsprechende Property. Einfach? Gar nicht! Den die Property will einfach nicht greifen. Nach langem finde ich den Weg der funktioniert, obwohl mir da noch etwas das Verständnis dafür fehlt.&lt;br /&gt;Die Formatierung greift nur, wenn die Property HTMLEncode auf false gesetzt wird.&lt;br /&gt;&lt;br /&gt;Das funktionierende Beispiel:&lt;br /&gt;&lt;br /&gt;&lt;asp:gridview id="MeetingsGridView" datasourceid="MeetingsObjectDataSource" datakeynames="ID" autogeneratecolumns="False" allowpaging="True" runat="server"&gt;&lt;br /&gt;&lt;columns&gt;&lt;br /&gt;&lt;asp:boundfield headertext="Date" htmlencode="false" dataformatstring="{0:dd. MMM yyyy}" datafield="MeetingDate" sortexpression="MeetingDate"&gt;&lt;/asp:boundfield&gt;&lt;br /&gt;&lt;asp:boundfield headertext="Type" datafield="MeetingType" sortexpression="MeetingType"&gt;&lt;br /&gt;&lt;asp:boundfield headertext="City" datafield="Location" sortexpression="Location"&gt;&lt;br /&gt;&lt;/columns&gt;&lt;br /&gt;&lt;/asp:gridview&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-180434569135940596?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/180434569135940596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=180434569135940596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/180434569135940596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/180434569135940596'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/02/gridview-and-formating.html' title='GridView and Formating'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-3587622901987513516</id><published>2007-02-02T09:30:00.000+01:00</published><updated>2007-09-17T15:06:10.418+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF/E'/><title type='text'>February CTP of WPF/E</title><content type='html'>Der Dezember Release ist bereits abgelaufen, obwohl dieser bis Ende Februar hätte laufen müssen. Macht nichts, den der Februar Release ist bereits &lt;a href="http://go.microsoft.com/fwlink/?linkid=77792&amp;amp;clcid=0x409"&gt;da&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Einige schöne, neue Features sind hinzugekommen. Aber auch einige Änderungen an bestehenden Sachen, so das viele Beispiele nicht mehr laufen.&lt;br /&gt;&lt;br /&gt;Mehr Infos gibt's &lt;a href="http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx"&gt;hier&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-3587622901987513516?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/3587622901987513516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=3587622901987513516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/3587622901987513516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/3587622901987513516'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/02/february-ctp-of-wpfe.html' title='February CTP of WPF/E'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-6842621535723906765</id><published>2007-01-31T07:24:00.000+01:00</published><updated>2008-12-12T09:07:37.906+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><title type='text'>Paint.NET</title><content type='html'>Auch als Software Entwickler ist ein Grafikprogramm immer wieder von nutzen. Nur soll es nicht so teuer und kompliziert sein wie ein PhotoShop und doch etwas mehr Möglichkeiten bieten als ein Paint.&lt;br /&gt;&lt;div&gt;Definitiv das richtige Tool für den .NET Entwickler ist Paint.NET. Dies ist nicht etwa Paint in .NET programmiert sondern wirklich ein kleiner aber feiner PhotoShop.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_Y1nsVvKBSOA/RcA3qKIGzDI/AAAAAAAAADE/sCb-P0p-VvA/s1600-h/paintnet.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5026078381557861426" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_Y1nsVvKBSOA/RcA3qKIGzDI/AAAAAAAAADE/sCb-P0p-VvA/s320/paintnet.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;a href="http://www.getpaint.net/download.html"&gt;Hier&lt;/a&gt; geht's zum Produkt. Übrigens, es gibt's sogar den Source Code zum downloaden ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-6842621535723906765?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/6842621535723906765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=6842621535723906765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/6842621535723906765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/6842621535723906765'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/painnet.html' title='Paint.NET'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Y1nsVvKBSOA/RcA3qKIGzDI/AAAAAAAAADE/sCb-P0p-VvA/s72-c/paintnet.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-230216877347383821</id><published>2007-01-29T10:03:00.000+01:00</published><updated>2007-09-14T15:56:22.159+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Redirecting to another page</title><content type='html'>Um von einer zur anderen Seite navigieren zu können, kennen wir heute die unterschiedlichsten Methoden. Mit ASP.NET werden hauptsächlich vier Arten eingesetzt.&lt;br /&gt;- Hyperlinks&lt;br /&gt;- Browser Redirect&lt;br /&gt;- Server Transfer&lt;br /&gt;- Cross-Page Posting&lt;br /&gt;&lt;br /&gt;Die Vor- und Nachteile werden &lt;a href="http://msdn2.microsoft.com/en-us/library/x3x8t37x(VS.80).aspx"&gt;hier&lt;/a&gt; von Microsoft beschrieben.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Für alle die immer noch eine gewisse Unsicherheit spüren, hier noch ein paar Ergänzungen.&lt;br /&gt;&lt;br /&gt;Sofern von der einen zur anderen Seite keine Daten übertragen werden müssen, sollte der Hyperlink verwendet werden. Ausnahme, wenn man die URL 'verstecken' will.&lt;br /&gt;&lt;br /&gt;Auf das Redirect wird wenn immer möglich verzichtet, da dies einen zusätzlichen Roundtrip bedeutet.&lt;br /&gt;&lt;br /&gt;Wenn Daten ausgetauscht werden müssen, kommen die beiden Möglichkeiten 'Server Transfer' und 'Cross-Page Posting' ins Spiel.&lt;br /&gt;'Cross-Page Posting' ist seit ASP.NET 2.0 möglich und die etwas schönere Variante. Dabei ändert sich die Browserfunktionalität nicht, jedoch muss das Ziel fix verdrahtet werden.&lt;br /&gt;Beim 'Server Transfer' ist ein GoBack im Browser nicht möglich, die dynamische Adressierung jedoch kein Problem.&lt;br /&gt;In der Praxis merkt man aber sehr schnell, dass beide Methoden ihre Berechtiging haben und man am Besten fährt, wenn eine Kombination der beiden Möglichkeiten verwendet wird.&lt;br /&gt;&lt;br /&gt;Datenübergabe:&lt;br /&gt;Beim 'Server Transfer' werden die Daten über public Properties übergeben, die auf der aufrufenden Seite implementiert werden. Auf der Zielseite können sie über das Object Context.Handler abgefragt werden.&lt;br /&gt;((PagesClassName)Context.Handler).PropertyName&lt;br /&gt;&lt;br /&gt;Beim 'Cross-Page Posting' können die Felder mit FindControl() ausgelesen werden.&lt;br /&gt;((TextBox)((PagesClassName)PreviousPage).FindControl("MyTextBox")))).Text&lt;br /&gt;&lt;br /&gt;Diese Methode muss verwendet werden da die Controls protected sind. Aus Performance-Gründen (und OO Sicht) sollte auf diese Methode verzichtet werden. Wenn analog dem 'Server Transfer' mit public Properties gearbeitet wird, lassen sich zudem Schwierigkeiten vermeiden, die beim Einsatz von Masterpages und UserControls entstehen und mit einem zwischenschritt über den ContentPlaceholder gelöst werden müssten.&lt;br /&gt;prePage = (PagesClassName)PreviousPage;&lt;br /&gt;ContentPlaceHolder c = (ContentPlaceHolder)prePage .Master.FindControl("ContentPlaceHolder1");&lt;br /&gt;(((TextBox)(c.FindControl("MyTextBox"))).Text&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/x3x8t37x(VS.80).aspx"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-230216877347383821?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/230216877347383821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=230216877347383821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/230216877347383821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/230216877347383821'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/redirecting-to-another-page.html' title='Redirecting to another page'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-4644501450622843542</id><published>2007-01-24T07:56:00.000+01:00</published><updated>2007-09-17T15:06:51.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF/E'/><title type='text'>WPF/E for the real world</title><content type='html'>Ich war sofort begeistert von WPF/E als ich die ersten Beispiel sah. Wenn man aber erst mal einen Tag damit rumgespielt und selber die ersten Demos realister hat kommt plötzlich die Frage: War's das schon?&lt;br /&gt;&lt;br /&gt;Im Moment ja, den wichtige Elemente für eine 'richtige' Anwendung fehlen noch. So gibt's nicht einmal eine Textbox, was die Interaktivität schwierig macht.&lt;br /&gt;Das ist natürlich alles bereits angekündigt, wir müssen uns aber noch etwas in Geduld üben.&lt;br /&gt;&lt;br /&gt;Wer schon mal einen kleinen Vorgeschmack möchte, soll sich &lt;a href="http://blogs.infragistics.com/blogs/tony_lombardo/archive/2006/12/14/629.aspx"&gt;das Beispiel&lt;/a&gt; von Tony anschauen. Nice!&lt;br /&gt;&lt;br /&gt;Stay tuned, more is coming up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-4644501450622843542?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/4644501450622843542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=4644501450622843542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4644501450622843542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4644501450622843542'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/wpfe-for-real-world.html' title='WPF/E for the real world'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-9215200516054766250</id><published>2007-01-23T20:27:00.000+01:00</published><updated>2007-09-17T15:03:50.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET AJAX 1.0 Released</title><content type='html'>Leider reichte es dazumal mit dem Release nicht auf den Projektstart vom Dezember 2006. Das wir ihn jetzt bereits bekommen haben ist aber sehr erfreulich. Dann wollen wir uns mal ans Update machen.&lt;br /&gt;&lt;br /&gt;Den ASP.NET AJAX 1.0 Release gibt's &lt;a href="http://ajax.asp.net/"&gt;hier&lt;/a&gt;. Die Online Doku ist nun auch ganz ordentlich und die Upgrade Whitepaper funktionieren.&lt;br /&gt;&lt;br /&gt;Auch vom ASP.NET AJAX Control Toolkit gibt's am selben Ort einen neuen Release. Wie man im &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/01/23/asp-net-ajax-1-0-released.aspx"&gt;Blog von Scott&lt;/a&gt; sieht, sind ein paar schöne Controls wie der Calendar Extender dazu gekommen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-9215200516054766250?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/9215200516054766250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=9215200516054766250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/9215200516054766250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/9215200516054766250'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/aspnet-ajax-10-released.html' title='ASP.NET AJAX 1.0 Released'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-1777475944249574157</id><published>2007-01-22T15:36:00.000+01:00</published><updated>2007-09-14T15:56:22.160+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Templated Control with Designer Support</title><content type='html'>Für mein aktuelles Projekt benötigten wir eine schön formatierte Box die einen Titel hat. Statt diese auf jeder Seite x-mal mit Table Tags zu bauen und zu formatieren, wollten wir ein eigenes Control verwenden.&lt;br /&gt;&lt;br /&gt;1. Versuch: Erstellen eines einfachen Controls abgeleitet von der Klasse Controls befriedigte unsere Bedürfnisse nur mässig, da zwischen dem Start- und Endtag nur Text verwendet werden konnte. Wir wollten jedoch ASP.NET Controls in der Box platzieren.&lt;br /&gt;&lt;br /&gt;[DefaultProperty("Title"), ToolboxData("&lt;{0}:SimpleBox runat=server&gt;")]&lt;br /&gt;public class SimpleBox : Control&lt;br /&gt;{&lt;br /&gt;private string _title;&lt;br /&gt;&lt;br /&gt;[Bindable(true), Category("Appearance"), DefaultValue("")]&lt;br /&gt;public string Title&lt;br /&gt;{&lt;br /&gt;get { return _title; }&lt;br /&gt;set { _title = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void Render(HtmlTextWriter output)&lt;br /&gt;{&lt;br /&gt;string outputString = string.Empty;&lt;br /&gt;&lt;br /&gt;// generate output (html)&lt;br /&gt;outputString = "&amp;#060;table cellspacing="0" cellpadding="0" border="1"&amp;#062;"&lt;br /&gt;+ " &amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td&amp;#062;" + Title + "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td&amp;#062;";&lt;br /&gt;&lt;br /&gt;// read between the begin and end tag&lt;br /&gt;if ((HasControls()) &amp;&amp;amp; (Controls[0] is LiteralControl))&lt;br /&gt;{&lt;br /&gt;outputString += ((LiteralControl)Controls[0]).Text;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string outputStringEnd = "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ "&amp;#060;/table&amp;#062;";&lt;br /&gt;&lt;br /&gt;// speak your mind&lt;br /&gt;output.Write(outputString);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Versuch: Erstellen eines Composite Controls&lt;br /&gt;Das war schon besser. Die Controls zwischen Start- und Endtag wurden erkannt und gerendert. Einziges Problem waren die Events der Childcontrols. Diese wurden nicht gefeuert. Könnte man ausprogrammieren, aber...&lt;br /&gt;&lt;br /&gt;[DefaultProperty("Title"), ToolboxData("&lt;{0}:ComposedBox runat=server&gt;")]&lt;br /&gt;public class ComposedBox : Control, INamingContainer&lt;br /&gt;{&lt;br /&gt;private string _title;&lt;br /&gt;&lt;br /&gt;//[Bindable(true), Category("Appearance"), DefaultValue("")]&lt;br /&gt;public string Title&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;return _title;&lt;br /&gt;}&lt;br /&gt;set&lt;br /&gt;{&lt;br /&gt;_title = value;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void CreateChildControls()&lt;br /&gt;{&lt;br /&gt;string outputStringStart = "&amp;#060;table cellspacing="0" cellpadding="0" border="1"&amp;#062;"&lt;br /&gt;+ " &amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td&amp;#062;" + Title + "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td&amp;#062;";&lt;br /&gt;&lt;br /&gt;string outputStringEnd = "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ "&amp;#060;/table&amp;#062;&lt;br /&gt;";&lt;br /&gt;&lt;br /&gt;this.Controls.AddAt(0, (new LiteralControl(outputStringStart)));&lt;br /&gt;this.Controls.AddAt(this.Controls.Count - 1, (new LiteralControl(outputStringEnd)));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Versuch: Das Templated Control&lt;br /&gt;Hier funktioniert alles auf anhieb, ohne grossen Programmieraufwand. In kurzer Zeit war unser Control erstellt und die formatierte Box stand zur Verfügung. In einer überarbeiteten Variante integrierten wir dann auch noch den fehlenden Designer Support. Great!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class BoxTemplate : CompositeControl, INamingContainer&lt;br /&gt;{&lt;br /&gt;private String _message = null;&lt;br /&gt;public BoxTemplate() { }&lt;br /&gt;public BoxTemplate(String message)&lt;br /&gt;{&lt;br /&gt;_message = message;&lt;br /&gt;}&lt;br /&gt;public String Message&lt;br /&gt;{&lt;br /&gt;get { return _message; }&lt;br /&gt;set { _message = value; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[DefaultProperty("Title"),&lt;br /&gt;ParseChildren(true), PersistChildren(false),&lt;br /&gt;Designer("CSBS.TVCITTool.Client.Web.Controls.TemplatedBoxControlDesigner, CSBS.TVCITTool.Client.Web.Controls"),&lt;br /&gt;ToolboxData("&lt;{0}:TemplatedBox runat=server&gt;")]&lt;br /&gt;public class TemplatedBox : CompositeControl, INamingContainer&lt;br /&gt;{&lt;br /&gt;private string _title;&lt;br /&gt;private ITemplate _messageTemplate = null;&lt;br /&gt;private String _message = null;&lt;br /&gt;&lt;br /&gt;public String Message&lt;br /&gt;{&lt;br /&gt;get { return _message; }&lt;br /&gt;set { _message = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[Bindable(true), Category("Appearance"), DefaultValue("")]&lt;br /&gt;public string Title&lt;br /&gt;{&lt;br /&gt;get { return _title; }&lt;br /&gt;set { _title = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue(null), TemplateContainer(typeof(BoxTemplate)),&lt;br /&gt;TemplateInstance(TemplateInstance.Single), Browsable(false)]&lt;br /&gt;public ITemplate MessageTemplate&lt;br /&gt;{&lt;br /&gt;get { return _messageTemplate; }&lt;br /&gt;set { _messageTemplate = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override void DataBind()&lt;br /&gt;{&lt;br /&gt;EnsureChildControls();&lt;br /&gt;base.DataBind();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void CreateChildControls()&lt;br /&gt;{&lt;br /&gt;// If a template has been specified, use it to create children.&lt;br /&gt;// Otherwise, create a single literalcontrol with message value&lt;br /&gt;&lt;br /&gt;string outputStringStart = "&lt;br /&gt;&amp;#060;table class="boxframe" cellspacing="'\"&amp;#062;"&lt;br /&gt;+ " &amp;#060;tbody&amp;#062;&amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td class="boxheader"&amp;#062;" + Title + "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;tr&amp;#062;"&lt;br /&gt;+ " &amp;#060;td&amp;#062;";&lt;br /&gt;&lt;br /&gt;string outputStringEnd = "&amp;#060;/td&amp;#062;"&lt;br /&gt;+ " &amp;#060;/tr&amp;#062;"&lt;br /&gt;+ "&amp;#060;/tbody&amp;#062;&amp;#060;/table&amp;#062;&lt;br /&gt;";&lt;br /&gt;&lt;br /&gt;if (MessageTemplate != null)&lt;br /&gt;{&lt;br /&gt;Controls.Clear();&lt;br /&gt;BoxTemplate i = new BoxTemplate(this.Message);&lt;br /&gt;MessageTemplate.InstantiateIn(i);&lt;br /&gt;Controls.Add(i);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;this.Controls.Add(new LiteralControl(this.Message));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;this.Controls.AddAt(0, (new LiteralControl(outputStringStart)));&lt;br /&gt;this.Controls.AddAt(this.Controls.Count, (new LiteralControl(outputStringEnd)));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class TemplatedBoxControlDesigner : CompositeControlDesigner&lt;br /&gt;{&lt;br /&gt;private TemplatedBox _designControl;&lt;br /&gt;private TemplateGroupCollection _templateGroupCollection;&lt;br /&gt;&lt;br /&gt;public override void Initialize(System.ComponentModel.IComponent component)&lt;br /&gt;{&lt;br /&gt;base.Initialize(component);&lt;br /&gt;_designControl = (TemplatedBox)component;&lt;br /&gt;SetViewFlags(ViewFlags.DesignTimeHtmlRequiresLoadComplete, true);&lt;br /&gt;SetViewFlags(ViewFlags.TemplateEditing, true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override TemplateGroupCollection TemplateGroups&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;if (_templateGroupCollection == null)&lt;br /&gt;{&lt;br /&gt;_templateGroupCollection = base.TemplateGroups;&lt;br /&gt;TemplateGroup group;&lt;br /&gt;TemplateDefinition templateDefinition;&lt;br /&gt;group = new TemplateGroup("ContextRowTemplates");&lt;br /&gt;templateDefinition = new TemplateDefinition(this, "MessageTemplate", _designControl, "MessageTemplate", false); //der vierte Parameter ist der Name der Property des Control&lt;br /&gt;group.AddTemplateDefinition(templateDefinition);&lt;br /&gt;_templateGroupCollection.Add(group);&lt;br /&gt;}&lt;br /&gt;return _templateGroupCollection;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-1777475944249574157?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/1777475944249574157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=1777475944249574157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1777475944249574157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1777475944249574157'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/templated-control-with-designer-support.html' title='Templated Control with Designer Support'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-1309828478032667393</id><published>2007-01-09T12:25:00.000+01:00</published><updated>2007-09-17T15:03:14.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Learning'/><title type='text'>Passed 70-554</title><content type='html'>I did it again... und bin nun endlich MCPD.&lt;br /&gt;&lt;br /&gt;Hilfen und Links findet ihr in den weiteren Blogs mit dem Label Learning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-1309828478032667393?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/1309828478032667393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=1309828478032667393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1309828478032667393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1309828478032667393'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/passed-70-554.html' title='Passed 70-554'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8321776706460008769</id><published>2007-01-05T08:40:00.000+01:00</published><updated>2007-09-14T15:56:22.161+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF/E'/><category scheme='http://www.blogger.com/atom/ns#' term='TrivadisContent'/><title type='text'>WPF/E Code Samples</title><content type='html'>Es ist noch nicht lange her das wir WPF/E erhalten haben und schon gibt's dutzende Beispiele.&lt;br /&gt;Microsoft hat gleich selber ein Sample Pack erstellt das man &lt;a href="http://www.microsoft.com/downloads/thankyou.aspx?familyId=8AEEBE39-6699-4F4F-9732-CA732E57AE21&amp;displayLang=en"&gt;hier&lt;/a&gt; downloaden kann. Weitere Informationen gibt's auf &lt;a href="http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx"&gt;MSDN WPF/E Dev Center&lt;/a&gt;.&lt;br /&gt;Weitere interessante Beispiele inklusive Source Code findet man im Blog von Mike Harsh &lt;a href="http://blogs.msdn.com/mharsh/default.aspx"&gt;hier&lt;/a&gt; oder &lt;a href="http://richardleggett.co.uk/downloads/wpfe/Tests/Tests/"&gt;hier&lt;/a&gt; von Richard Leggett.&lt;br /&gt;Mein technisches Lieblingsbeispiel kommt von Simon, leider ohne Source Code und befindet sich &lt;a href="http://blogs.interfacett.com/simon/2006/12/13/wpfe-mouse-track.html"&gt;hier&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8321776706460008769?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8321776706460008769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8321776706460008769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8321776706460008769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8321776706460008769'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2007/01/wpfe-code-samples.html' title='WPF/E Code Samples'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8354340018054515447</id><published>2006-12-15T21:25:00.000+01:00</published><updated>2007-09-17T15:07:26.327+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET AJAX 1.0 RC</title><content type='html'>Und gleich noch der RC von ASP.NET AJAX.&lt;br /&gt;Get it &lt;a href="http://ajax.asp.net/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8354340018054515447?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8354340018054515447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8354340018054515447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8354340018054515447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8354340018054515447'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2006/12/aspnet-ajax-10-rc.html' title='ASP.NET AJAX 1.0 RC'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-4573436981943193276</id><published>2006-12-15T16:18:00.000+01:00</published><updated>2007-09-17T15:04:40.926+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Microsoft Visual Studio 2005 Service Pack 1</title><content type='html'>Get it &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=BB4A75AB-E2D4-4C96-B39D-37BAF6B5B1DC&amp;amp;displaylang=en"&gt;here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-4573436981943193276?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/4573436981943193276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=4573436981943193276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4573436981943193276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/4573436981943193276'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2006/12/microsoft-visual-studio-2005-service.html' title='Microsoft Visual Studio 2005 Service Pack 1'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-1971972528898727268</id><published>2006-12-14T09:57:00.000+01:00</published><updated>2007-09-17T15:05:33.535+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF/E'/><title type='text'>WPF/E CTP available</title><content type='html'>Endlich ist WPF/E als Community Technologie Priview verfügbar.&lt;br /&gt;&lt;br /&gt;Damit man eine WPF/E Anwendung im Browser sehen und erleben kann, muss das &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A3E29817-F841-46FC-A1D2-CEDC1ED5C948&amp;amp;displaylang=en"&gt;Browser Plug-In&lt;/a&gt; installiert werden.&lt;br /&gt;&lt;br /&gt;Um eine WPF/E Anwendung zu bauen braucht's das &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=2B01EC7E-C3B8-47CC-B12A-67C30191C3AA&amp;amp;displaylang=en"&gt;WPF/E SDK&lt;/a&gt;. Wie man das WPF/E Project Template ohne 'Web Application Projects' installiert und weitere gute Infos gibt's &lt;a href="http://blogs.conchango.com/johnrayner/archive/2006/12/05/WPF_2F00_E_3A00_-Setting-up-your-workstation.aspx"&gt;hier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Die offizielle Microsoft Dokumentation findet man &lt;a href="http://msdn2.microsoft.com/en-us/library/bb188743.aspx"&gt;hier&lt;/a&gt;. Natürlich haben auch &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/12/04/announcing-the-release-of-the-first-wpf-e-ctp.aspx"&gt;Scott&lt;/a&gt; und &lt;a href="http://blogs.msdn.com/mharsh/default.aspx"&gt;Mike&lt;/a&gt; wie immer gute Posts in ihren Blogs.&lt;br /&gt;&lt;br /&gt;Nun geht's los und wir bauen die erste WPF/E Anwendung. Das Resultat und weitere Infos folgen. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-1971972528898727268?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/1971972528898727268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=1971972528898727268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1971972528898727268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/1971972528898727268'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2006/12/wpfe-ctp-available.html' title='WPF/E CTP available'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8524370478830224617</id><published>2006-11-29T16:16:00.000+01:00</published><updated>2007-09-17T15:08:01.111+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Learning'/><title type='text'>Discount on MCP Certifications</title><content type='html'>Wer sich heute entschliesst seinen MCAD oder MCSD.NET Titel auf die Version .NET 2.0 upzugraden, der kann das mit 25% Rabatt machen. Mehr Infos dazu gibt's &lt;a href="http://www.microsoft.com/learning/mcp/upgrade/default.mspx"&gt;hier&lt;/a&gt; (Achtung, Passport required).&lt;br /&gt;&lt;br /&gt;Wer MCT ist hat übrigens auf allen MCP Prüfungen einen Rabatt von 45%. Mehr dazu unter &lt;a href="https://mcp.microsoft.com/mct/courses_exams/exams_discount.mspx"&gt;https://mcp.microsoft.com/mct/courses_exams/exams_discount.mspx&lt;/a&gt; (Achtung, Passport required).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8524370478830224617?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8524370478830224617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8524370478830224617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8524370478830224617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8524370478830224617'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2006/11/discount-on-mcp-certifications.html' title='Discount on MCP Certifications'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26544185.post-8299839894877115981</id><published>2006-11-14T14:43:00.000+01:00</published><updated>2007-09-17T15:08:33.354+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Visual Studio 2005 SP1</title><content type='html'>Das Service Pack 1 für Visual Studio soll noch dieses Jahr, nämlich im Dezember ausgeliefert werden. Die Beta kann weiterhin bei Microsoft herunter geladen werden.&lt;br /&gt;&lt;br /&gt;Was darf man vom Service Pack erwarten:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Hotfixes and General Distribution Release Updates released between Visual Studio 2005 Release to Market and the end of the Service Pack customer beta period.&lt;/li&gt;&lt;li&gt;Any fixes addressing security issues categorized by the Microsoft Security Response Center as "Critical", "Important" or "Moderate".&lt;/li&gt;&lt;li&gt;Fixes for product reliability and stability issues, including those reported by customers via the Product Feedback Center, and the crashes most frequently reported via Watson.&lt;/li&gt;&lt;li&gt;Fixes for common "eligible" functional issues reported by customers via the Product Feedback Center. "Eligible" functional issues are those that do not require breaking changes, architectural changes, or Design Change Request level feature work and that do not create unacceptable product quality risk and/or cost of implementation.&lt;/li&gt;&lt;li&gt;Fixes for the top customer and supportability issues as reported by Customer Support Services.&lt;/li&gt;&lt;/ul&gt;Weitere Infos gibt's &lt;a href="http://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=3311"&gt;hier&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26544185-8299839894877115981?l=maintrick.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maintrick.blogspot.com/feeds/8299839894877115981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=26544185&amp;postID=8299839894877115981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8299839894877115981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26544185/posts/default/8299839894877115981'/><link rel='alternate' type='text/html' href='http://maintrick.blogspot.com/2006/11/visual-studio-2005-sp1.html' title='Visual Studio 2005 SP1'/><author><name>Jean-Claude Trachsel</name><uri>http://www.blogger.com/profile/02990353533184345161</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05874841801508536307'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>