Posts Tagged ‘ C#

Silverlight 1.0 RC 1 released

Jetzt wird´s ernst: Microsoft hat den ersten “Release Candidate” der Adobes-Flash Konkurrenz Silverlight 1.0 veröffentlicht. Wie Steffen Ritter in seinem Blog schreibt, wurden seit der letzten Beta ca. 2000 Bugs behoben und weitere wichtige Features integriert womit die JavaScript-API nun vollständig verfügbar ist.

Entwickler sollten sich allerdings zwingend die Liste der Breaking Changes zu Gemüte führen, da der RC1 nicht mehr 100%ig rückwärts kompatibel zu der letzten Beta-Version ist. Eine schon vorhandene Beta braucht aber nicht entfernt zu werden, dieses erledigt das Setup des RC1 automatisch. Der RC1 kann ab sofort für Windows und Mac heruntergeladen werden:

Der finalen Version von Silverlight 1.0 steht demzufolge nicht mehr viel im Wege. Es bleibt aber spannend, in wie weit die Web-Präsentationstechnik von Microsoft Adobes-Flash den Rang ablaufen kann.

[via Interactive Design & Expression Studio-Blog]

Strings formatieren mit C#

Alex on ASP.NET liefert dazu eine nette Übersicht, die man auch noch lokalisieren kann.

ASP.NET 1. 1 – DefaultButton definieren

In ASP.NET 2.0 gibt es die Methode HtmlForm.DefaultButton, mit der man den DefaultButton eines Formularelements festlegen kann. Sehr nützlich wenn man ein Formular mit mehreren Buttons erstellt hat und der Benutzer durch drücken der ENTER-Taste auf einem Input-Feld eine Aktion auslösen soll wie z.B. verschiedene Suchoptionen. Leider bietet ASP.NET 1.1 keine Funktion dieser Art.

Bei kamp-hansen.dk bin ich auf einen Lösungsansatz gestoßen, der zwar leider in VB und nur für den IE gebaut wurde, aber im Grunde ist der Lösungsweg nicht schlecht. Der “C#-Way” sollte dann in etwas so aussehen:

public void DefaultButton(System.Web.UI.Page Page,
                                  System.Web.UI.WebControls.TextBox objTextControl,
                                  System.Web.UI.WebControls.Button objDefaultButton){

System.Text.StringBuilder sScript = new System.Text.StringBuilder();

sScript.Append("<script language=\"javascript\">");
sScript.Append("function GetKeyCodeIE(btn){");
sScript.Append("    if (event.keyCode == 13)");
sScript.Append("    { ");
sScript.Append("        event.returnValue=false;");
sScript.Append("        event.cancel = true;");
sScript.Append("        btn.click();");
sScript.Append("     } " );
sScript.Append(" } ");

sScript.Append(" function GetKeyCodeRest (Ereignis) { ");
sScript.Append("    if (!Ereignis) ");
sScript.Append("        Ereignis = window.event; ");
sScript.Append("    if (Ereignis.which) { ");
sScript.Append("           Tastencode = Ereignis.which; ");
sScript.Append("    } else if (Ereignis.keyCode) { ");
sScript.Append("           Tastencode = Ereignis.keyCode; ");
sScript.Append("    } ");
sScript.Append("     if (Tastencode == 13)");
sScript.Append("        document.getElementById(‘" + objDefaultButton.ClientID + "’).click();");
sScript.Append("} ");

sScript.Append(" var IE = document.all ? true : false;");
sScript.Append(" if (!IE){");
sScript.Append("   document.onkeydown = GetKeyCodeRest;");
sScript.Append("}");
sScript.Append("</script>");

objTextControl.Attributes.Add("onkeydown",
                                          "GetKeyCodeIE( document.all." + objDefaultButton.ClientID + ")");
Page.RegisterStartupScript("ForceDefaultToScript", sScript.ToString());
}

Der Aufruf erfolgt dann mittels

DefaultButton(Page,txtSearch,btnSearch)

Ok, ganz glücklich bin ich mit dieser Lösung auch nicht – einige werden mir da sicherlich zustimmen – , aber “auf die Schnelle” ein durchaus akzeptabler Ansatz.

Mono 1.1.17 released

mono-logo.pngDie freien Implementierung von Microsofts .NET-Umgebung Mono wurde in der Version 1.1.17 released.

Die neue Version behebt 134 Bugs (gegenüber der Version 1.1.16) und wartet mit diversen neuen Funktion und Implementierungen wie z.B. der Unterstützung von COM-Objekte auf. Noch nicht fertig ist allerdings der neuer Basic-Compiler, der kompatibel zu Microsofts VB 2005 sein soll.

