Neues rund um's Thema .Net, Team Foundation Server und SCRUM RSS 2.0
# 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] -

# Friday, August 10, 2007

Die Arbeitsbereiche des Team Foundation Server stellen eine Verknüpfung eines lokalen Verzeichnisses mit einem Pfad in der Quellcode-Verwaltung her. Aus verständlichen Gründen kann ein und das selbe Verzeichnis nicht mehrfach zugeordnet werden. Dies gilt insbesondere für den Fall, dass zwei verschiedene Benutzer auf dem gleichen Rechner das selbe Verzeichnis zuordnen wollen, auch wenn es sich auf den gleichen Pfad in der Quellcode-Verwaltung bezieht. Das ganze macht Sinn. Aber was tun, wenn z.B. der Benutzer A nicht mehr existiert und nun Benutzer B seine Projekte übernehmen soll? Der Rat lautet hier, von Benutzer A alle Arbeitsbereiche löschen, bevor der Benutzer gelöscht wird. Der Rat hilft aber wenig, wenn der Benutzer bereits gelöscht wurde und man dann erst die Probleme feststellt. Oder wenn, wie in meinem Fall, durch einen Umzug auf einen anderen Server der Benutzer neu angelegt wurde und zwar den gleichen Namen hat, aber eine andere SID. Die Anpassung der SIDs in der TFS-Datenbank scheint hier nicht richtig funktioniert zu haben.

Den lokalen Workspace zu löschen ist kein Problem, aber das hilft leider in diesem Fall nicht. Die Arbeitsbereiche sind auch zusätzlich noch auf dem Server gespeichert und dort muss man diesen nun löschen, damit man den mit dem neuen Benutzer neu einrichten kann.

Zunächst der Befehl, mit dem man die Workspaces vom Server anzeigen kann:

tf workspaces /owner:* /server:<TFS-Servername> /format:detailed

Um einen Workspace zu löschen kann nun folgender Befehl verwendet werden:

tf workspace /delete <Workspace-Name>;<Benutzername>  /server:<TFS-Servername>

Es gibt auch noch den Befehl /updateUserName, der hat in meinem Fall aber leider nicht funktioniert.

Friday, August 10, 2007 8:16:46 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server
# Wednesday, August 08, 2007

Will man in einem Infragistics WebGrid ein Control in einer Zelle einer TemplatedColumn ansprechen, dann ist das gar nicht so einfach wie zunächst vermutet. Man muss ein paar Umwege einlegen. So funktionierts aber dann:

protected void UltraWebGrid1_InitializeRow(object sender, Infragistics.WebUI.UltraWebGrid.RowEventArgs e)
{
   
DropDownList ddlUnit = ((DropDownList)((CellItem)((TemplatedColumn)e.Row.Cells.FromKey("Unit").Column).CellItems[e.Row.Index]).Controls[1]);
    ....
}

Statt dem Controls[1] könnte man auch noch ein FindControl() nutzen, das wäre noch etwas eleganter.

Wednesday, August 08, 2007 11:05:43 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Komponenten und Bibliotheken | Tipps und Tricks
# Saturday, July 28, 2007

Scott Guthrie beschreibt ein paar coole neue Features von Visual Studio 2008 in seinem Blog: 

Nice VS 2008 Code Editing Improvements
JavaScript intellisense
CSS style intellisense

Saturday, July 28, 2007 10:14:39 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
VS 2008

Scott Gutherie hat in seinem Blog eine interessante Artikel-Serie zu LINQ to SQL

Data Access Improvements with LINQ to SQL

LINQ to SQL is a built-in OR/M (object relational mapper) in .NET 3.5.  It enables you to model relational databases using a .NET object model.  You can then query the database using LINQ, as well as update/insert/delete data from it.  LINQ to SQL fully supports transactions, views, and stored procedures.  It also provides an easy way to integrate business logic and validation rules into your data model.  Below are some of the articles I've written that explore how to use it:

I'll be adding several more articles to my series above in the weeks ahead.  I think you'll find that LINQ to SQL makes it dramatically easier to build much cleaner data models, and write much cleaner data code.

Saturday, July 28, 2007 4:39:55 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
.Net 3.5 | LINQ | SQL

Die Beta 2 des Visual Studio 2008 (Oracs) sowie des Visual Studio 2008 Team Foundation Server Beta 2 sind jetzt verfügbar.

Visual Studio 2008 Downloads

Saturday, July 28, 2007 4:24:39 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News

Unter C# einen Splash-Screen zu erzeugen ist immer etwas Arbeit.  Dirk Hammann hat eine kleine Komponente erstellt, die das erledigt. Die Komponente ist Freeware und auch als Quellcode verfügbar.

SplashDialog

Saturday, July 28, 2007 4:22:04 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Komponenten und Bibliotheken

Visual Studio 2008 TFS (ehemals Orcas TFS) wird WSS 3.0 von Haus aus unterstützen.  Möchte man die WSS 3.0 auch mit einem Visual Studio 2005 TFS einsetzen, dann hilft diese Anleitung:

TN1501: Configuring Windows SharePoint Services 3.0 on the Visual Studio 2005 Team Foundation Server Application Tier

Saturday, July 28, 2007 3:28:29 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [1] -
Team System Server
# Friday, July 27, 2007

 Auf knapp 200 Seiten haben Kai Gloth und Norbert Eder viele Tipps und Tricks zusammengafasst und diese als PDF-Datei kostenlos bereitgestellt.

.NET Casts - dotnetblogbook

Friday, July 27, 2007 11:40:53 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Thursday, July 26, 2007

Hat man ein typisiertes DataSet und arbeitet darin mit mehreren TableAdaptern, dann stellt sich die Frage, wie Updates auf diesen TableAdaptern in eine Transaktion zusammengefasst werden können. Das Problem dabei ist, dass jeder TableAdapter seine eigene Connection nutzt. Es gibt grundsätzlich zwei Lösungsansätze:

  1. Man verwendet den TransactionScope aus dem System.Transactions-Namespace. Diese Vorgehensweise hat allerdings den Nachteil, dass die verschiedenen Connections nur über eine Distributed Transactions verwaltet werden können. Das ist nicht unbedingt das Nonplusultra was die Performance angeht und eigentlich ja auch mit Kanonen auf Spatzen geschossen, da typischerweise alle TableAdapter ja auf die gleiche Datenbank gehen dürften und damit die Ditributed Transactions etwas überkandidelt sind.
  2. Man verwendet eine Connection für alle TableAdpater. Hierzu gibt es glücklicherweise die Möglichkiet, dass man die Connection der Tableadapter austauschen kann. Man kann z.B. einfach die Connection des ersten TableAdapters allen anderen zuweisen und dann auf dieser Connection mit BeginTransaction eine neue Transaktion beginnen und diese dann mit Commit bzw. RollBack abschließen. Alternativ kann man natürlich auch manuell eine Connection erzeugen und diese dann allen TableAdaptern zuweisen.

