Windows Mobile

19. April 2009

Ich bin ja kein Freund von Windows Mobile. Meine Erfahrungen waren einfach zu negativ. Eine Benutzerführung, die nicht an den Anwendungsfall (nämlich mobiler Geräte) angepasst ist, und zudem noch ein Hardwaredesign, das jedem Hersteller es erlaubt hat alles zu verschlimmbessern. Nach 3 Geräten mit unterschiedlichen Windows Mobile Versionen habe ich jedenfalls genug von den sogenannten PDAs. Es ist mir zumindest eine Freude zu sehen, wie Apple mit dem iPhone den Markt von hinten aufrollt, und ein Gerät entwickelt hat, das in Design und Funktion Maßstäbe setzt.

Wie dem auch sei. Neulich stand bei uns um die Ecke ein "Windows Mobile" Auto. Irgendwie musste ich ziemlich lachen, denn der Mini Laster spiegelt meine negativen Erfahrungen ziemlich exakt wieder: Altes Design, alte Technologie und weder Fisch noch Fleisch.

Hoffentlich wird Windows Mobile 7 (oder schon 6.5) mal ein Schritt in die richtige Richtung und folgt einer zeitgemäßem Benutzerführung. Dann werde ich auch wieder einen ernsthaften Blick auf das .NET Compact Framework werfen - das hingegen ziemlich genial ist.

 

.NET

ASP.NET Performance von Visual Studio steigern

16. April 2009

Visual Studio verlangt nach schnellen Festplatten. Je schneller, desto besser. Nichts ist allerdings so schnell wie eine RamDisk. Wer glaubt, dass die RamDisk eine Sache aus der alten DOS-Zeit ist, der irrt. Speicher ist billig und 64 Bit Betriebssysteme sind auch schon fast Mainstream (na ja, noch nicht so ganz).

Was liegt also näher, die brach liegenden Megabytes des RAMs als RamDisk zu nutzen. Unter Vista x64 nutze ich die RAMdrive von QSoft, welche sich recht komfortabel über den Gerätemanager einstellen lässt. Zur Zeit nutze ich 1GB als Laufwerksgröße.

Damit nun ASP.NET Projekte diese RamDisk nutzen können, muß in der machine.config das tempDirectory angepasst werden:

<compilation tempDirectory="R:\Temp\aspnet"/>


Details zu diesem Eintrag findet sich bei MSDN.

Weiterhin lassen sich auch das Cache-Verzeichnis vom FireFox oder IE auf die RamDisk legen, um die Performance zu steigern.

.NET, ASP.NET

Neues Blog Online

8. April 2009

Lange Zeit hat sich nichts mehr hier im Blog bzw. auf meiner Seite getan. Das wird sich nun ändern! Zuerst habe ich das Blog nach BlogEngine.NET konvertiert und alle weiteren Seiten innerhalb des Blogs integriert. Wer also weiterhin nach Wetterinfos oder den neusten Fotos von Malte und Jonna Ausschau halten möchte, der muss einfach nur in der oberen Navigationsleiste den entsprechenden Link anwählen. 

Für die Zukunft habe ich einige interessante Themen im Blick, über die ich gerne mehr berichten möchte. Bleibt also dran!

BlogEngine.NET

Visual Studio 2008 und Reporting Services

13. März 2008
Nach dem offiziellen Launch von Visual Studio 2008, habe ich mich auch entschlossen alle aktuellen Projekte nach VS 2008 zu portieren. Versprochen wird ja, dass man nun für .NET 2.0, 3.0 und 3.5 entwickeln kann und dabei lediglich die Solution-Datei unterschiedlich ist (warum auch immer).

Tatsächlich ließen sich die Projekte recht einfach nach VS 2008 portieren: Im Migrationsassistenten tauchten keine Fehler auf ;-) Aber: Die Reporting Services von SQL Server 2005 werden nicht unterstützt! Man kann also diese Projekte nicht in VS 2008 bearbeiten! Somit ist man also immer noch auf VS 2005 angewiesen.

