C# – PrintDialog.ShowDialog() funktioniert nicht

Bin gerade auf ein sehr merkwürdiges Problem gestoßen, dass doch locker eine Stunde wertvolle Lebenszeit gekostet hat.
Folgender Code:

PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == DialogResult.OK)
{
    // do nothing

}

Nichts großes, sollte einfach nur so ein Druckerfenster öffnen, wo der Drucker ausgewählt wird etc. Leider öffnete sich der erhoffte Dialog nicht. Der Debugger läuft dahin, aber er führt den ShowDialog() einfach nicht aus.

Wenn ich die Eigenschaft „UseEXDialog“ auf „true“ setze, funktioniert es.
Jedoch wollte ich nicht den XP-Dialog, sondern den anderen. Auch im Netz fand ich keine wirkliche Lösung.
Da diese Codezeilen aus einem bestehenden Projekt stammen, habe ich kurzerhand neue Projekte in den Frameworks 2.0, 3.5 und 4.0 angelegt. Jeweils mit dem Codeschnippsel oben. Und siehe da, es funktioniert problemlos, in jeder Frameworkversion. Nun die Unterschiede gesucht.

Fündig wurde ich den Projekteigenschaften unter „Build“ bzw. „Erstellen“.
Ich muss dazu sagen, dass die Applikation vorher auf einem anderen Rechner mit einem 32-bit Windows entwickelt wurde. So stand hier unter dem Punkt „Platform target:“ (auf Deutsch vermutlich Zielplattform) „Any CPU“.
Stellt die Anwendung hier auf 32-bit (x86) und der PrintDialog() wird hervorragend funktionieren. x64 oder Any CPU funktioniert nicht.
Auf so etwas muss man erstmal kommen, warum das so ist, keine Ahnung.

So habe ich noch mal in der MSDN nachgeschlagen:

This class may not work on AMD64 microprocessors unless you set the UseEXDialog property to true.

Ich bin zwar nun nicht der technisch versierte Mensch, aber für mich hört sich das nach einem Problem mit einem AMD Prozessor an, ich habe jedoch einen Intel (ich lasse es mir aber dennoch gerne erklären).

Basta! Spring 2010

Mein erster Tag auf der Basta ist rum und ich bin echt erschlagen. Es ist sehr viel Input. Ich habe heute unter anderem zwei Sessions von Oliver Sturm rund um das neue C# 4.0 Feature „dynamic„. Ich fand die Vorträge sehr gut und nun weiß ich auch, dass man „dynamic“ auch zu mehr benutzen kann als Exceldaten zu lesen ;). Eigentlich wollte ich nur die erste Session besuchen, aber Oliver hat es so gut rüber gebracht, da bin ich praktisch gleich sitzen geblieben (in Wirklichkeit war ich Mittag essen).

Leider gab es auch eine Session, wo ich mir doch mehr versprochen habe. Sie hatte den schönen Namen „Nein! – Meinen Code und meine Daten bekommst du nicht“. Es ging darum, wie man den Code (und die Daten) seiner .NET-Anwendung so „verschlüsseln“ kann, dass niemand ran kommt (Stichwort Reflection). Es wurden dabei einige Beispiele und Möglichkeiten mit ihren Vor- und Nachteilen genannt. Die wohl am besten zu nutzende ist eine, bei der der Code der Methoden verschlüsselt wird und zur Laufzeit wieder entschlüsselt wird. Hört sich für mich etwa nach eval() in PHP an. Egal, ein Beispiel wurde leider nicht gezeigt, denn als man ja die beste Möglichkeit präsentiert hatte, wurde gleich das Hauseigene Produkt vorgestellt, dass natürlich genau diese und noch einige andere Features bietet. Schade eigentlich. Ich hätte jetzt keine genaue funktionsweise ihrer kostenpflichtigen Anwendung erwartet, aber so beispielhafte Applikationen wären schon wünschenswert. Ich bin halt naiv.