Eine sehr schöne Beschreibung dieser Lösungsansätze hat John Waters unter folgendem Link veröffentlicht: ADO.NET : Getting TableAdapters to participate in transactions

Thursday, July 26, 2007 6:05:23 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
ADO.Net | Know-How
# Tuesday, July 24, 2007

Wenn der Team-Explorer behauptet, einen nicht mehr zu kennen und mit folgender Meldung behauptet, man stellt keine bekannte Identität dar,

image

dann kann dieses Problem behoben werden, indem man den Cache des Team-Explorers löscht. Dieser liegt unter Vista im Ordner C:\Users\Thomas\AppData\Local\Microsoft\Team Foundation\1.0\Cache. Hier einfach alle Unterordner löschen und schon klappts wieder mit dem TFS.

Tuesday, July 24, 2007 10:35:46 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Team System Server
# Friday, July 20, 2007

 

Alle Entwickler haben jetzt die Chance attraktive Sachpreise zu gewinnen.

Marco Hagenschulte, Betreiber von www.wsus.de, hat das Gewinnspiel „Tools für WSUS 3.0“ gestartet. Gesucht wird ein nützliches selbst-entwickeltes Werkzeug für die Windows Server Update Services 3.0 (Add-On, Sidebar Gadget, Scripts, usw.).

 

Zum Gewinnspiel

Friday, July 20, 2007 5:33:27 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News
# Wednesday, July 18, 2007

Habe gerade den ersten Praxis-Test mit Microsoft SharedView absolviert. Das hat auf Anhieb geklappt, echt klasse.

image

Das Tool erlaubt es, dass man eine Session einrichtet und die Teilnehmer der Session untereinander ihre Desktops oder auch nur einzelne Anwendungen freigeben können. Dabei können die anderen entweder nur zuschauen oder auch aktiv eingreifen. Das tolle dabei ist, dass für alle Teilnehmer eine einfache Internet-Verbindung genügt, auch für den Session-Initiator.

Ich wollte gerade einen externen Kollegen bei einer Fehlersuche unterstützen. Am Telefon war das aber kaum zu erklären. Wir haben einfach beide SharedView runtergeladen und installiert. Die Verbindung hat auf Anhieb geklappt, obwohl wir beide hinter einer Firewall sitzen. ich konnte mich auf seinen Desktop schalten und diesen bedienen. Das Ganze ist noch nicht sehr schnell, aber es handelt sich dabei ja noch um eine Beta-Version und hoffentlich wird das Release in Punkto Performance noch etwas zulegen. Das einzige, was am Anfang zu etwas Verwirrung geführt hat, war, dass der Kollege mir zwar die Kontrolle über seinen Desktop übertragen hat, die dann aber immer gleich wieder zurücksprang. Wir haben dann aber schnell rausgefunden, dass die Kontrolle wieder zurückgeht, wenn am Freigabe-Rechner die Maus bewegt wird. Wenn man's weiss, eigentlich gar nicht so schlecht.

Ich fand das Ding echt superklasse und wir konnten den Fehler recht schnell beheben. (Sicher schneller als per Telefon und auch schneller als wenn wir erst den remote desktop auf der Firewall hätten freischalten lassen müssen)

Microsoft SharedView Beta

Wednesday, July 18, 2007 11:38:00 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [2] -
Tools

Microsoft Surface ist eine neue revolutionäre Oberfläche, ein Tisch, ein Display, alles in einem und von allem etwas. Jedenfalls ist Microsoft Surface eine gigantische neue Möglichkeit, mit dem Computer zu interagieren, ohne Tastatur, ohne Maus.

Ich hoffe, das Ding wird bald auch in Deutschland irgendwo zu bestaunen sein. Es lohnt sich, schon mal einen Blick auf die schöne neue Welt von morgen zu werfen. 

Microsoft Surface

Wednesday, July 18, 2007 12:02:21 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News
# Tuesday, July 17, 2007

Regionerate ist ein kleines Tool mit dem sich automatisch verschiedene Code-Elemente wie Properties, Methoden, Konstruktoren in separate Regions zusammenfassen lassen. Die entsprechenden Codezeilen werden dabei automatisch in bereits existierende Regions verschoben und hier sortiert. Die Regeln für die Gruppierung lassen sich anpassen.

Ein kleiner Screencast zeigt, was das Tool alles kann.

Damit entfällt nun endlich das lästige manuelle Sortieren der Felder und Properties.

Regionerate

Gefunden bei Dani Meier

Tuesday, July 17, 2007 8:09:00 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Monday, July 16, 2007

Die nächsten Termine der .net Developer-Group Ulm sind:

02.08.2007 - 18:00 Uhr
Thema: LINQ – Language Integrated Query

05.09.2007 - 18:00 Uhr
Thema: Windows Workflow Foundation in ASP.NET

Nähere Details unter www.dotnet-ulm.de

Monday, July 16, 2007 5:46:34 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

Ich werde in nächster Zeit bei einigen Usergroups unterwegs sein und einen Vortrag zum Thema Team Foundation Server halten. Die Termine sind momentan:

24.07.07   .net Developers Group München

25.09.07   bonn-to-code.net

01.10.07   .Net Usergroup Leipzig

31.10.07   .Net Developers Group Stuttgart

Thema: Team Foundation Server in der Praxis

Mit Team Foundation Server bietet Microsoft zusammen mit Visual Studio Team System ein leistungsfähiges System zur Organisation des gesamten Software Lifecycles. Die Key-Features sind:

  • Verwaltung von Funktionsanforderungen, Aufgaben und Fehlern
  • Quellcode-Verwaltung und Branching-Strategien
  • Buildmanagement
  • Überwachung von Projektmetriken und Reporting

Wie diese Funktionen in der Praxis genutzt werden können und ob dies auch von kleinere Teams sinnvoll eingesetzt werden können, beleuchtet dieser Vortrag. Darüber hinaus werden einige Beispielszenarien aus der Praxis live vorgeführt.

Weitere Termine sind in Vorbereitung. Wer noch Interesse an einem Vortragstermin hat, kann sich gerne an mich wenden.

Monday, July 16, 2007 5:29:09 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

Dieser Guide beinhaltet auf 360 Seiten eine Vielzahl von Bestpractices zum Einsatz eines Team Foundation Servers und stellt eine Zusammenstellung der patterns & practice Dokumente zum TFS dar

http://www.codeplex.com/TFSGuide

Monday, July 16, 2007 4:59:58 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Tuesday, July 10, 2007