Verstehen kann ich das allerdings nicht, denn VS 2008 lockt ja gerade damit eine Plattform für alle .NET Versionen zu sein. Ausgerechnet bei den Reporting Services leistet sich Microsoft einen nicht nachvollziehbaren Schnitzer...

.NET

Nachtrag zum .NET Usergroup Treffen in HH vom 5.12.2007

6. Dezember 2007

Gestern haben wir uns beim .NET Usergroup Treffen in Hamburg mal wieder der Workflow Foundation gewidmet. Diesmal stand die Praxis im Vordergrund anhand eines Beispiels zur Genehmigung einer Reisekostenabrechnung. Das fertige Beispiel habe ich als Download angefügt.

Hier noch die Infos, die ich nachreichen möchte:

Expense Demo von Microsoft (WF mit WCF Integration)

Buchempfehlung Windows Workflow Foundation (1-904811-21-3)

Reisekosten.zip (16,5 KB)

.NET, Veranstaltungen

Termin fürs Gran Canaria Windsurfcamp

3. November 2007

Alle, die sich für das Windsurfcamp 2008 und 2009 bewerben wollen, und die auch erfolgreich die Aufnahmeprüfung bestanden haben, können sich schon mal die folgenden Termine notieren:

21.06.2008 - 28.06.2008

sowie

18.07.2009 - 25.07.2009

Die max. Anzahl der Teilnehmer ist auf 4 Windsurfer (in Ausnahmefällen 5) beschränkt.

 

Vermischtes

.NET Assemblys in Excel verwenden

28. September 2007

.NET Assemblies in VBA, sprich Excel oder Access zu verwenden hat einen gewissen Charme. Komplexe Businesslogik lässt sich dann an einer Stelle pflegen und verwenden.

Unter http://dsmyth.blogspot.com/2006/03/calling-managed-code-from-vba-using.html gibt es gute Hintergrundinfos, wie ein 'Hello World' zustande kommt. Allerdings bin ich dabei auf Probleme gestossen. Denn wenn man mit Visual Studio 2005 unter .NET 2.0 entwickelt und versucht das mit Excel XP aka Excel 2002 aka Excel 10.0 zum Laufen zu bekommen, erscheint lediglich ein Automatisierungsfehler beim Aufruf der Assembly unter Excel. Dieser Fehler rührt daher, dass Excel 10.0 als Standard die .NET 1.1 Runtime verwendet. Abhilfe ist eine Excel.EXE.config Datei im Installationsverzeichnis von Excel mit folgendem Inhalt:



<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>


Allerdings hat man dann Excel 10.0 komplett auf .NET 2.0 umgestellt. Das kann also noch andere Auswirkungen nach sich ziehen.

Was weiterhin im oben erwähnten Artikel nicht erwähnt wurde, ist das setzen von [assembly: ComVisible(true)]in der AssemblyInfo.cs.

 

.NET

Page Events feuern nicht

24. September 2007

Wieder mal ein Fehler der Kategorie: Aua!

Auf einer ASP.NET Seite sitzt ein Button und nach der Umstellung der Anwendung von .NET 1.1 auf .NET 2.0 feuern die Events der Seite nicht mehr... nach ziemlich langem herumprobieren stellte sich die folgende Zeile im Header als Übeltäter heraus:


<script language="javascript" src="JavaScript/General.js"
type="text/javascript"/>
Nach Umstellen auf


<script language="javascript" src="JavaScript/General.js"
type="text/javascript"></script>

feuerten auch wieder die Events!

Ich bin eigentlich ein Freund der kurzen Schreibweise der Tags, doch hier scheint mehr mal wieder mehr zu sein...

 

ASP.NET

Kommunikation mit UserControls über eine MasterPage in ASP.NET

