.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv November 2007

Silverlight 2.0 und ASP .NET 3.5 Extensions - die Microsoft .NET Web Product Roadmap

29.11.2007 22:57:26 | Mathias Raacke

Scott Guthrie hat in seinem Blog die Roadmap für .NET im Webbereich veröffentlicht. So wird z.B. Silverlight 1.1 wegen der Umfangreichen Neuerungen und Erweiterungen gegenüber 1.0 in Silverlight 2.0 umbenannt. Außerdem gibt es bald wieder eine neue CTP mit vielen Neuerungen, z.B. gibt es endlich viele Standard-Controls, Layout Manager und Databinding.

Außerdem gibt es Informationen zur nächsten Version von ASP.NET, den ASP .NET 3.5 Extensions, die unter anderem das ASP.NET MVC Framework beinhalten werden.

Ausführliche Informationen gibt es direkt bei Scott.

Technorati tags: , ,

Fehler im IE mit <DIV style="overflow:auto"> in Tabellen mit width="100%"

29.11.2007 14:28:56 | Thomas Schissler

Folgende Anforderung: Ich möchte in einer Tabelle, die über die gesamte Bildschirmbreite geht, den Inhalt einer Zelle scrollbar haben.

Mein Ansatz: Ich mache in die Tabellenzelle ein DIV mit Overflow:auto

Problem: Das funktioniert zwar im FireFox, aber nicht im IE. Der IE geht wohl her und schaut sich den Inhalt des DIVs an und macht die Tabelle dann so breit, dass der gesamte Inhalt reinpasst und berücksichtigt dabei nicht, dass das DIV ja auch scrollen könnte. Dieser Effekt tritt auf, wenn das DIV eine prozentuale Breite hat.

Folgender Code verdeutlichd das Problem. Das obere DIV verhällt sich korrekt, da es nicht in eine Tabelle eingebettet ist. Bei den unteren beiden tritt aber das beschriebene Problem auf.

<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ValuePlanner_2008.Web.ProductArea.WebForm1"
%> <html> <head runat="server"> <title>Untitled
Page</title> </head> <body> <form id="form1" runat="server"> <div style="width:
100%; overflow: auto"> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br /> <br /> </div> <script language="javascript" type="text/javascript">
 1:  
 2: function fnRefreshScrollPosition(source)
 3: {
 4: document.getElementById("staticUnits").scrollLeft
= source;
 5: }
 6: 
</script> <div style="width: 100%"> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="staticUnits" style="width: 100%; overflow: auto;"> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br /> <br /> </div> </td> </tr> </table> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="units" style="width: 100%; overflow: auto;" onscroll="fnRefreshScrollPosition(this.scrollLeft);"> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<br /> <br /> </div> </td> </tr> </table> </div> </form> </body> </html>

 

Lösung 1:
Ich kann den DIVs eine feste Breite geben. Aber eigentlich will ich ja, dass der gesamte zur Verfügung stehende Platz genutzt wird und wenn dieser nicht ausreicht gescrollt wird. Um das zu erreichen müsste ich über ein Resitze-Event die Breite der Tabellenzeile ermitteln und diese dann jedesmal auf die DIVs anwenden. Das wird aber schnell sehr hässlich wenn Margins etc. mit berücksichtigt werden müssen.

Lösung 2:
Ich positioniere die DIVs einfach absolut. Dann werden Sie nicht mehr als Inhalt der Tabelle berücksichtigt und die Tabelle erstreckt sich über genau 100% der Breite. Gut nutzen kann man hier den Effekt, dass die Positionsangaben bei absoluter Poistionierung sich immer auf den Container, also in unserem Fall auf die Tabellenzelle beziehen. Ein Stolperstein dabei ist, dass das DIV natürlich auch keinen Einfluss mehr auf die Höhe der Tabellenzelle hat. Diese muss man nun explizit angeben, ich habe da einfach mal 50px vorgegeben. Der Code sieht dann so aus. Hier scrollen nun alle 3 DIVs wie gewünscht.

<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ValuePlanner_2008.Web.ProductArea.WebForm1"
%> <html> <head runat="server"> <title>Untitled
Page</title> </head> <body> <form id="form1" runat="server"> <div style="width:
100%; overflow: auto"> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br /> <br /> </div> <script language="javascript" type="text/javascript">
 1:  
 2: function fnRefreshScrollPosition(source)
 3: {
 4: document.getElementById("staticUnits").scrollLeft
= source;
 5: }
 6: 
</script> <div style="width: 100%"> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="staticUnits" style="width: 100%; overflow: auto; position: absolute"> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<br /> <br /> </div> </td> </tr> </table> <table style="width: 100%"> <tr> <td style="width: 100%; height: 50px;"> <div id="units" style="width: 100%; overflow: auto; position: absolute;" onscroll="fnRefreshScrollPosition(this.scrollLeft);"> cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<br /> <br /> </div> </td> </tr> </table> </div> </form> </body> </html>

Events in ascx-UserControls

28.11.2007 16:04:12 | Thomas Schissler

Events in eigene WebUserControls (.ascx) einzubauen ist im Prinzip ganz einfach:

 1: public event ClickEventHandler
Clicked;
 2: public delegate void ClickEventHandler(object sender,
EventArgs e);
 3: protected virtual void OnClicked(EventArgs
e)
 4: {
 5: if (Clicked
!= null)
 6: Clicked(this,
e);
 7: }