Markus Alt hat in seinem Blog einen Link zu einem Whitepaper, das die Umsetzung eines Entwicklungsprozesses nach dem V-Modell XT mit Hilfe des Team Foundation Servers beschreibt. Das Dokument ist als PDF und als MSDN-Artikel verfügbar.

Tuesday, July 10, 2007 6:56:36 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Friday, June 29, 2007

Ich nutze von meinem Notebook eine VPN-Verbindung über WLAN. Dabei habe ich immer wieder das Problem, dass die VPN-Verbindung behauptet, ich brauche zuerst eine Internet-Verbindung um die VPN-Verbindung nutzen zu können obwohl die Internet-Verbindung steht.

Inzwischen habe ich rausgefunden, dass das an den Virtal Ethernet Adapter liegt, die VMware auf meinem Rechner installiert haben. Wenn ich diese Adapter disable, dann funktioniert die VPN-Verbindung auf Anhieb.

Friday, June 29, 2007 10:03:03 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [2] -

# Friday, June 22, 2007

In Excel kann man ein Textfeld anlegen und diesem einen variablen Inhalt geben. Hierzu markiert man das Textfeld und gibt in der Formelzeile z.B. einen Verweis auf eine Zelle ein (=A1). In A1 kann nun eine beliebige Formel stehen, z.B. ="Summe: " & SUMME(A2:A20). Möchte man in den text einen Zeilenumbruch einfügen, dann kann man die Funktion ZEICHEN(10) verwenden, also z.B. = "Summe 2006: " & SUMME(A2:A20) & ZEICHEN(10) & "Summe 2007: " & SUMME(B2:B20)

Friday, June 22, 2007 5:22:39 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Excel
# Tuesday, June 19, 2007

CLIP Logo

Seit Anfang Mai bin ich nun CLIP-Mitglied. Leider bin ich im Moment derart im Stress, dass ich erst jetzt dazu komme das hier zu bloggen. Leider leidet unter meiner aktuellen Arbeitsbelastung auch mein Blog, den ich momentan sehr vernachlässige, aber das wird sich hoffentlich bald wieder ändern.

http://www.microsoft.com/germany/community/programme/clip.mspx

Tuesday, June 19, 2007 10:51:23 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News
# Tuesday, June 05, 2007

Gerade hatte ich mal mit den Settings für Winform-Anwendungen etwas rumgespielt und bin dabei darauf gestoßen dass man auch für Klassenbibliotheken eine Settings-Datei anlegen und darin Werte erfassen kann. Die Frage war nun, wie kann ich diese Werte einstellen, wenn ich die Klassenbibliothek in eine Anwendung integriere? Nach einigem Googeln und Testen hier nun meine Ergebnisse:

  1. Die Konfiguration der Anwendung inkl. aller Klassenbibliotheken werden über eine zentrale konfigurationsdatei (app.config bzw. <Anwendungsname>.exe.config) vorgenommen.
  2. Die Konfigurationsparameter der Klassenbibliothek werden in diese zentrale Konfigurationsdatei leider nicht automatisch übertragen.
  3. Werden keine Konfigurationsparameter für die Klassenbibliothek angegeben, behält diese ihre Default-Werte (das sind die, die beim Kompilieren in der app.config der Klassenbibliothek standen). Diese Default-Werte sind in der Settings.Designer.cs hinterlegt und werden in die DLL reinkompiliert.
  4. Man kann diese Default-Werte übersteuern, indem man in der app.config der Anwendung einen zusätzlichen Settings-Block einfügt (im unteren Beispiel der Bereich ClassLibrary1.Properties.Settings). Diesen kopiert man am besten aus der app.config der Klassenbibliothek. Wichtig ist, dass dieser neue Block noch registriert wird. Dies passiert im Bereich <configSections> mit der Zeile.

    <section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

    Sonst erhält man eine Exception, dass die Configuration ungültig ist.

Nun kann man aus der Anwendung heraus auch die Parameter der Klassenbibliothek einstellen. Ich habe das z.B. verwendet um mir die Übergabe von Konfigurationsparametern an die Klassenbibliothek zu ersparen.

Was mir allerdings nicht besonders gut gefällt, ist die Tatsache, dass ich beim hinzufügen von neuen Config-Parametern für die Klassenbibliothek immer daran denken muss, auch in der Anwendung diese hinzuzufügen. Vergesse ich das, erhalte ich zwar keinen Fehler aber es wird einfach mit dem Default-Wert gearbeitet. Das kann manchmal durchaus erwünscht sein, in anderen Fällen ist das aber eher problematisch.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" requirePermission="false" />
            <section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Setting" serializeAs="String">
                <value>abc</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
        <ClassLibrary1.Properties.Settings>
            <setting name="Setting" serializeAs="String">
                <value>zzzz</value>
            </setting>
        </ClassLibrary1.Properties.Settings>
    </applicationSettings>
</configuration>
Tuesday, June 05, 2007 11:10:06 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [2] -
Tipps und Tricks
# Wednesday, May 23, 2007

Wird ein Connection-String in der config-Datei abgelegt, sollte man darin das Kennwort verschlüsseln. Der Connection-String sieht dann ungefähr so aus:

Data Source=MeinServer;Persist Security Info=True;User ID=User1;Password=vM17E6mtBos=;Unicode=True

Wenn man den Connection-String nun verwenden möchte, muss man darin das Passort erst einmal finden, entschlüsseln und dann im Connection-String das verschlüsselte Kennwort mit dem entschlüsselten ersetzen. Zum Entschlüsseln habe ich eine kleine Funktion eingesetzt, die einfach die Funktionen aus dem System.Security.Cryptography-Namespace verwendet. Das Suchen des Passworts mache ich dann mit einem RegEx:

private string Decrypt(string _connectionString)
{
    Regex r = new Regex(@"^.*?Password=(?<Password>[^;]*)(;|$)", RegexOptions.IgnoreCase);
    string encrypted = r.Match(_connectionString).Groups["Password"].Value;
    string decrypted = Decrypt(encrypted, key);
    return _connectionString.Replace(encrypted, decrypted);
}

Nachtrag:

OK, OK, auf dieses Post habe ich zum ersten mal seit ich blogge Kommentare bekommen und das gleich dutzendweise. Leider funktioniert die Bestätigungsfunktion für die Kommentare bei meinem Blog momentan nicht, da muss ich mal schauen.

Die meisten Kommentare bezogen sich darauf, dass man die config-Datei ja auch mit .net Bordmitteln einfach verschlüsseln kann. In meinem Fall war aber der Wunsch im Vordergrund, dass nur das Kennwort verschlüsselt werden sollte. Der Server sollte im ConnectionString frei editierbar sein. Und das ist meines Wissens nach mit den Standardmethoden nicht möglich. Gut, das hätte ich vielleicht im Post etwas klarer rausstellen sollen, aber...