4. April 2007
Die in ASP.NET 2.0 eingeführte MasterPage erfreut sich zunehmender Beliebtheit. Denn mittels dieser lassen sich Elemente, die auf allen Seiten einer Anwendung gleich sein sollen, einmalig erstellen und verwenden. Damit ist die MasterPage ein Pflichtelement für jede ASP.NET Webanwendung.
Nun stellt sich aber die Frage, wie Controls, die in der MasterPage liegen mit anderen Controls bzw. UserControls auf der jeweiligen Seite (bzw. im ContentPlaceHolder) kommunizieren sollen? Die MasterPage weiss ja noch gar nicht, welche Controls in der Seite enthalten sind. Eine mögliche Lösung möchte ich hier skizzieren:
Bei diesem Beispiel enthält die MasterPage einen Button und eine TextBox. Sobald auf den Button geklickt wird, soll der Text an die UserControls geschickt werden, die sich für diesen Text interessieren. Das Interesse an einem Text lässt sich recht gut über ein Interface definieren:

public interface ITextConsumer
{
    void HandleTextEvent(object sender, TextEventArgs e);
}


Die Nutzinformation, also der Text wird mittels eines Event Arguments übermittelt:

public class TextEventArgs : EventArgs
{
    private string text;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}


Die UserControls, die sich nun für den Text interessieren müssen einfach das Interface ITextCosumer implementieren:

public partial class WebControls_DataControl : System.Web.UI.UserControl, ITextConsumer
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    #region ITextConsumer Member
    public void HandleTextEvent(object sender, TextEventArgs e)
    {
        ' Process the Text. E.g. search in the database etc.
    }
    #endregion
}


In der MasterPage muss nun im Click Ereignis des Buttons die Controls Collections des ContentPlaceHolders durchlaufen werden. Dabei wird jedes Controls auf das Interface ITextCosnumer gecastet. Klappt der Cast, wird der Text über die im Interface definierten Methode übermittelt.

protected void Button1_Click(object sender, EventArgs e)
{
    TextEventArgs text = new TextEventArgs();
    text.Text = this.TextBox1.Text;
       
    foreach (Control cntl in this.ContentPlaceHolder1.Controls)
    {
        ITextConsumer eventConsumer = cntl as ITextConsumer;
        if (eventConsumer != null)
        {
            eventConsumer.HandleTextEvent(this.Page, text);
        }
    }
}


Das war's! Diese Lösung funktionert recht gut mit direkt in den Seiten implementierten UserControls. Enthalten die UserControls selbst noch weitere Controls, die sich für den Text interessieren, muss diese Information evtl. weitergereicht werden (hier auch wieder die Controls Collection durchlaufen).


Development, .NET, ASP.NET

Setzen von Properties in Subversion

22. März 2007

Subversion erlaubt für jede Datei und jedes Verzeichnis im Repository das Setzen von Metadaten bzw. Properties. Über diese Properties werden zum Beispiel der Mime-Type, Ersetzungszeichenfolgen (svn:keywords) oder Ingnore-Patterns definiert.
Damit man nicht immer alle Properties per Hand setzen muß, kann dies automatisch beim Hinzufügen von Dateien zum Repository geschehen. Dazu muß in der lokalen Config-Datei des Subversion-Clients folgende Zeile in der Section [miscellany] auskommentiert werden:

enable-auto-props = yes

Anschliessend lassen sich für beliebige Dateitypen die Auto-Properties in der Section [auto-props] definieren. Beispiel:

*.txt = svn:eol-style=native
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
*.cs = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.aspx = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.ascx = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.sql = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.css = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.skin = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.js = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.doc = svn:needs-lock=*

Dies gilt allerdings nur für Dateien, die sich noch nicht im Repository befinden! Bei schon im Repository vorhandenen Datei muß dies explizit eingestellt werden (über den Eigenschaftendialog):

Subversion