Man deviniert ein Event mit einem Eventhandler-Typ (Zeile1), definiert einen Delegaten für den Eventhandler (Zeile 2) und kann dann eine Methode definieren, die den Event auslöst. Diese Methode ruft man dann auf, wenn das Event ausgelöst werden soll.

Wenn man das UserControl in eine Seite einbaut kann man jetzt im CodeBehind ganz einfach einen Eventhandler auf den Event registrieren und fertig:

this.ucButton.Clicked
+= new ClickEventHandler(ucButton_Clicked);


Auch im Markup kann man den Event angeben, vorausgesetzt man hat den entsprechenden Eventhandler angelegt.

<uc3:ucButton ID="ucButton" runat="server" Text="Gross" ImageURL="~/Images/Status/GreenBox.png" OnClicked="ucButton_Clicked" />

Was bei mir aber nicht funktioniert, ist der Designtime-Support. Bei anderen Controls kann ich die Events im Property-Grid sehen und ich kann per Doppelclick auch einen Standard-Eventhandler einrichten und registrieren. Das geht bei mir nicht. Hat jemand dafür eine Lösung? Wenn ja, dann bitte her damit.

Abstand von Rechts mit CSS

28.11.2007 11:46:03 | Thomas Schissler

Sicher ein alter Hut, aber für mich war's gerade neu und ich finde das echt klasse. Mit CSS kann man Elemente auch mit einem Abstand zum rechten Rand positionieren.

<DIV style="position:absolute; right:20px; top:350px; width:300px; height:150px;"></DIV>

erzeugt ein DIV das immer exakt 20px vom Rechten Rand entfernt ist, auch nach einem Resize des Fensters. Genauc das was ich gerade brauche. Man muss dabei nur beschten, dass right offensichtlich die schwächste Einstellung ist, d.h. wenn left und width ebenfalls angegeben sind, wird right ignoriert. Wenn aber nur zwei der Werte angegeben sind, wird der dritte automatisch ermittelt, also z.B. bei left und right wird die Breite automatisch angepasst. Das selbe funktioniert natürlich auch mit top, bottom und height.

Neu Lizenzbedingungen im TFS 2008 für Remote Zugriff

27.11.2007 22:32:17 | Thomas Schissler

Im TFS 2008 hat Microsoft endlich die Lizenzbedingungen angepasst. Für folgende Aktionen wird nun keine CAL mehr benötigt:

  • Anlegen eines Workitems
  • Anzeigen der Workitems, die ein Benutzer selbst angelegt hat
  • Bearbeiten der Workitems außer Änderung des Status des Workitems

Damit ist es nun endlich möglich, Kunden etc. in das Projekt besser einzubinden, ohne dafür Unsummen für CALs auszugeben.

adamga's WebLog : TFS for Defect Tracking! Licensing Change!!!

Webcasts zu Softwarearchitektur

26.11.2007 12:28:13 | Boas Enkler

Manchmal gibts Zufälle ;)

Gerade letztens noch viel von mir gefragt "Wieso gibt es kaum Webcasts zu Softwarearchitektur" schon sind ebensolche beim MSDN Webcastfinder http://www.microsoft.com/germany/msdn/webcasts/finder/default.mspx zu finden:

- Architekturstrategien - Ohne Strategie geht gar nichts…
- Qualitätseigenschaften und Architekturreviews - Qualität - aber wie "messen" wir sie?
- Generelle Motivation für Softwarearchitektur und Softarearchitekten - Weshalb, wieso, warum…
- Softwareentwicklung mit Patterns - Herr Mustermann läßt grüßen
- Prozessprinzipien - Entwicklungsprozesse im Detail
Viel Spaß beim Schauen!

Daten einer SQL-Datenbank in ein Insert-Script exportieren

23.11.2007 00:11:53 | Thomas Schissler

Bei unserem heutigen Treffen der .Net Developer-Group Ulm hatten wir einen Vortrag zum Thema SQL-Projekte. Dabei kam die Frage auf, ob man Daten einer Datenbank nicht in ein SQL-Skript exportieren kann, das dann alle Daten über Insert-Statements einfügen kann. Ich habe hierzu eine Lösung in Visual Studio 2008 gefunden und das geht so:

1.) Server Explorer öffnen und die entsprechende Verbindung rechts anklicken, dann  "Publish to provider" auswählen.

image

2.) Dann die Datebank auswählen und darunter die Checkbox disablen (außer man will wirklich die Datenbank komplett scripten).

image

3.) Die nächsten Schritte sind dann soweit selbsterklären. In dieser Maske kann man dann auswählen, ob man Daten, Schema oder beides scripten möchte:

image

4. In dem erzeugten Script steht dan z.B. so etwas:

INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], 

       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders', N'Sales Representative',
            N'Obere Str. 57', N'Berlin', NULL, N'12209', N'Germany', N'030-0074321', N'030-0076545') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo', N'Owner',
            N'Avda. de la Constitución 2222', N'México D.F.', NULL, N'05021', N'Mexico', N'(5) 555-4729', N'(5) 555-3745') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'ANTON', N'Antonio Moreno Taquería', N'Antonio Moreno', N'Owner',
            N'Mataderos 2312', N'México D.F.', NULL, N'05023', N'Mexico', N'(5) 555-3932', NULL) INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'AROUT', N'Around the Horn', N'Thomas Hardy', N'Sales Representative', N'120 Hanover Sq.',
            N'London', NULL, N'WA1 1DP', N'UK', N'(171) 555-7788', N'(171) 555-6750') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BERGS', N'Berglunds snabbköp', N'Christina Berglund', N'Order Administrator',
            N'Berguvsvägen 8', N'Luleå', NULL, N'S-958 22', N'Sweden', N'0921-12 34 65', N'0921-12 34 67') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BLAUS', N'Blauer See Delikatessen', N'Hanna Moos', N'Sales Representative',
            N'Forsterstr. 57', N'Mannheim', NULL, N'68306', N'Germany', N'0621-08460', N'0621-08924') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BLONP', N'Blondesddsl père et fils', N'Frédérique Citeaux', N'Marketing Manager',
            N'24, place Kléber', N'Strasbourg', NULL, N'67000', N'France', N'88.60.15.31', N'88.60.15.32') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BOLID', N'Bólido Comidas preparadas', N'Martín Sommer', N'Owner', N'C/ Araquil, 67',
            N'Madrid', NULL, N'28023', N'Spain', N'(91) 555 22 82', N'(91) 555 91 99') INSERT [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address],
       [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (N'BONAP', N'Bon app''', N'Laurence Lebihan', N'Owner', N'12, rue des Bouchers',
            N'Marseille', NULL, N'13008', N'France', N'91.24.45.40', N'91.24.45.41')

Das Script lässt sich dann wunderbar in Datenbankprojekte einbauen und in der Quellcode verwqlten. Dies bietet z.B. eine gute Möglichkeit, um Testdaten für die Durchführung von Tests mit der jeweiligen Anwendungs-Version in der Quellcode-Verwaltung zu verwalten.

In Visual Studio 2005 funktioniert das leider nicht. Dort muss auf entsprechende Tools zurückgegriffen werden, z.B. den kostenlosen Oracle SQL Developer http://www.oracle.com/technology/products/database/sql_developer/index.html der übrigens auch mit SQL-Server funktioniert ;-)

C#-Farben in HTML-Farben umwandeln

21.11.2007 12:31:43 | Thomas Schissler

Das Problem:

Ich habe in C# ein Objekt vom Typ System.Drawing.Color. Dieses möchte ich in einen String-Konvertieren, den ich im HTML verwenden kann. Das funktioniert gut bei benannten Farben wie z.B. "red". Dort kann man Color.Name verwenden. Aber bei nicht benannten Farben liefert dies einen ARGB-Wert mit dem HTML nichts anfangen kann. Dehalb habe ich diese kleine Mthode geschrieben:

private string GetColorString(Color
color) { if (color.ToKnownColor() != 0) return color.Name; else return "#" +
color.Name.Substring(2); }

 

Wenn jemand eine einfachere Lösung weiss, einfach her damit!

Update:

Jürgen hat noch eine viel einfacher Lösung (siehe Kommentar) mit
string htmlcolor = ColorTranslator.ToHtml(Color.Bisque)
Kannte ich bisher noch nicht, aber man lernt ja nie aus!

?? Operator in C#

21.11.2007 09:53:25 | Thomas Schissler

Ein weniger bekannter Operator in C# ist der Operator ??. Damit kann ein Objekt auf null geprüft werden und wenn dies der Fall ist ein Alternativwert verwendet werden. Ein Beispiel kann das verdeutlichen:

 1: object a
= null;
 2: object b
= 5;
 3:  
 4: object c
= a ?? b;

In dem Beispiel gilt c = b. Würde in der Zeile 3 a noch entsprechend inizialisiert, dass dieses nut mehr null ist, dann würde gelten c = a.

Neues .NET 3.5 Feature: Collection Initializers

20.11.2007 20:25:00 | Jürgen Gutsch

Noch mehr Schreibarbeit spart man zusätzlich mit den Collection Initializers, die so ähnlich wie die Object Initialisers aussehen.

So wurden bisher Collections initialisiert:
List<Person> oldList = new List<Person>();
Person p1 = new Person();
p1.Name = "Jürgen Gutsch";
p1.Age = 29;
p1.Address = "www.gutsch-online.de";
oldList.Add(p1);
Person p2 = new Person();
p2.Name = "Max Musterman";
p2.Age = 34;
p2.Address = "mm.domain.com";
oldList.Add(p2);
Person p3 = new Person();
p3.Name = "Susanne Sommer";
p3.Age = 56;
p3.Address = "susi.domain.de";
oldList.Add(p3);
 

So können mit .NET 3.5 Collections initialisiert werden:
List<Person> newList = new List<Person>{
    new Person { 
        Name = "Jürgen Gutsch"
        Age = 29,
        Address = "www.gutsch-online.de" },
    new Person { 
        Name = "Max Musterman"
        Age = 34,
        Address = "mm.domain.com" },
    new Person { 
        Name = "Susanne Sommer"
        Age = 56,
        Address = "susi.domain.de" }
};

Der Compiler macht aus den obigen Zeilen wieder eine herkömmliche Collection Initialisierung:

Weitere Informationen zu den Collection Initializers
http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx
http://blogs.msdn.com/abhinaba/archive/2005/09/17/470358.aspx

Visual Studio 2008 und Vista SP1 Beta

19.11.2007 19:24:06 | Mathias Raacke

Wie man inzwischen in den meisten .NET Blogs lesen kann, hat Microsoft heute Visual Studi 2008 veröffentlicht. VS2008 läuft anscheinend nicht under der Beta des SP1 für Vista. Jedenfalls hatte ich gestern immer Fehlermeldungen beim Setup. Nach der Deinstallationd er SP1 Beta ließ sich VS2008 dann aber installieren.

Visual Studio 2008 - Read to take off !!

19.11.2007 08:16:19 | Boas Enkler

Visual Studio 2008 Express ist da !

Weitere infos gibts unter: http://www.microsoft.com/express/download/

Gleiches gilt für das .NET Framework 3.5
 http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6


Hier noch der Link zu Scott Gu's BLog eintrag http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx

Prio Konferenz & Softwarequalität

18.11.2007 08:19:28 | Boas Enkler

Letzten Dienstag und Mittwoch fand in Baden-Baden die Prioconference (s. www.PrioConference.de) mit dem Thema Softwarequalität statt.

Ich hatte das Glück dort anwesend und somit auch die Vorträge hören zu können.

Interessant ist die Idee der PrioConference. Es geht dort nicht um die reine Verwendung einer Technologie,  wie es zumeist bei anderen Konferenzen der Fall ist. Sondern viel mehr um generelle Themen, welche meinem Gefühl nach beider Alltäglichen Softwareentwicklung zu oft zu kurz kommen.

So findet man Themen wie „Useability Engineering“ , „Von der Idee bis zur Implementierung“ ,“Production Debugging“ oder sogar „Soft Skills“ im Vortragsplan.

Abgerundet wurde das Programm durch Erfahrungsberichte zu Softwarequalität, wie man diese erreicht und hält, von Firmen / Entwicklerteams  wie Vanatec, sharpDevelop usw….

Viele der Sessions wären auch für Entwickler  geeignet gewesen ohne C# oder .NET zu kennen. Das begründet sich in  der Art  der Vorträge, welche sich mehr auf generische Sachverhalte bezogen die auf nahezu alle Entwicklungsumgebunden übertragbar waren.

Trotz des eher Theoretischen Inhalts waren, meinem Gefühl nach, die meisten Themen auf das tägliche Arbeiten übertragbar.  So konnte man einige Impulse und Anregungen für Optimierungen des täglichen Arbeitens mitnehmen.

Insgesamt drängten sich mit in den Tagen nach der Konferenz jedoch einige Frage auf, deren Beantwortung mir nicht leicht fällt.

Je mehr man sich mit Softwarequalität beschäftigt umso mehr kommt man meiner Meinung nach zu dem Schluss, dass Softwarequalität direkte Auswirkungen auf Stabilität, Flexibilität und fotlaufende Entwicklungsdauer für Erweiterungen und Bugfixes hat.

Insofern müsste doch bei jedem Softwareentwickler einer „großen“ Software  doch die Softwarequalität eine besonders große Priorität haben.   Gerade weil uns das .NET Framework immer größere Möglichkeiten bietet (z.bsp. WF & WPF)  werden sich doch die angebotene Software immer weniger durch extra Funktionalität als viel mehr durch Stabilität, Erweiterbarkeit und Usability unterscheiden.

Wann dann die eigene Struktur der Software nicht mehr tragfähig oder Flexibel genug ist ist bleibt die Frage wie man sich von anderen konkurierenden  Produkten  abheben kann.

Ist dann die eigene Anwendung noch Buggy so wird man wohl nicht lange bestehen können.

Im krassen gegensatz dazu steht aber meine Erfahrungen aus dem Internet. So werde ich viel häufiger gefragt wie man X,Y in der .NET Syntax implementieren kann als „Was wären denn logische Strukturen für meine Anwendung“. Schaut man sich die Webcasts beim MSDN Webcast Finder an so findet man hundere Webcasts zu verschiedensten Klassen & Namespaces im .NET Framework aber kaum etwas über Softwarearchitektur oder nur wenig zu Unittests.

MSDN Solve bietet wenigstens ein paar Webcasts zu Software Patterns aber auch das ist wohl eher nur ein Tropfen auf den heißen Stein.

 

Ich frage mich wieso ist das so ? Ist Softwarequalität eine theoretisch tolle und notwendige Sache ,die aber in der Praxis auf Grund Knapper Budgetpläne immer gekürzt wird?  Auch wenn das Bedeutet dass Nachfolgende Entwicklungen immer teurer werden, da die Software nicht stabil oder die Struktur zu inflexibel ist ? z.Bsp. habe ich bis jetzt nur sehr selten von jemanden gehört, der Konsequent Refactoring Pausen durchgezogen hat

 

Wie sind eure Erfahrungen und Meinungen zu dem Thema?

Verknüpfte Abfragen mit LINQ

16.11.2007 17:57:01 | Thomas Schissler

Ich habe bei mir eine Liste die wiederum eine Liste mit Unterobjekten enthält. Ich möchte nun daraus ein Element der Unterliste mit einer bestimmten ID selektieren. Eine klare Sache für LINQ!

Als Leitfaden habe ich auf 101 LINQ Samples mir folgendes Beispiel rausgesucht:

 1: public void Linq15()
{
 2: List
customers = GetCustomerList();
 3:  
 4: var
orders =
 5: from
c in customers,
 6: o in c.Orders
 7: where o.Total
< 500.00M
 8: select new {c.CustomerID,
o.OrderID, o.Total};
 9:  
 10: ObjectDumper.Write(orders);
 11: }

 

Das sieht ganz eifach aus, hat bei mir aber absolut nicht funktioniert. Ich konnte das schon nicht sauber eingeben, da er in Zeile 6 für c keine Intellisense-Unterstützung geboten hat. Das Ganze konnte ich dann lösen, indem ich das etwas umgestellt habe, auf das Beispiel oben übertragen sieht meine Lösung so aus:

 1: public void Linq15()
{
 2: List
customers = GetCustomerList();
 3:  
 4: var
orders =
 5: from
c in customers
 6: from o in c.Orders
 7: where o.Total
< 500.00M
 8: select new {c.CustomerID,
o.OrderID, o.Total};
 9:  
 10: ObjectDumper.Write(orders);
 11: }

 

Ich habe einfach in Zeile 6 statt des Kommas in der vorherigen Zeile nochmals ein from eingebaut. So funktioniert es bei mir nun, wie ich mir das gewünscht habe.

Hilfreiche Kommentare und eindeutige Variablennamen

16.11.2007 13:33:20 | Mathias Raacke

Wenn man an fremdem Code etwas ändern soll, freut man sich doch immer über nützliche Kommentare, die das Programm gut erklären, wie z.B. dieser hier:

public static int gewUebAge = 19; //?

oder

public static int anzahlSozialvericherungsplichtingen = 26427917; //?

Auch sehr nützlich sind selbsterklärende Variablennamen wie diese:

double num1 = axis.Max / axis.Min;
double num2 = scrollMax / num1;

double num3 = scrollMin * Math.Exp((((double) newValue) / 1000) * (Math.Log(num2) - Math.Log(scrollMin)));

(sieht verdächtig danach aus, als wäre ein Teil des Codes aus Reflector kopiert worden)

Normalerweise finde ich solche Codeschnippsel auf dieser Seite, und nicht in irgendwelchen Projekten die ich selbst bearbeiten muss. Naja, zum Glück soll ich an der Anwendung nur eine minimale Korrektur vornehmen...

Technorati tags:

MCP Prüfung zu .NET 3.5 - Windows Communication Foundation

14.11.2007 16:54:18 | Mathias Raacke

Ab sofort kann man sich (wenn man denn den entsprechenden Promotion Code hat) für die Beta Prüfung zu .NET 3.5 - Windows Communication Foundation anmelden. Demnächst folgen dann auch noch weitere Prüfungen, z.B. für WPF und WF.

Mein Prüfungstermin ist nächste Woche Freitag. Das ist endlich mal wieder eine Beta Prüfung die für mich wirklich interessant ist.

Untercontrols bei Web User Controls nach außen geben

13.11.2007 17:53:32 | Thomas Schissler

Damit Ich habe ein Web User Control bei dem ich eine TextBox als Property nach außen geben möchte, damit man die Eigenschaften der Textbox editieren kann. Das kann man durch ein paar Attribute erreichen.

[Browsable(true),
NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), RefreshProperties(RefreshProperties.Repaint)] public TextBox
DropDownTextbox { get { return this.TextBox1;
} set { this.TextBox1 = value;
} }
 