Trotzdem hier als Ergänzung ein paar Links, die aus den Kommentaren, die das Thema Verschlüsselung der config-Datei beschreiben.

http://www.primetime-software.de/rouven.haban/PermaLink,guid,603e3d04-c67e-4837-9f9b-bc9fc3a15b9c.aspx

http://aspnet.4guysfromrolla.com/articles/021506-1.aspx

Hoffe damit sind nun alle zufrieden. Eigentlich ist es schon erstaunlich, dass man auf einen "schlechten" Post Antworten ohne Ende bekommt, auf die normalen oder vielleicht den einen oder anderen guten tut sich da gar nichts. Na ja, vielleicht überlege ich mir einfach in Zukunft hin und wieder Murks zu schreiben, ist doch recht interessant zu sehen, wer so alles meine Posts liest.

Wednesday, May 23, 2007 9:08:34 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Thursday, May 10, 2007

Mit der statischen Codeanalyse in VS kann der Quellcode nach verschiedenen Regeln analysiert werden. Es lassen sich auch eigene Regeln erstellen. Beginnt man damit zu arbeiten, ergibt sich die Frage, wie kann man die benutzerdefinierten Regeln und die Einstellung, welche Regeln verwendet werden sollen auf mehrere Projekte und für mehrere Entwickler anwenden.

Dazu ein paar Überlegungen:

1.)     Benutzerdefinierte Regeln können durch Kopieren der entsprechenden DLL-Dateien auf die einzelnen Rechner verteilt werden. Dies kann z.B. über das Login-Script erledigt werden.

2.)     Die Einstellungen welche Regeln aktiviert sind, sind im Projekt hinterlegt. Über die Quellcodeverwaltung nutzen somit alle Entwickler, die das Projekt bearbeiten, die gleiche Einstellung.

3.)     Um die Einstellungen für neue Projekte zu übernehmen bietet sich die Erstellung einer entsprechenden Projektvorlage an, in der die entsprechenden Einstellungen vorgenommen werden. Wird ein neues Projekt auf dieser Vorlage erstellt, so erbt dieses die Einstellungen aus der Vorlage.

Thursday, May 10, 2007 4:25:26 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Wednesday, May 09, 2007

Gruppierungen in Excel sind eine feine Sache. Möchte man allerdings untenstehendes Beispiel gruppieren, ergibt sich ein Problem.

Die Gruppenzeile soll in diesem Fall oben stehen. Standardmäßig geht Excel aber davon aus, dass die unterste Zeile einer Gruppe bei einer eingeklappten Gruppierung übrig bleibt. Damit sieht dann das Resultat in dem Beispiel so aus, dass die Gruppe gar nicht mehr angezeigt wird:

Es gibt eine Möglichkeit, dies über eine Einstellung zu ändern. In Excel 2003 findet man die Menü Daten / Gruppierung und Gliederung / Einstellungen. In Excel 2007 ist die Einstellung etwas versteckt. Unter Data befindet sich im Bereich Outline rechts unten ein kleines Kästchen.

 

Klickt man darauf, dann öffnet sich ein Fenster, in dem man nun die Option Summary rows below detail abwählen kann.


Damit kann man die Gruppierung nun wie gewünscht einstellen.

Noch ein kleiner Tipp: Mit Shift + Alt + Pfeil rechts kann man die Gruppierung auch per Tastatur für die aktuell markierten Zeilen einstellen. Shift + Alt + Pfeil links hebt die entsprechende Gruppierung auf.

Wednesday, May 09, 2007 2:06:20 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [6] -
Excel
# Monday, April 30, 2007

Das PropertyGrid ist ein sehr hilfreiches Control, mit dem man einfach die Inhalte der Properties einer Klasse an der Oberfläche anzeigen und bearbeiten kann. Ich hatte hierzu schon zwei Posts : Verwendung des Property-Grids, Dateien und Ordner im Property-Grid auswählen

Das Property-Grid stößt allerdings an seine Grenzen, wenn man damit mehrsprachige Umgebungen unterstützen möchte. Die Anzeige im PropertyGrid ist immer direkt vom Namen der Properties abgeleitet und die Description etc. wird über Attribute angegeben, die nicht über Ressource-Files lokalisiert werden können.

Auf Code-Project habe ich ein erweitertes Property-Grid gefunden, das genau dieses Problem beseitigt.

image

Link to PropertyGrid utilities - The Code Project - C# Programming

Danke an Chris für den Link!

Monday, April 30, 2007 10:59:00 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

# Saturday, April 28, 2007

 Wie man mit .net (VB2005) auf das Active Directory zugreift und dort Benutzer ausliest und verwaltet zeigt, der Blog-Beitrag von Armin Stockner.

Link to Armin Stockner : Active Directory with VB2005

Saturday, April 28, 2007 10:16:53 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Know-How

 Lars Keller verweist in seinem Blog-Eintrag auf eine Seite, auf der man verschiedene Poster zu Entwicklerthemen rund um VSTS, WF, ASP.Net und mehr findet. Die Poster können kostenlos als PDF heruntergeladen werden. Als registrierter Benutzer kann man auch auf hochaufgelöste JPEGs und auf Beta-Posters zugreifen. 

Link to Lars Keller ...inspired by .NET - Interessante Entwicklerposter: VSTS, WF, ASP.NET,..

Saturday, April 28, 2007 10:10:55 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks

 Vor allem wenn man mit Services programmiert, hat man oft die Anforderung, dass beim Debuggen mehrere Projekte innerhalb der Solution gestartet werden müssen, z.B. ein Service und ein entsprechender Client. Der manuelle Weg war hier, dass man den Service als Startup-Projekt eingertragen hat, das debuggen startet und dann auf den Client im Solution Explorer mit der rechten Maustaste klickt und dann hier Debug / Start new Instance auswählt.


Es gibt aber auch noch eine elegantere Möglichkeit. Auf der Eigenschaftsseite der Solution (rechte Maustaste / Properties) kann man unter Startup Project auch die Option Multiple startup projects wählen. Hier kann man nun bei mehreren Projekten die Action auf Start bzw. Start without debugging einstellen. Sogar die Startreihenfolge der einzlnen Projekte lässt sich definieren. Damit starten nun die eingestellten Anwendungen auf einmal.

Saturday, April 28, 2007 9:32:27 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks | VS 2005
# Wednesday, April 11, 2007

Will man eine Liste nach XML serialisieren, die über ein Interface definiert ist, dann funktioniert das nicht. Es bleibt hier wohl nur die Möglichkeit, einen eigenen Serialisierer zu schreiben. In meinem Fall konnte ich das umgehen, indem ich auf das Interface verzichtet habe. Sollte jemand hier eine gute Idee haben, dann wäre ich für ein kurzes Feedback dankbar um das zukünftig zu berücksichtigen. Im Moment heißt das für mich, dass beim Serialisieren Interfaces tabu sind.