Alle Änderungen sowie Informationen über die behobenen Bugs können wie immer der Release Note entnommen werden.

Phalanger – PHP-Compiler für .NET

Eine neue Version des PHP-Compiler Phalanger wurde auf Codeplex veröffentlicht. Die Version 2.0 Beta 2 soll sich nun auch in Visual Studio 2005 integrieren lassen und aus PHP-Skripten Binaries erzeugt, die in der CLR des .NET-Framework 2.0 laufen können. Die zur Integration des Compilers notwendige Software, ist allerdings noch nicht verfügbar.

Sicher interessant zu sehen, ob der Compiler hält, was er verspricht. Laut den Entwicklern wurde alle in PHP vorhandenen Funktionen für .NET nachgebaut, so das sich PHP-Skripte ohne Änderungen mit Phalanger übersetzen lassen. Ob damit dann auch eine reibungslose Migration von LAMP auf einen ASP.NET-Web-Server möglich ist, bleibt abzuwarten. Da im Moment lediglich PHP4 unterstützt wird, sehe ich zumindest für ein paar meiner Projekte schwarz :)

Für die OpenSource .NET- Variante Mono existiert übrigends ebenfalls ein Compiler dieser Art. Der Informatikstudenten Raphael Romeikat von der Universität Augsburg hat mit PHP4Mono schon vor gut einem 3/4 Jahr einen Compiler entwickelt, mit dessen Hilfe sich PHP-Skripte im MONO (.NET) Framework ausführen lassen.

Charts und Diagramme mit C# erstellen

Wen man mal schnell Charts oder Diagramme in C# (oder C++ bzw. VB) erstellen will, sollte sich mal die Klassenbibliothek ZedGraph anschauen.

Die unter der Lesser General Public License (LGPL) veröffentlichte Bibliothek kann neben Balkendiagrammen oder Liniendiagrammen auch Kreisdiagramme generieren und verfügt über ein UserControl Interface, das Drag&Drop aus dem Forms-Editor von Visual Studio zuläßt.

Ip2Nation – the c# way

Eine IP-Adressen einem Land programmatisch zuzuweisen ist eigentlich nicht schwer. Im Netz finden sich einige freie Datenbanken, aus denen man die notwendigen Informationen abgreifen kann. Auf www.ip2nation.com findet man z.B. einen MySQL Dump sowie diverse Beispielscripte, um eine Abfrage dieser Art in PHP zu bauen.

Mehr oder weniger problematisch wird das ganze allerdings, wenn man versucht eines der Beispiele von ip2nation für C#.NET umzubauen. Zwar lassen sich die etsprechenden Tabelle und Inhalte recht einfach auch in einen MS SQL Server importieren (lediglich der Datentyp der Spalte ip in der Tabelle ip2nation muß in den Datentyp bigint geändert werden). T-SQL verfügt allerdings nicht über eine INET_ATON-Funktion, wie man sie z.B. von MySQL kennt.

Kurz zum Verständnis: INET_ATON ist eine MySQL Funktion, die eine Ganzzahl zurück gibt, welche den numerischen Wert einer Netzwerk-Adresse darstellt.

Für C# benötigen wir daher zunächst mal ein entsprechendes Äquvalent für die INET_ATON Funktion:

private double DotNetINET_ATON(string RealIP)
{
        int x;
        string [] arrIPSplit;
        double num = 0;
        if RealIP == "")
        {
                return 0;
        }
        else
        {
                arrIPSplit = RealIP.Split(‘.’);
                for(x = arrIPSplit.Length - 1; x >= 0 ; x )
                {
                        num += ((int.Parse(arrIPSplit[x])%256) * Math.Pow(256 ,(3 - x )));
                }
                return num;
        }
}

Das SQL Statement kann dann auch schon fast so bleiben wie es im Beispiele von ip2nation angezeigt wird, lediglich das “LIMIT 0,1″ sollte man gegen ein TOP 1 austauschen, da MS SQL diesen Befehl nicht kennt. Im Rahmen einer Stored Procedure würde das Ganze dann etwa so aussehen:

ALTER  PROCEDURE GetNation
(
        @ip bigint = NULL
)
AS

SELECT  TOP 1
        c.country
FROM
        ip2nationCountries c,
        ip2nation i
WHERE
        i.ip < @ip
AND
        c.code = i.country
ORDER BY
        i.ip DESC

Und das war´s eigentlich auch schon. Nun sollte ein einfacher Aufruf DotNetINET_ATON(ip) den numerischen Wert einer Netzwerk-Adresse zurückgeben, die man dann auf die Datenbank bzw. Stored Procedure jagen kann.

Ob der Code richtig arbeitet, kann man übrigends leicht durch die IP 127.0.0.1 feststellen. Hier sollte DotNetINET_ATON als Return-Wert 2130706433 zurückgeben.

AJAX und ASP.NET

Ein durchaus lesenswerter Artikel zum Thema AJAX und ASP.NET Webanwendungen findet sich auf codeproject. Neben einem einfachen Beispiel mit JavaScript und C# diskutiert Alexander Turlov dort auch die Pros und Cons einer solchen Implementierung.

Für alle die noch nicht viel mit AJAX und ASP.NET zu tun hatten, auf jeden Fall ein recht interessanter Beitrag.

PDF-Erstellung mit C#

Tools zum Erstellen von PDF Dateien gibt es für c# zu hauf, in der Regel muss man sie aber für teures Geld von Drittanbietern erstehen. Aber es geht auch kostenlos: Mit iTextSharp findet man auf Sourceforge ein sehr mächtiges Tool zurGenerierung von PDF-Dokumenten in C#.

Das erste PDF-Dokument ist mittels iTextSharp sehr schnell erstellt:

Document document = new Document();
try {
   PdfWriter.getInstance(document, new FileStream(“Chap0101.pdf”, FileMode.Create));
   document.Open();
   document.Add(new Paragraph(“Hello World”));
}
catch(DocumentException de) {
   Console.Error.WriteLine(de.Message);
}
catch(IOException ioe) {
   Console.Error.WriteLine(ioe.Message);
}
document.Close();

Etwas komplizierter (aber nicht unmöglich) wird es, wenn man z.B. Daten aus einer SQL-Tabelle darstellen will. Hierfür bietet das Framework neben einfachen Tabellen das PdfPTable-Object an.

Mit ein wenig Übung und der sehr umfangreichen Tutorial-Sammlung lassen sich so sehr schnell durchaus ansehnliche PDF-Dokumente “on the fly” erstellen.

Objekte mit dynamischen Properties in C#

In Javascript kann man neben der herkömlichen Methode myobject.FirstName auf die Properties eines Objektes auch mittels myobject["FirstName"] zugreifen. “Firstname” kann dabei auch eine Variable sein, was z.B. bei einer localisierten Ausgabe sehr praktisch ist.

var myPropertyName = “Firstname”;
myobject[myPropertyName];

VB kennt ebenfalls eine solche Möglichkeit: myobject.(“FirstName”), bzw. auf das obige Beispiel angewendet: myobject.(myPropertyName).

In C# beißt man sich dagegen allerdings die Zähne aus, versucht man dort dynamisch auf die Properties eines Objektes zuzugreifen, fällt der Debugger auf die Nase. Mit einem kleinen Trick mittels IObjectHelper Members geht´s allerdings doch:

public class myObject
{
   private string Firstname;
   private string property_de;
   private string property_en;

public string Property;
{
   get { return this.firstname; }
   set { this.firstname = value; }
}

public string Property_de;
{
   get { return this.property_de; }
   set { this.property_de = value; }
}

public string Property_en;
{
   get { return this.property_en; }
   set { this.property_en = value; }
}
#region IObjectHelper Members
public object this[string memberName]
{
   get {
      switch (memberName) {
         case “firstname”: return this.firstname;
         case “property_de”: return this.property_de;
         case “property_en”: return this.property_en;
         default: throw new Exception(“Invalid Member”);
}
}
set {
      switch (memberName) {
         case “firstname”: this.firstname = (string) value; break;
         case “property_de”: this.property_de = (string) value; break;
         case “property_en”: this.property_en = (string) value; break;
         default: throw new Exception(“Invalid Member”);
      }
   }
}

Nun kann man auch in C# einfach via myObject["firstname"] zugreifen. Ok, vielleicht noch nichts besonderes, interessant wird es, wenn man z.B. auf ein sprachabhängiges Property zugreifen möchte:

string lang = “de”;
myObject["property_"+lang];

Probiert und gestestet ist das Ganze übrigends unter .Net 1.1. Ob die neue Version 8.0 von C# in .Net 2.0 eine Möglichkeit mitbringt, dynamisch auf Properties zuzugreifen, kann ich IMO nicht sagen.