Damit werden auf dem UserControls zusätzliche Properties angelegt und zwar alle Properties einer Textbox mit dem Prefix "DropDownTexbox" also dem Namen des Properties auf dem Control.
 
image
 
Im Markup werden die Properties ganz normal als Attribute eingefügt. Was mich allerdings etwas gewundert hat war, dass ich im Markup über Intellisense die Textbox allerdings auch als separates Tag angeben kann und darauf meine Attribute definiere. Allerding wird das denn im Designer nicht mehr sauber gerendert.

 >

<uc1:WebUserControl1 ID="WebUserControl11" runat="server" DropDownTextBox-BackColor="#FFCC00">
    <DropDownTextbox BackColor="red"></DropDownTextbox>
</uc1:WebUserControl1>

>

Verbesserte MSDN Subscriber Downloads

13.11.2007 17:46:49 | Mathias Raacke

Microsoft arbeitet zurzeit an der Verbesserung der MSDN Subscriber Downloads Webseite. Auf der TechEd haben Henning und ich an einer Usability-Umfrage zu den neuen Entwürfen teilgenommen. Was wir da gesehen haben sieht sehr vielversprechend aus. Es wird z.B. der Navigationsbaum um eine Ebene gekürzt. Statt einem extra Eintrag für jede Edition und jede Sprache eines Produkts gibt es nur noch einen Eintrag, bei dem man dann Sprache und Edition auswählen kann. Außerdem lässt sich auf der gleichen Seite auch direkt ein Key abfragen.