Ein Beispiel für eine nicht serialisierbare Liste ist z.B.

List<IMyInterface>

Wednesday, April 11, 2007 6:50:22 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Unbearbeitet

Bei der Dotnet Usergroup Bremen wurde das Thema in einem kleinen Artikel ausführlich diskutiert.

Link to DOTnet Usergroup Bremen

Danke an Chris für den Link

Wednesday, April 11, 2007 11:11:25 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Know-How
# Tuesday, April 10, 2007

Eine umfangreiche Sammlung von Videos für die Entwicklung mit ASP.Net finden sich unter dem unten stehenden Link. Dabei wird ein weites Themenfeld abgedeckt. Vom Umstieg von ASP.Net 1.1 auf ASP.Net 2.0, Einstieg in ASP.Net 2.0, ASP.Net AJAX und auch zuküftige Themen wie LINQ, BLINQ etc.

Link to ASP.NET-Videos für jeden Entwickler

Tuesday, April 10, 2007 10:18:30 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Lernen
Tuesday, April 10, 2007 10:08:10 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -

Will man die Kalenderwoche zu einem Datum herausfinden, dann kann man die Funktion GetWeekOfYear nutzen.

CalendarRow.Week = Application.CurrentCulture.Calendar.GetWeekOfYear(CurrentDate, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Diese Funktion hat allerdings einen kleinen Bug. So wird beispielsweise für den 31.12.2007 KW 53 zurückgegeben. Der darauffolgende Tag, ein Dienstag, ist dann allerdings in KW 1. Eigentlich müssten die Tage einer Woche aber immer in der selben KW sein. Abhilfe schafft hier eine kleine Korrektur. Wir haben ja eingestellt, dass unsere Woche am Montag beginnen soll (DayOfWeek.Monday) und dass die Woche immer dann als KW 1 betrachtet werden soll, wenn wenigstens 4 Tage davon im neuen Jahr liegen (System.Globalization.CalendarWeekRule.FirstFourDayWeek). Der Trick ist nun, dass man einfach immer 3 Tage hinzuzählt, wenn das gesuchte Datum zwischen Montag und Mittwoch liegt. Damit wird aus dem Montag Donnerstag, aus Dienstag der Freitag und aus dem Mittwoch ein Samstag. Da der Donnerstag der Tag ist, von dem abhängt, ob die Woche im neuen oder im alten Jahr liegt, haben wir Montag bis Mittwoch einfach nach hinten geschoben, so dass diese auf jeden Fall im neuen Jahr liegen und damit auch korrekterweise die KW 1 ergeben.

CalendarRow.Week = Application.CurrentCulture.Calendar.GetWeekOfYear(CurrentDate.DayOfWeek >= DayOfWeek.Monday && CurrentDate.DayOfWeek <= DayOfWeek.Wednesday?CurrentDate.Add(new TimeSpan(3,0,0,0)):CurrentDate, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Tuesday, April 10, 2007 3:11:59 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
# Monday, April 02, 2007

Microsoft hat DevBiz, Hersteller von TeamPlain übernommen und bietet das Tool nun kostenlos zum Download. TeamPlain ist ein Web-Frontend für den Team Foundation Server. Über das Tool können die meisten Funktionen des Team Foundation Servers über ein einfaches Web-Interface genutzt werden.

Link to Microsoft's Acquisition of devBiz Promises Improved Application Lifecycle Management for Development Organizations: Cross-browser Web access to Microsoft Visual Studio Team System enables greater participation, streamlined collaboration.

TeamPlain kostenloser Download

Monday, April 02, 2007 8:57:05 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
News

Mit diesem kleinen Plugin kann man Code-Ausschnitte direkt aus VS mit dem Windows Live Writer bloggen. Das Plugin übernimmt dabei die komplette Formatierung. Die Farbcodierung von VS bleibt dabei erhalten. 

Link to BlogMyCode VS2005 plugin

Monday, April 02, 2007 7:52:34 PM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tools
# Thursday, March 22, 2007

Ralf Westphal war am 20.03 in Ulm. Von 10:00 bis 17:00 konnten ihn in einer Kaffeehaus-Konsultation Entwickler mit Fragen löchern. Das Angebot wurde rege angenommen.

Sogar die regionale Presse hat über das Ereignis berichtet.

Danach hielt Ralf im Rahmen des Treffens der .net Developer-Group Ulm einen Vortrag zur Komponentenorientierung in der Software-Entwicklung.

Thursday, March 22, 2007 6:43:21 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Wednesday, March 14, 2007

In VS 2005 gibt es eine Vielzahl von nützlichen und hilfreichen Tastenkombinationen, mit denen sich das Arbeiten beschleunigen lässt. Aber wer kennt die schon alle auswendig? Hier gibt es ein Poster, auf dem diese abgebildet sind. 

Visual C# 2005 Keyboard Shortcut Reference Poster

Visual Basic 2005 Keyboard Shortcut Reference Poster

Visual C++ 2005 Keyboard Shortcut Reference Poster

Außerdem gibt es hier einen Code-Snipsel, mit dem man sich die Tastaturkombinationen auch ausgeben lassen kann.

Die Hände auf der Tastatur behalten

Wednesday, March 14, 2007 8:09:21 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks | VS 2005
# Tuesday, March 06, 2007

George Shepherd's Windows Forms FAQ

George Shepherd hat eine Vielzahl von wirklich guten Tipps & Tricks zur Windows- und Web-Programmierung in zwei FAQ-Listen zusammengetragen. Wirklich ein Quell von Anregungen, Problemlösern und Tipps & Tricks. Nicht nur zum Nachschlagen, sondern auch mal zum durchlesen empfohlen. 

Link zu Windows Forms FAQ

Link zu ASP.NET FAQ

Tuesday, March 06, 2007 2:08:15 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Thursday, March 01, 2007

Möchte man die Process Guidance des Team Foundation Server in Papierform verfügbar machen, kann folgendes Tool sehr hilfreich sein. Damit kann die Process Guidance als ein einzelnes HTML-Dokument konvertiert werden.

http://staff.southworks.net/blogs/mariano/archive/2006/01/28/206.aspx  

Thursday, March 01, 2007 10:46:58 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server | Tools
# Saturday, February 24, 2007

Um den Inhalt einer DataRow in eine andere DataRow zu kopieren kann einfach folgende Anweisung verwendet werden:

newRow.ItemArray = (object[])copyRow.ItemArray.Clone();

Saturday, February 24, 2007 2:52:35 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Thursday, February 22, 2007

Am 20. März ist Ralf in Ulm, um eine seiner berühmten Kaffehauskonsultationen im Cafe Bellavista zu geben. Wer sich also schon immer mal mit einem ausgewiesenen Experten in Sachen .net über ein Problem oder eine Idee unterhalten wollte, der kann jetzt die Gelegenheit nutzen - kostenlos! In der entspannten Umgebung eines Cafes lässt sich über vieles angenehmer diskutieren als auf Konferenzen oder sonstigen Veranstaltungen.

Interessenten sollten sich unbedingt vorher bei Ralf per Mail anmelden.

 

 

 

 

Link to One Man Think Tank Gedanken: Kaffeehauskonsultation in Ulm

Thursday, February 22, 2007 2:56:25 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
News
# Wednesday, February 21, 2007

Das PropertyGrid ist ein sehr hilfreiches Control, mit dem man einfach die Inhalte der Properties einer Klasse an der Oberfläche anzeigen und bearbeiten kann. Ich hatte hierzu schon zwei Posts : Verwendung des Property-Grids, Dateien und Ordner im Property-Grid auswählen

Das Property-Grid stößt allerdings an seine Grenzen, wenn man damit mehrsprachige Umgebungen unterstützen möchte. Die Anzeige im PropertyGrid ist immer direkt vom Namen der Properties abgeleitet und die Description etc. wird über Attribute angegeben, die nicht über Ressource-Files lokalisiert werden können.

Auf Code-Project habe ich ein erweitertes Property-Grid gefunden, das genau dieses Problem beseitigt.

Link to PropertyGrid utilities - The Code Project - C# Programming

Danke an Chris für den Link!

Wednesday, February 21, 2007 10:45:04 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Komponenten und Bibliotheken | Tipps und Tricks
# Tuesday, February 20, 2007

In dem folgenden Beispiel wird aus einer Auflistung der Typ der Elemente ermittelt und anschließend eine neue Instanz dieses Typs angelegt. Dann werden die Properties die über DisplayMember und ValueMember übergeben wurden mit Werten befüllt. Damit kann die Liste ergänzt werden, ohne Zugriff auf den Datentyp zu haben. Einzige Voraussetzung ist, dass in der DataSource bereits Elemente vorhanden sind.

foreach (cListEntry item in Items)
{
Type
t = ((IList)dataSource)[0].GetType();
object o = Activator.CreateInstance(t);
if (this.DisplayMember!= null && this.DisplayMember!= "")
   
t.GetProperty(
this.DisplayMember).SetValue(o, item.Text, null);
if (this.ValueMember!= null && this.ValueMember!= "")
    t.GetProperty(
this.ValueMember).SetValue(o, item.Value, null);
}

 

Nachtrag:

Wenn der Typ, von dem eine neue Instanz erzeugt werden soll, keinen parameterlosen Konstruktor hat, funktioniert das obige Beispiel nicht. Abhilfe kann man hier schaffen, indem man einen parameterlosen Konstruktor anlegt und diesen als private deklariert. Dadurch kann ich beim Instanzieren weiterhin sicherstellen, dass Pflichtangaben gemacht werden, weil der parameterlose Konstruktor ja nicht sichtbar ist.

Mit object o = Activator.CreateInstance(t, true); kann nun in obigem Beispiel eine Instanz des Objektes durch Aufruf des privaten parameterlosen Konstruktors erzeugt werden. Hier muss man natürlich jetzt sicherstellen, dass die Pflichtobjekte entsprechend befüllt werden.

Tuesday, February 20, 2007 12:09:50 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Saturday, February 10, 2007

Am Dienstag werde ich auf der VSOne zwei Vorträge halten

13:45 - 14:45  Databinding in WinForms für Fortgeschrittene

Databinding ist mehr als die oft gezeigten Drag&Drop-Beispiele. Vor allem mit Objekten, typisierten DataSets und User Controls eröffnen sich enorme Möglichkeiten. Diese Session fasst die wichtigsten Infos aus jahrelanger Projekterfahrung zusammen.

15:15 - 16:15 Active Sync

Wie bekomme ich Daten vom PC auf mein Mobile Device? Wie kann ich Daten auslesen? Diese Session zeigt, wie dieser Datenaustausch mit Hilfe von Active Sync bewerkstelligt werden kann und sie gibt wertvolle Hinweise, was in der Praxis zu beachten ist.

 

Würde mich freuen, wenn der eine oder andere Leser meines Blogs auch auf der VSOne ist und wir uns mal persönlich kennenlernen.

Saturday, February 10, 2007 2:15:30 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Ich falle immer wieder darauf rein, deshalb jetzt mal zum merken! Das funktioniert nicht:

foreach (DataRow dr in table1.Rows)
    table2.Rows.Add(dr);

Das führt zu einer Fehlermeldung "This row already belongs to another table.". Statt dessen muss das lauten:

foreach (DataRow dr in table1.Rows)
    table2.ImportRow(dr);

Saturday, February 10, 2007 1:55:17 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Thursday, February 08, 2007

Wer Anwendungen für Pocket PCs oder andere mobile Geräte entwickelt oder präsentieren möchte, findet einige hilfreiche Tools im Windows Mobile Developer Power Toys Paket, das kostenlos heruntergeladen werden kann. Unter anderem findet man darin das ActiveSync Remote Display, mit dem man den Bildschirm des PDAs auf dem PC darstellen und den PDA sogar mit der Maus und der Tastatur des PCs steuern kann. 

Link to Download details: Windows Mobile Developer Power Toys

Thursday, February 08, 2007 6:56:19 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools

Wenn man unter Vista den IIS7 installiert hat und dann versucht, von VS 2005 aus auf den lokalen IIS7 zuzugreifen, dann quitiert das VS zunächst mit einem Fehler.

 

Wie man den IIS7 konfigurieren kann, damit man aus VS 2005 darauf zugreifen kann ist in folgendem Blog-Beitrag beschrieben:

Link to Your Websites, Our Passion! : Developing Web Applications on Windows Vista with Visual Studio 2005

Thursday, February 08, 2007 6:44:08 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks | VS 2005
# Saturday, January 27, 2007

Die Workitems von Team System lassen sich ja einfach in Excel abfragen und bearbeiten. Jedoch war ich mit den angeboteten Spalten nicht zufrieden. Man kann zwar über einen entsprechenden Button noch beliebige weitere Spalten abrufen, das aber jedesmal zu tun war dann doch ein wenig nervig. Nach einigem Suchen habe ich dann die Lösung gefunden. Man muss sich einfach eine eigene Query anlegen und dort die gewünschten Spalten definieren. Wenn man nun über diese Query die Workitems in Excel abfragt, kommen genau die Spalten, die in der Query definiert sind.

Saturday, January 27, 2007 9:35:19 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Sunday, January 14, 2007

Mit OleDB lassen sich sehr einfach Excel-Dateien lesen. Man macht sich einen Connectionstring der ungefähr so aussieht:

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ExcelFileName & ";Extended Properties='Excel 8.0;HDR=No;"

Nun kann man eine ganz normale Connection öffnen und wie gewohnt z.B. über ein Select-Statement ein DataSet befüllen.

Dim conn As OleDbConnection = New OleDbConnection(connectionString)
conn.Open()
Dim dt As DataTable = New DataTable()
Dim oleDbDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM [Tabelle1]", conn)
oleDbDataAdapter.Fill(dt)
oleDbDataAdapter.Dispose()
oleDbDataAdapter =
Nothing
conn.Close()

Das Problem ist dabei, wenn in Excel z.B. Integer und Textwerte in einer Spalte gemischt stehen und die Integerwerte dabei überwiegen, wird diese Spalte als Integer angelegt und die Textwerte stehen im Dataset dann als NULL. Das kann man umgehen, wenn man am Connectionstring den Parameter IMEX=1 anhängt. Damit wird ein "ImportMixedTypes"-Mode aktiviert, der gemischte Spalten immer als Text interpretiert.

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Me.tbImportdatei.Text & ";Extended Properties='Excel 8.0;HDR=No;IMEX=1'"

Das Problem bei der ganzen Sache ist nur, dass nun standardmäßig die ersten 8 Zeilen geprüft werden. Sind diese alle Integers, wird die Saplte auch als Integer definiert, auch wenn weiter unten noch Textwerte kommen. Man findet hier an verschiedenen Stellen den Hinweis auf einen weiteren Parameter MaxScanRows. Dieser scheint aber nicht zu funktionieren, wie man auch aus diesem MSDN-Artikel ersehen kann. Statt dessen muss man die Einstellung in der Registry vornehmen, wenn man eine andere Anzahl prüfen möchte. Hierzu passt man im Zweig

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

 

den Parameter TypeGuessRows an. Dieser Wert kann auf 1-16 Zeilen eingestellt werden. Ein Wert von 0 bedeutet dass die ersten 16384 Zeilen geprüft werden, um festzustellen, ob der mixed Mode verwendet werden muss oder ob der Datentyp eindeutig bestimmt werden kann. Dass das eigentlich keine saubere Lösung ist, ist klar. Wer will schon seinen Kunden zumuten, in der Registry rumzupfuschen? Aber es scheint im Moment keine bessere Lösung zu geben.

HDR=No bedeutet im obigen Fall übrigens, dass die Excel-Datei keine Header-Zeile hat.

Sunday, January 14, 2007 4:23:55 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1] -
Excel | Tipps und Tricks
# Friday, January 05, 2007

Team Foundation Sidekicks ist eine Sammlung von Tools, die verschiedene Aufgaben bei Nutzung und Verwaltung von Team Foundation Server erleichtern. Unter anderem wird eine vereinfachte Verwaltung von Labels angeboten:

Link to Team Foundation Sidekicks

Friday, January 05, 2007 2:31:06 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Dieser Artikel beschreibt wie man über ein Add-In Funktionen für den Team Build und die Quellcode-Verwaltung programmieren kann.

Link to Attrice Corporation Team Foundation Sidekicks

Friday, January 05, 2007 2:25:46 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Mit diesem Tool kann man WorkItems von einem Team Projekt in ein anderes verschieben.

Link to Team Foundation Server Work Item Utility: Home

Friday, January 05, 2007 2:12:43 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Lars Keller berichtet über das Tool IEeee, das es ermöglicht, direkt aus dem IE einen Fehlerbericht mit detailierten Informationen als WorkItem im Team System Server anzulegen. Das Tool dürfte vor allem für Tester sehr interesant sein.

Link to IEeee: Home

Friday, January 05, 2007 2:09:27 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Scrum for Team System ist ein kostenloses add-in für Visual Studio Team System, das agile Entwicklungsmethoden nach Scrum unterstützt. 

Link to Scrum for Team System

Friday, January 05, 2007 1:56:04 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server

Um einen Label auf einer WinForm per Code einfach fett zu machen, funktioniert leider folgende Methode nicht:

TitleLbl.Font.Bold = true;

Statt dessen kann man aber folgenden Code verwenden:

TitleLbl.Font = new Font(TitleLbl.Font, FontStyle.Bold);

Friday, January 05, 2007 10:17:40 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Thursday, January 04, 2007

WorkItems für den Team Foundation Server lassen sich einfach per Code erstellen.

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("tfs-test");

WorkItemStore store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));