Morgen geht es weiter. Ich werde morgen mit dem Tipps und Tricks rund um die VS IDE anfangen. Interessant wird auch parallele Entwicklung in .NET 4 und LINQ nach PLINQ. Am Nachmittag werde ich mich über Freeware Security Tools informieren. Und abends gehts dann in die Piano Bar, Casino 🙂

Und heute solls noch Freibier geben, ich muss es nur noch finden :p

Basta 2010

Hier war es die letzten Tage etwas ruhiger. Mir fehlte leider absolut die Lust, etwas zu bloggen. Zudem war ich die komplette letzte Woche krankgeschrieben und habe die Zeit genutzt um TV zu schauen und das Buch „Star Wars – Die Erben des Imperiums“ fertig zu lesen. Echt sehr empfehlenswert. Dieses Buch spielt ein paar Jahre nach dem Tod des Imperators und ist somit die direkte Fortsetzung der Saga.

Joa und nächste Woche geht es zur „Basta Spring 2010“ nach Darmstadt. Dies ist meine erste Veranstaltung dieser Art und von daher kann ich noch gar nicht genau sagen, was mich erwartet. Vermutlich komme ich mir wie ein Möchtegernschauspieler bei der Oscar-Verleihung vor. An mir laufen die „Stars“ der Szene vorbei und ich komme mir so minderwertig vor. Mal sehen, ich denke mal ich twitter vor Ort.

HowTo: App für das Palm Pre erstellen

Leider warte ich noch auf mein Palm Pre, aber da Palm seit einiger Zeit ein SDK für webOS zur Verfügung stellt, hindert mich nichts dran, mich schon mal in der Entwicklung zu versuchen.

Dazu brauchen wir erstmal das Palm Pre SDK. Dabei wird gleich eine virtuelle Maschine per Java Virtual Box mit einem WebOS installiert. Ansonsten wird alles installiert, was ihr braucht, um eine WebOS App zu erstellen. Wenn ihr wollt könnt ihr nun mit jedem beliebigen Texteditor loslegen.
Ich habe mich für Eclipse mit der webOS-Erweiterung entschieden. Du kannst die App von hier aus direkt in der VM starten, was einfacher ist, als die Apps jedes mal per Command-Tool in entsprechende Formate zu konvertieren und in die VM zu portieren.
Wie ihr das ganze installiert, könnt ihr hier nachlesen.

Klickt hier, wenn ihr den Beitrag weiterlesen möchtet

Linq und string.Contains() – Problem

Ich hatte eine kleine Methode, um mir bestimmte Datensätze aus einer Datenbank zu holen. Dazu nutze ich Linq, da es schön einfach ist.

        public IEnumerable<Data> Search(string filter)
        {
            var dataSet = from data in this.bigDataSet
                          where data.Name.Contains(filter)
                          select data;

            return dataSet;
        }

Über die Variable „filter“ wollte ich die Daten eingrenzen. Allerdings sollte es auch möglich sein, sich alle Datensätze anzusehen. In der MSDN zu string.Contains() lautet es:

Rückgabewert
true, wenn der value-Parameter in dieser Zeichenfolge vorkommt oder value eine leere Zeichenfolge („“) ist, andernfalls false.

Heißt für mich, dass ich „filter“ leer lassen kann und so alle Datensätze bekomme. Funktionierte aber nicht. Ich vermute mal, es liegt daran, dass ich Linq-to-Ent verwende. Das Workaround funktioniert aber ganz gut:

        public IEnumerable<Data> Search(string filter)
        {
            var dataSet = from data in this.bigDataSet
                          where (!string.IsNullOrEmpty(filter) ? data.Name.Contains(filter) : true)
                          select data;

            return dataSet;
        }

Vielleicht hat ja jemand genauere Informationen, warum der erste Ansatz nicht funktioniert. Auf Anhieb habe ich nichts gefunden.