Es gibt auch noch viele weitere kleine Änderungen. Allerdings ist mein Gedächtnis nicht gut genug um mich an alle Details zu erinnern ;).

Die verbesserte MSDN Subscriber Downloads Webseite kommt voraussichtlich Anfang 2008.

Technorati tags: , , ,

Blick auf das nächste Jahr

12.11.2007 10:04:29 | Thomas Schissler

Das alte Jahr ist noch nicht zu Ende undf schon verspricht das neue Jahr ereignisreich zu werden. Im Februar bin ich wieder auf Tour:

13. / 14. Feb. 2008 - VSOne in München
Hier halte ich zwei Vorträge zu XML-Serialisierung und Architektur

19. / 20. Feb. 2008 - Launch Event Microsoft in Frankfurt
Hier bin ich als ATE (Ask the Expert) zum Thema Visual Studio Team System

26. / 27. Feb. 2008 - BASTA! Sprint Edition in Frankfurt
Auf der BASTA! werde ich zwei Vorträge zum Thema TFS halten.

Weitere Details folgen noch. Ich würde mich freuen, den einen oder anderen Leser meines Blogs auf einem dieser Events persönlich kennen zu lernen.

Bilder von der TechEd MCT Party

09.11.2007 15:09:54 | Mathias Raacke