WorkItemType wiType = store.Projects[0].WorkItemTypes[1];

WorkItem newWI = new WorkItem(wiType);

newWI.Title = "Title";

newWI.Save();

Für den Code müssen noch folgende Namespaces referenziert und eingebunden werden:

using Microsoft.TeamFoundation;

using Microsoft.TeamFoundation.Client;

using Microsoft.TeamFoundation.WorkItemTracking.Client;

Dazu muss das Visual Studio SDK installiert sein.

Zu beachten ist, dass die Angaben für die Eigenschaften des WorkItems sprachspezifisch sind. Auf einem deutschen Server wird folgender Code nicht laufen:

newWI.State = "Active";

Auf dem deutschen Server muss das dann heissen:

newWI.State = "Aktiv";

Unschöner zu lesen, aber dafür sprachunabhängig ist die Verwendung von IDs.

Um übrigens ein Workitem zu lesen, kann folgender Code verwendet werden:

WorkItem newWI2 = store.GetWorkItem(92);

 

Thursday, January 04, 2007 4:40:24 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Team System Server
# Tuesday, January 02, 2007

Möchte man einen enum-Wert an eine ComboBox binden, dann muss man hier einen kleinen Trick anwenden. Ich habe das mal am Beispiel mit dem UltraComboEditor aus der Infragistics-Bibliothek realisiert. Man braucht zunächst einen Parse_Event auf dem Binding:

this.ultraComboEditor1.DataBindings[0].Parse += new ConvertEventHandler(ValueInputEnum_Parse);

Dann kann man in dem Eventhandler den Wert in den Enum konvertieren:

void ValueInputEnum_Parse(object sender, ConvertEventArgs e)
{
   e.Value = Enum.Parse(typeof(ePeriodInterval), e.Value.ToString());
}

 

Tuesday, January 02, 2007 4:09:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Friday, December 29, 2006

Unter .net 1.1 hat man das Problem, dass Panels und andere scrollbaren Controls keinen Event liefern, wenn das Control gescrollt wird. Wie man das beheben kann, beschreibt Rick Brewster hier: http://blogs.msdn.com/rickbrew/archive/2004/06/24/165493.aspx

Bei .net 2.0 besteht das Problem übrigens nicht mehr, hier bringen die Controls den Event auch Eigenschaften über die horizontale und vertikale Bildlaufleiste mit.

Friday, December 29, 2006 6:04:41 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Monday, December 11, 2006

Bereits in der Ausgabe 9 bringt Microsoft das Architecture Journal heraus. Jetzt gibt es das Architectur Journal auch kostenlos als Print-Version. 

Link to Architecture Journal - Registration

Monday, December 11, 2006 10:42:57 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Architektur

Dieser sehr interessante Artikel beschreibt, wie man den Erfolg von Software-Factories mit Visual Studio Team System messen kann.

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

Monday, December 11, 2006 7:17:36 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
.Net und drum rum
# Thursday, December 07, 2006

Microsoft hat im Juli 2006 Winternals übernommen. Die Freeware-Tools, die bisher unter dem Namen Systernals angeboten wurden, sind nun über TechNet frei verfügbar:

http://www.microsoft.com/germany/technet/sysinternals/default.mspx

Die meisten Tools unterstützen inzwischen auch Vista.

Thursday, December 07, 2006 10:22:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Monday, December 04, 2006

In München findet am 13. und 14. Februar 2007 die Entwickler-Konferenz VSOne statt. In 8 Tracks werden sehr interessante Sessions rund um die Software-Entwicklung mit .net angeboten:

- Windows Forms
- Windows Mobile
- Web 2.0
- Advanced Development  (ADC)
- Visual Basic
- SQL Server & BI
- Business Fasttrack
- Tools&Solutions

Ich werde dort zwei Vorträge halten, einen zum Thema Databinding in Winforms, einen zum Datenaustausch mit mobilen Devices über Active Sync.

Nähere Infos unter www.vsone.de

Monday, December 04, 2006 10:56:14 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Tuesday, November 28, 2006

Will man in einem Web-Service Sessions nutzen, so muss der Client Cookies handeln können. Ist der Client eine Web-Applikation, so ist das kein Problem. Bei WinForms muss man da zu einem kleinen Kniff greifen.

Man muss für den Service einen CookieContainer erstellen. Dazu kann man im Client folgenden Code verwenden:

WebService.MyService ws = new WebService.MyService();
ws.CookieContainer = new CookieContainer();

Damit kann dann auch der Windows-Client Cookies handeln.

Tuesday, November 28, 2006 8:19:30 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tipps und Tricks
# Saturday, November 25, 2006

Mit Microsoft Sandcastle lassen sich die XML-Kommentare aus dem Sourcecode in eine Dokumentation konvertieren. Damit lassen sich ohne viel Aufwand Dokumentationen im Stile einer MSDN-Dokumentation erstellen, die sogar in die VS-Hilfe eingebunden werden können. Einen Einstieg bietet das folgende Tutorial von Jonas:

http://www.dotnet-ulm.de/Downloads/20061121/Sandcastle.zip

Saturday, November 25, 2006 12:10:24 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2] -
Tools
# Wednesday, November 22, 2006

Word, Excel und Powerpoint haben in der neuen Version 2007 ein neues Dateiformat, das mit Office 2003 oder Office XP nicht gelesen werden kann. Man kann zwar aus Office 2007 im alten Format speichern, aber es gibt auch noch eine andere Möglichkeit. Das  Microsoft Office Compatibility Pack ermöglicht es, Office 2003 / XP die neuen Formate zu lesen.

Link to Download details: Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 File Formats

Wednesday, November 22, 2006 11:49:25 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

# Saturday, November 18, 2006

Mit dem Power Toys Pack Installer erhält man einen schnellen Überblick über die verfügbaren Power Toys und kann diese direkt installieren.

http://www.codeplex.com/PackInstaller

Saturday, November 18, 2006 2:17:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools

Orcas wird die Erstellung von Anwendungen auf Basis von folgenden Plattformen unterstützen:

  • .net Framework 2.0 (VS 2005)
  • .net Framework 3.0 (Vista)
  • .net Framework 3.5 (Orcas)

http://blogs.msdn.com/msbuild/archive/2006/11/03/msbuild-orcas-and-multi-targeting.aspx

Saturday, November 18, 2006 1:22:30 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
News

Mit dem Update funktionieren die Power Toys nun auch mit nicht englischsprachigen Visul Studios-

http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=fe72608b-2b28-4cc1-9866-ea6f805f45f3

Saturday, November 18, 2006 1:02:23 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Galileo Computing bietet wieder ein neues Openbook an, dieses mal zum Thema Visual Basic 2005

http://www.galileocomputing.de/openbook/visual_basic/

Saturday, November 18, 2006 11:56:46 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Bücher

Albert Weinert beschreibt in einem Blog-Eintrag, wie man ein kleines Control bauen kann, das nach einem Postback die Scroll-Position von DIVs etc. wiederherstellt.

http://der-albert.com/archives/79-guid.html#extended

Saturday, November 18, 2006 11:54:08 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -

Microsoft bietet im Rahmen des Programms Small Busines + für kleine Unternehmen einen kostenlosen Call bei der Hotline für registrierte Teilnehmer an.

http://www.microsoft.com/germany/kleinunternehmen/small-business-plus/anmelden.aspx

Saturday, November 18, 2006 11:49:40 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
News

Sandcastle, das Dokmentations-Tool von Microsoft ist nun in der November CTP zum download verfügbar.

http://www.microsoft.com/downloads/details.aspx?FamilyID=e82ea71d-da89-42ee-a715-696e3a4873b2&DisplayLang=en

Saturday, November 18, 2006 11:39:10 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools

Microsoft hat ein Resource Refactoring Tool rausgebracht, mit dem einfach Strings aus der Anwendung in Resource-Files ausgelagert werden können.

Ein Beispiel mit Screenshots gibts in dem Blog-Beitrag von Alex-

http://blogs.dotnetgerman.com/alexonasp.net/PermaLink,guid,4293f21b-679c-4d12-b3c9-3c2a6d3f3833.aspx

Saturday, November 18, 2006 11:30:32 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Tools
# Thursday, November 16, 2006

Ein gutes Nachschlagewerk für Oracle-Befehle mit vielen Beispielen findet sich unter http://www.psoug.org/library.html

Thursday, November 16, 2006 5:59:24 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
SQL
# Tuesday, November 14, 2006

Bei Microsoft kann man sich kostenlos ein Team System Training herunterladen.

http://www.microsoft.com/downloads/details.aspx?familyid=527E2A17-1DEA-4D0B-9484-6AE43D00E570&displaylang=en

Tuesday, November 14, 2006 9:53:18 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0] -
Lernen
Archive
<October 2007>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
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: 621
This Year: 12
This Month: 1
This Week: 1
Comments: 356
Themes
All Content © 2014, Thomas
DasBlog theme 'Business' created by Christoph De Baene (delarou)