Am Donnerstag Abend gab es dann schon wieder eine Party - dieses Mal für Microsoft Certified Trainer. Die MCT Party hat mir besser gefallen, vor allem deshalb, weil man mit MCTs einfach leichter ins Gespräch kommt und schnell viele neue Leute kennen lernt.

TechEd Barcelona 2007 068

Der Gewinner des Speaker-Idol Wettbewerbs (sowas wie DSDS für technische Vorträge) Jeff (hier in rot) ist auch MCT:

TechEd Barcelona 2007 090

TechEd Barcelona 2007 098

TechEd Barcelona 2007 097

TechEd Barcelona 2007 094

TechEd Barcelona 2007 092

TechEd Barcelona 2007 058

TechEd Barcelona 2007 052

TechEd Barcelona 2007 110

Technorati tags: , , ,

Bilder von der deutschen TechEd Party

09.11.2007 14:53:31 | Mathias Raacke

Am Mittwoch Abend gab es Country-Partys für viele Länder. Dieses Jahr gab's auch eine Deutsche - letztes Mal war ja leider keine. Hier ein paar Bilder der Party:

TechEd Barcelona 2007 085

TechEd Barcelona 2007 075

TechEd Barcelona 2007 102

TechEd Barcelona 2007 122

Technorati tags: ,

Infragistics Chart - Zoom bei Composite Charts

07.11.2007 19:51:22 | Thomas Schissler

Ich hatte gerade ein Aha-Erlebnis der etwas anderen Art. Im Infragistics-Chart gibt es eine Zoom-Funktion für die Achsen. Bei einem Composite-Chart scheint das aber nicht zu funktionieren. Ich habe folgendes im Code stehen:

ChartObj.CompositeChart.ChartAreas[0].Axes[0].

Aber mein Intellisense zeigt kein passendes Property an. Im Forum steht auch die Aussage von einem Infragistics-Mitarbeiter, dass das nicht geht. Wenn ich dann "blind" das vervollständige zu

ChartObj.CompositeChart.ChartAreas[0].Axes[0].ScrollScale.Visible = true;


funktioniert der Code wunderbar! Mal abgesehen davon, dass ich gar nicht wüsste, wie man Properties im Intellisense versteckt aber dennoch verfügbar macht, warum um alles in der Welt haben die Jungs dieses Property nicht öffentlich zugänglich gemacht?

Die ersten zwei Tage auf der TechEd in Barcelona

07.11.2007 01:02:22 | Mathias Raacke

Während der ersten 2 TechEd Tage habe ich inzwischen 3 Leute kennen gelernt, die mich (bzw. mein Blog) schon kannten. Irgendwie ein komisches Gefühl... auf deutschen Konferenzen hätte ich ja mit so etwas gerechnet, aber auf der TechEd eher weniger, vor allem wo einer der drei kein Deutsch konnte und ich ja nur sehr selten auf englisch blogge. Anscheinend wird mein Blog doch häufiger gelesen als ich dachte :).

Heute war auch mein erster Einsatz als ATE am Vista Stand. Davon war ich leider sehr enttäuscht. Nachdem ich nach den ersten zwei Stunden irgendwann "Here you can ask about software development on Windows Vista" auf das Whiteboard an meinem Stand geschrieben hatte gab es keine Fragen mehr. Die Fragen vorher wären nicht gestellt worden, wenn der Satz da schon von Anfang an gestanden hätte. Es gab zwei Fragen zum Suchindex und zwei zu irgendwelchen Netzwerkproblemen. Das ist nun wirklich nicht gerade mein Gebiet - ich bin für das Thema "Vista für Entwickler" hier. Naja, mal schaun ob's morgen und übermorgen besser wird und noch interessantere Fragen gestellt werden.

Abends gab es sowohl eine Student Partners Veranstaltung als auch die Influencers Party. Ich war auf der Influencers Party, das war eine Party für MVPs, MCTs, RDs und andere "Influencer" Gruppen. Eine nette Networkingveranstaltung mit einigen interessanten Gesprächen.

Und hier noch ein paar Bilder von der Keynote gestern:

TechEd Barcelona 2007 033

TechEd Barcelona 2007 042

Ich saß fast in der letzten Reihe, da hat sich der 12fach optische Zoom mal so richtig gelohnt :).

Was gibt's neues? Visual Studio 2008 und .NET 3.5 sollen noch diesen Monat fertig gestellt werden und über die MSDN verfügbar sein. Außerdem gibt es ein neues Synchronisierungsframework, das Microsoft Sync Framework. Einen Teil davon habe ich schon auf der VSone und der BASTA! vorgestellt, die ADO .NET Synchronization Services. Die ADO .NET Sync Services werden als Bestandteil von Visual Studio 2008 veröffentlicht, und sie können verwendet werden, um relationale Datenbanken mit einem lokalen (SQL Server Compact) Client zu synchronisieren. Das Sync Framework ist viel universeller, neben relationalen Daten kann man damit z.B. auch Verzeichnisse oder im prinzip beliebige andere Datenquellen synchronisieren. Genug neues Material für mich, um mindestens einen weiteren Konferenzvortrag und einen Artikel zu füllen.

Die Vorträge sind für mich inzwischen nicht mehr so nützlich und interessant wie früher. In den meisten der Vorträge habe ich nicht mehr viel neues erfahren, da ich mich ja sowieso täglich mit den aktuellen und zukünftigen Technologien rund um .NET beschäftige. Am interessantesten für mich sind da noch ganz neue Produkte wie z.B. das Sync Framework, aber ausgerechnet in einen Vortrag dazu konnte ich nicht mehr rein, da der Raum schon voll war. Naja, wenigstens bekomme ich den Vortrag hinterher als Video auf der TechEd DVD.

Es sind auch sehr viele Student Partner auf der TechEd. Aus Deutschland ist dieses Jahr außer mir aber nur noch ein anderer Student Partner dabei. Dafür habe ich mal wieder die Student Partner aus Österreich getroffen (Blogs: Alex, Christian, Mario).

Vista-Fernsteuerung

05.11.2007 08:22:54 | Thomas Schissler

Das Problem kennt vermutlich fast jeder Notebook-Besitzer der an seinem Arbeitsplatz noch einen zusätzlichen PC hat. Wenn man am Arbeitsplatz sitrzt steht das Notebook entweder nutzlos in der Ecke oder man kommt mit den Mäusen und Tastaturen immer durcheinander. Wäre es nicht schön, das Notebook am Arbeitsplatz zu integrieren. Unter XP hatte ich hier eine geniale Lösung - Maxivista. Damit konnte man sogar eine Zweischirmlösung aufbauen indem das Notebook einfach den Desktop des Arbeitsplatzrechners erweiterte. Absolut klasse, nur funktioniert der Host unter Vista nicht (zumindest nur mit den WDDM-Treibern, was für mich allerdings keine Alternative ist).

Nun habe ich Synergy entdeckt. Dieses Opensource-Tool bitet die Möglichkeit, einen Rechner mit der Maus / Taststur eines zweiten Rechners fernzusteuern. Es unterschiedet sich zu Remote Desktop o. ä., indem es nicht den Bildschirm des PCs auf den Zweit-PC überträgt. Es lässt sich in meinem Szenario damit wunderbar nutzen. Ich habe auf meinem Desktop-PC Visual Studio laufen und kann dann einfach mit der Maus links zum Bildschirmrand rausfahren und schon bin ich auf meinem Notebook und kann damit mit der gleichen Tastatur / Maus z.B. Suchen im Internet, Downloads, E-Mail oder andere Funktionen aufrufen ohne dass mein Desktop-PC damit belastet wird. Das Ganze läuft auch problemlos unter Vista und ist zumindest mal ein brauchbarer Ersatz für MaxiVista.

BE DayAgendaView

04.11.2007 18:58:55 | Boas Enkler


Hier noch ein paar erste Screenshorts der BE des BEDayAgendaViews.
Das Agendaview dient dem darstellen von Terminen in einer Agendaform für einen Tag. Auch hier gilt, wie bei jedem anderne Control, dass Sämtliche visuelle Darstellungen, Datum & String formatierungen, frei einstellbar sind.

Da die BE Component Sammlung nun schon einige Componenten beinhaltet wäre nun auch wieder Platz für ein paar weiter Betatester.

Bei Interesse einfach hier oder bei mir melden


TechEd 2007 Barcelona

02.11.2007 22:16:17 | Mathias Raacke

Morgen fliege ich nach Barcelona zu meiner inzwischen 4. TechEd (ich war 2005 in Amsterdam, 2006 in Barcelona, und dieses Jahr schon auf der TechEd in Orlando). Bezahlen muss ich (wie immer :) ) nichts dafür, dafür muss ich einige Stunden im "Ask the Experts" Bereich arbeiten. Ich werde dort am Stand 55 Fragen zum Thema "Vista für Entwickler" beantworten, und zwar zu folgenden Zeiten:

  • Dienstag 13:00 Uhr - 15:30 Uhr
  • Mittwoch 10:00 Uhr - 13:00 Uhr
  • Donnerstag 13:00 Uhr - 16:00 Uhr

Wahrscheinlich werde ich zwischendurch auch noch am INETA Europe Stand arbeiten. Allerdings will ich dieses Mal auch ein paar Sessions sehen, in Orlando blieb nur Zeit für eine einzige Session in den ganzen 5 Tagen.

Die Abende sind auch schon voll verplant:

  • Sonntag wahrscheinlich INETA Board Dinner
  • Montag INETA Volunteers Dinner Update 03.11. 0:30 Uhr: Bin doch nicht beim INETA Dinner, ich habe gerade eine Schicht am INETA Stand von 19:00 Uhr bis 21:00 Uhr übernommen.
  • Dienstag Influencers Party
  • Mittwoch Country Party
  • Donnerstag MCT Party

Außerdem werde ich noch eine Kamera mitnehmen und versuchen, ein paar Videos für Channel 8 aufzunehmen.

Dieses Mal fliege ich nicht alleine - aus Paderborn ist auch Henning Krause (MVP für Exchange) dabei. Er wird als ATE Fragen zum Thema "Unified Communication" am Stand 1 beantworten.

Jetzt muss ich aber erst mal packen... noch 8 Stunden bis zum Abflug und ich habe mal wieder noch gar nichts eingepackt :).

Technorati tags: , , ,

Beispiel: Webservice über AJAX per JavaScript aurufen

01.11.2007 21:10:45 | Thomas Schissler

Ich habe mir gerade ein kleines Beispiel für den Zugriff auf einen Webservice per JavaScript per AJAX zusammengebaut. Da ich hier einige Informationen aus verschiedenen Quellen zusammengetragen habe, möchte ich das Beispiel hier kurz posten, vielleicht hilft es dem einen oder anderen, einige Informationen gesammelt zu finden.

Hier zunächst der Code für den Webservice:

 1: namespace ValuePlanner_2008.Services
 2: {
 3: ///
<summary>
 4: ///
Summary description for INNProjectExplorerWebService
 5: ///
</summary>
 6: [WebService(Namespace
= "http://tempuri.org/")]
 7: [WebServiceBinding(ConformsTo
= WsiProfiles.BasicProfile1_1)]
 8: [GenerateScriptType(typeof(myData))]
 9: [ToolboxItem(false)]
 10: [ScriptService]
 11: public class INNProjectExplorerWebService
: System.Web.Services.WebService
 12: {
 13: [WebMethod]
 14: [ScriptMethod]
 15: public myData
HelloWorld(int ID)
 16: {
 17: return new myData
{ ID = ID, Text = "Hello World" + ID.ToString()
};
 18: }
 19: }
 20: 
 21: public class myData
 22: {
 23: public int ID
{ get; set; }
 24: public string Text
{ get; set; }
 25: }
 26: }


Kurz zu erwähnen sind hier folgende Details: In Zeile 10 wird über ein entsprechndes Attribut der Webservice für die Zusammenarbeit mit AJAX konfiguriert. Das selbe gilt in Zeile 14 für die Methode, die der Webservicebereitstellt. Da die Methode einen eigenen Datentyp (myData) zurückgibt, wird in Zeile 8 dieser Typ ebenfalls für AJAX veröffentlicht. Man kan so beliebig komplexe Datenstrukturen zwichen JavaScript und dem WebService austauschen, solange diese auf Datentypen basieren, dieJavaScript auch verarbeiten kann (also z.B. keine generischen Listen etc.). Der restliche Code wird automatisch über das Webservice Template erzeugt bzw. sollte keiner weiteren Erklärung bedürfen.

In der ASPX-Seite muss ein Scriptmanager eingebaut werden und der Service darauf registriert werden. Da ich de Scriptmanager in meinem Beispiel in der Master-Page habe, verwende ich einen ScriptmanagerProxy, der es erlaubt, die Registrierungen für einzelne Seiten vorzunehmen und an den Scriptmanager in der Master-Page weiterleitet. Dies ist deshalb notwendig, da auf einer Seite nur ein einziger Scriptmanager vorkommen darf.

 1: <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
 2: <Services>
 3: <asp:ServiceReference Path="~/Services/INNProjectExplorerWebService.asmx" />
 4: </Services>
 5: </asp:ScriptManagerProxy>


Noch ein wichtiger Hinweis: Ich hatte zuerst den ToolScriptManager aus dem AJAX Component Toolkit in meiner Masterpage. Dieser scheint nicht mit dem ScriptManagerProxy zusammenzuarbeiten, jedenfalls wurde bei mir die Proxy-Klasse nicht erstellt. Erst als ich einen "normalen" ScriptManager verwendet habe, funktionierte das problemlos.

Auf dem Client wird nun eine Proxy-Klasse erstellt, die die Datentypen und die Methoden des Webservices in JavaScript nachgebildet werden. Darüber lässt sich der WebService sehr einfach aufrufen.

 1: <script
language="javascript" type="text/javascript">
 2: 
 3: function fnCallWebService()
 4: {
 5: ValuePlanner_2008.Services.INNProjectExplorerWebService.HelloWorld(5,
fnHelloWorlSuccess, fnHelloWorlFailed);
 6: }
 7: 
 8: function fnHelloWorlSuccess(results,
context, methodName)
 9: {
 10: alert(results.Text);
 11: }
 12: 
 13: function fnHelloWorlFailed(results,
context, methodName)
 14: {
 15: alert
("Error calling webservice");
 16: }
 17: </script> 


in Zeile 5 wird der WebService mit der dem Namespace und dem Namen der Webservice Klasse aufgerufen. Zunächst wird der Parameter der HelloWorld-Methode übergeben. Da der Aufruf asynchron erfolgt kann wird noch eine Methode angegeben angegeb, die im Erfolgsfall aufgerufen wird, optional noch eine Methode, wenn der Aufruf fehlschlägt. In Zeile 10 sieht man schön, dass man in JavaScript nun auch das Datenobjekt des Rückgabewertes in gewohnter Weise zugreifen kann.

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum