.NET Blog   ·   .NET Casts   ·   .NET GUI Foren   ·   .NET BlogBook   ·   WPF Blogger   ·   visual studio one   ·   ASP.NET professional

  • ACHTUNG - NEUES BLOG

    Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
Download .NET Essentials Installer
Trickkiste

.NET Casts: Gewinnspiel-Teilnahme noch bis 30.11.2007 möglich

29.11.07 - .NET, ASP.NET, Allerlei, Internet, Community
Beitrag von Norbert Eder
 Das aktuelle Gewinnspiel von .NET Casts läuft noch bis zum 30.11.2007. Wer also noch nicht teilgenommen hat, kann dies noch schnell nachholen. Was ist zu tun?
  • .NET BlogBook herunter laden
  • Code suchen
  • Code zusammen mit den im .NET BlogBook gefragten Informationen an csharp[at]gmx.at senden

Weitere Informationen dazu finden sich in dieser Post.

Also ran ans .NET BlogBook und noch schnell mitmachen. Schließlich gibt es ja auch etwas zu gewinnen.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die neue Suchmaschine die alles besser macht?

28.11.07 - Internet
Beitrag von Norbert Eder
 Weil ich es zufällig gestern mitbekommen habe, xibben ging online. Eine neue Suchmaschine aus Deutschland, die sich nur durch Werbung finanziert. Natürlich musste ich mir diese auch gleich mal ansehen.

Die Werbefinanzierung wird wohl über Google-Adsense gemacht, also schon ein wenig schräg, wenn es auch naheliegend ist.

Weiters viel mir auf, dass xibben ein wenig unübersichtlich ist, ob der ganzen Web 2.x Features, Ajax ohne Ende. Für eine Suchseite wohl ein wenig überdimensioniert.

Und zu guter Letzt das Konzept: Ich denke hier wurde hauptsächlich von diversen Blog-Eintrags-Seiten abgeguckt und dieses System genutzt. So muss man seine Url hier manuell eintragen um überhaupt erst gefunden zu werden, die Eingabemaske ist hier mehr als dürftig, da beispielsweise auch eine entsprechende Kategorie ausgewählt werden muss. Hierzu wird allerdings keine ComboBox verwendet, sondern man muss erst zu Tippen beginnen, um dann überhaupt die korrekten Kategorien angeboten zu bekommen. Nicht sehr fein gelöst.
Dann die Bewertungsmöglichkeiten der einzelnen Seiten. Keine Ahnung ob es ein internes Bewertungs-/Relevanz-Verfahren gibt, aber rein nur auf Besucherangaben zu warten/setzen ist meiner Meinung anch eher der falsche Weg bzw. nur ein halb richtiger.

Nun zu den Ergebnissen: Natürlich wurde von mir hier hauptsächlich zum Thema C# getestet. So Dinge á la PropertyGrid, XmlSerializer etc. Die Resultate waren hier durchaus als gut zu bewerten und sollten tatsächlich schnell weiterhelfen. Resultate, die mit dem Thema wenig bis kaum zu tun hatten wurden kaum gefunden.

Aber jetzt kommt der Clou: Sämtliche Ergebnisse sind Resultate aus einer Google-Suche, welche im Hintergrund läuft. Der Benutzer (bzw. Sucher) hat nun die Aufgabe, gefundene Resultate xibben hinzu zu fügen. Das kanns dann aber auch nicht gewesen sein, oder? Da kann man ja erst wieder bei Google suchen und da muss ich nicht großartig ein gefundenes Ergebnis erst hinzufügen ...

Edit: Ach ja, erstellte Einträge können auch nicht mehr bearbeitet werden. Was sehr ungut ist, vor allem wenn die Rubrik automatisch geändert wird ...
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Die neuen Features von Visual Studio 2008 in einer Übersicht

23.11.07 - .NET, Visual Studio
Beitrag von Norbert Eder
 Visual Studio 2008 bringt doch einiges an neue Features mit (auch wenn mir manche immer noch fehlen - siehe Kommentare). Wer gerne eine nette Übersicht hätte, der sollte sich den nachfolgenden Link näher ansehen:
http://msdotnetsupport.blogspot.com/2007/11/22-new-features-of-visual-studio-2008.html
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Über den Tellerrand geblickt: foreach in C# und Java

23.11.07 - Entwicklung, Diskussionen, .NET, Grundlagen
Beitrag von Norbert Eder
 Aktuell bin ich (wie unschwer zu erkennen ist) mit WPF beschäftigt, aber auch Java hat sich wieder ein wenig breiter in meinem Leben gemacht. Und obwohl Java jetzt nicht unbedingt zu meinen Lieblingen zählt, gibt es dennoch Dinge, die (aus meinem Blickwinkel) schöner gelöst sind. Ein schönes Beispiel hierzu wäre foreach.

In .NET sieht das ja so aus:
foreach (String s in myStringList)
{
}

In Java deutet zwar nichts auf ein foreach hin, nennt sich aber dennoch so und sieht wie folgt aus:
for (String s : myStringList)
{
}

Geht doch irgendwie leichter von der Hand, nicht?
  10 Kommentare - 916 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Visual Studio 2008 Beta 2 korrekt entfernen

21.11.07 - .NET, Visual Studio
Beitrag von Norbert Eder
 Nein, es ist nicht an mir vorüber gegangen, dass Visual Studio 2008 und das .NET Framework 3.5 nun final sind. Aber schließlich gab es dazu ohnehin sehr sehr viele Blogbeiträge.

Wer allerdings die Beta 2 auf seinem System installiert hat (nicht in einem Image) sollte dieses vor der Installation der finalen Version deinstallieren. Eine detaillierte Anleitung wird dazu von Scott Guthrie geliefert. Damit sollten sich etwaige Probleme vermeiden lassen.

Der Vollständigkeit halber, hier noch einmal die Links zu den unterschiedlichen Downloads:
Visual Studio 2008 Express Versionen
.NET Framework 3.5
Visual Studio 2008 90-Tage Trial Versionen

Die finalen Visual Studio 2008 Versionen sind über die MSDN Subscriber Downloads zu haben.
  7 Kommentare - 764 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


WPF: Unterstützung beim Debuggen von WPF-Anwendungen

21.11.07 - .NET, WPF
Beitrag von Norbert Eder
 Das Debuggen von WPF-Anwendungen kann sehr anstrengend und aufwendig sein. Quasi manuell müssen Eigenschaftswerte überprüft werden, der genaue Ablauf will genau durchlaufen werden. Hier kommen kleine Helferleins zum Einsatz, die das Leben als WPF-Entwickler wesentlich vereinfachen.

An dieser Stelle möchte ich zwei Tools erwähnen, die ein visuelles Debuggen von WPF-Anwendungen erlauben. D.h. es wird der VisualTree dargestellt und die entsprechenden Einstellungen können einfach gesichtet werden. Zudem ist es auch eine kleine Lernhilfe bezüglich des Ablaufes und des Aufbaus.

Snoop


Link: http://www.blois.us/Snoop/

Woodstock


Link: http://www.codeproject.com/useritems/WoodstockForWPF.asp

Grundsätzlich bieten beide Tools einen ähnlichen Funktionsumfang. Der große Unterschied liegt jedoch darin, dass Snoop eine eigene kleine Anwendung ist, die sich an die gewählte Anwendung anhängt, während Woodstock direkt ins Visual Studio eingebunden ist und daher das Handling einfacher ist.

Ich kann nur empfehlen, die beiden Tools zu testen und auch einzusetzen. In vielen Fällen bringen sie eine Arbeitserleichterung und so mancher Fehler kann schneller gefunden werden. Welches Tool eingesetzt wird, ist grundsätzlich Geschmacksache, aber wie gesagt, einfach testen.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


WPF: Objekte manuell an Controls binden

20.11.07 - .NET, WPF
Beitrag von Norbert Eder
 DataBinding ist eine wichtige Sache. Schließlich wollen Daten auf der Programmoberfläche ja auch angezeigt werden. Nun stellt sich die Frage, wie dies per Sourcecode-Anweisungen geschehen kann. Hier ein kleines Beispiel dazu.

Gegeben sei folgende Oberfläche:
<Window x:Class="DataBindingDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="DataBindingDemo" 
    Height="150" 
    Width="300">
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="75"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Label x:Name="FirstnameLabel" 
               Content="Firstname" 
               Grid.Column="0" 
               Grid.Row="0"/>
        <Label x:Name="LastnameLabel" 
               Content="Lastname" 
               Grid.Column="0" 
               Grid.Row="1"/>
        <TextBox x:Name="FirstnameTextBox" 
                 Grid.Column="1" 
                 Grid.Row="0"/>
        <TextBox x:Name="LastnameTextBox" 
                 Grid.Column="1" 
                 Grid.Row="1"/>
        <Button x:Name="ShowValuesButton" 
                Grid.Column="1" 
                Grid.Row="2" 
                Content="Show Values"/>
    </Grid>
</Window>

Also nicht wirklich etwas Besonderes, zwei TextBoxen und ein Button, um zu überprüfen, ob die Änderungen auch tatsächlich übernommen wurden.

Nun benötigen wir für unser Beispiel noch eine Klasse Person. Ein Objekt dieses Typs wird anschließend an die beiden Textfelder gebunden:
public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }

    public Person(string firstname, string lastname)
    {
        Firstname = firstname;
        Lastname = lastname;
    }
}

Die Klasse ist erstellt, nun kommt das eigentliche Binding. Im Konstruktor von Window1 rufen wir eine Methode Init auf, die uns einen EventHandler für das Click-Ereignis des Buttons erstellt, damit die Änderungen angezeigt werden und somit überprüft werden kann, ob das dahinterliegende Objekt auch tatsächlich die korrekten Werte enthält. Weiters wird das Binding definiert.
public partial class Window1 : Window
{
    private Person p;

    public Window1()
    {
        InitializeComponent();

        Init();
    }

    private void Init()
    {
        ShowValuesButton.Click += 
            new RoutedEventHandler(ShowValuesButton_Click);

        p = new Person("Norbert", "Eder");
        Binding firstBinding = new Binding();
        firstBinding.Source = p;
        firstBinding.Path = new PropertyPath("Firstname");

        FirstnameTextBox.SetBinding(TextBox.TextProperty, firstBinding);

        Binding lastBinding = new Binding();
        lastBinding.Source = p;
        lastBinding.Path = new PropertyPath("Lastname");

        LastnameTextBox.SetBinding(TextBox.TextProperty, lastBinding);
    }

    void ShowValuesButton_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(
            String.Format("Lastname: {0} -- Firstname: {1}", 
                p.Lastname, 
                p.Firstname));
    }
}

Was wir also für das Binding benötigen ist ein Objekt des Typs Binding. Diesem Objekt muss eine Source übergeben werden. Dies kann wiederum ein beliebiges Objekt sein - in unserem Fall ein Objekt des Typs Person. Mit Hilfe der Eigenschaft Path kann nun festgelegt werden, welche Eigenschaft des an die Source übergebenen Objektes gebunden werden soll.

Schließlich muss am Ziel-Control noch das Binding mit Hilfe der Methode SetBinding gesetzt werden. Hierzu ist die gewünschte DependencyProperty (beschreibt welche Eigenschaft des Controls befüllt werden soll) anzugeben und das zuvor erstellte Binding-Objekt. Das gleiche wird nun auch für das zweite Textfeld durchgeführt.

Zur Laufzeit sieht das dann so aus:


Nach jeder Änderung eines der Textfelder sollte die MessageBox diese Änderung auch tatsächlich anzeigen. Wenn dem so ist, dann kann man sich zu einem erfolgreich durchgeführten DataBinding gratulieren.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


WPF: BringToFront und SendToBack

19.11.07 - .NET, WPF
Beitrag von Norbert Eder
 Unter Windows Forms gibt es die Methoden BringToFront und SendToBack um Controls in den Vordergrund zu bringen oder in den Hintergrund zu setzen. Diese Methoden sind in der Windows Presentation Foundation nicht mehr vorhanden. Bei der WPF verfügt jedes Element über eine ZOrder (quasi ein Index, welcher den Verlauf über die Z-Achse beschreibt). Elemente die später hinzugefügt werden, besitzen einen höheren Index und sind somit auf der Z-Achse höher oben angesiedelt und liegen daher über Elementen niedrigerer Ordnung.

Um nun BringToFront und SendToBack zur Verfügung zu stellen, muss die ZOrder manuell angepasst werden. Dies wird mit nachfolgender Methode gezeigt.
private void ChangeZOrder(bool bringToFront)
{

    int iNewIndex = -1;
    Canvas parentElement = (Canvas)_parentElement;
    if (bringToFront)
    {
        foreach (UIElement elem in parentElement.Children)
            if (elem.Visibility != Visibility.Collapsed)
                ++iNewIndex;
    }
    else
    {
        iNewIndex = 0;
    }

    int iOffset = (iNewIndex == 0) ? +1 : -1;
    int iElemCurIndex = Canvas.GetZIndex(this);

    foreach (UIElement child in parentElement.Children)
    {
        if (child == this)
            Canvas.SetZIndex(this, iNewIndex);
        else
        {
            int iZIndex = Canvas.GetZIndex(child);

            if (bringToFront && iElemCurIndex < iZIndex ::
                !bringToFront && iZIndex < iElemCurIndex)
            {
                Canvas.SetZIndex(child, iZIndex + iOffset);
            }
        }
    }
}

Hierbei ist folgendes zu beachten: In dieser Methode wird auf das Element _parentElement zugegriffen. Hintergrund ist der, dass die Methode (in meinem Fall) in einer Basisklasse für spezielle Controls definiert wurde und mittels der beiden nachfolgenden Methoden in allen entsprechenden Controls zur Verfügung steht. Genauso könnte es eine Ableitung des Containers (in diesem Fall ein Canvas) geben, dem mitgeteilt wird, welches Child manipuliert werden soll.
public void BringToFront()
{
    ChangeZOrder(true);
}

public void SendToBack()
{
    ChangeZOrder(false);
}

Gegenenfalls muss hier an die eigenen Bedürfnisse angepasst werden, es passiert jedoch nichts Aufregendes. Im Falle von SendToBack wird als ZIndex 0 gesetzt, d.h. das Element ist anschließend das erste auf dem Container und wird ganz hinten angezeigt, im Falle von BringToFront geht's in die andere Richtung.

Noch ein kleiner Hinweis: muss das Parent-Objekt gesucht werden, kann dies damit erledigt werden:
UIElement parent = VisualTreeHelper.GetParent(myElement);

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


WPF: Element innerhalb eines Canvas per Sourcecode positionieren

16.11.07 - .NET, WPF
Beitrag von Norbert Eder
 Von den Windows-Forms ist man ja noch die Eigenschaft Location gewohnt. Diese gibt es bei WPF nicht mehr, stattdessen muss man einen anderen Weg gehen.

Per XAML wird ein Element in einem Canvas recht einfach exakt positioniert:
<Canvas x:Name="LayoutRoot" Background="Yellow">
    <ListBox 
        Width="100" 
        Height="100" 
        Canvas.Left="352" 
        Canvas.Top="192" 
        IsSynchronizedWithCurrentItem="True"/>
</Canvas>

Doch wie wird das per Code gemacht? Eigentlich auch nicht wirklich schwieriger, man muss eben nur wissen wie:
Canvas canvas=new Canvas();
canvas.Background=Brushes.Yellow;

ListBox lbx=new ListBox();
lbx.Width=100;
lbx.Height=100;
lbx.IsSynchronizedWithCurrentItem=true;
Canvas.SetLeft(lbx,352);
Canvas.SetTop(lbx,192);
canvas.Children.Add(lbx);

An vielen Stellen ist also dann doch ein Umdenken notwendig und ich ertappe mich anscheinend selbst noch oft bei meinem alten Denkschema.
  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Ein paar Zahlen rund um Microsoft

14.11.07 - Kunterbunt
Beitrag von Norbert Eder
 Man mag ja zu Microsoft stehen wie man möchte. Aber die hier genannten Zahlen sind schon mehr als imposant.
  • 10.000 Server im Firmen-Netzwerk
  • 130.000 Server für Windows Live Services
  • 600.000 Laufwerke
  • 85 Webserver für microsoft.com
  • 26 Millionen Emails täglich
  • usw.

Nette Zahlen. Vor allem die 97% Spam aller externen Emails (=19,4 Millionen Spam Emails täglich) sind schon eine nette Menge. Jetzt wundert es mich nicht mehr, dass Microsoft an einem verbesserten Spam-Filter (Zusammenarbeit mit der Aids-Forschung) arbeitet ...

... zusätzlich frage ich mich natürlich:
  • Können diese Zahlen stimmen?
  • Wer administriert all diese Server?
  • Welche Kosten fallen nur für die Administration an?
  • usw.

  2 Kommentare - 765 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL



Zurück Weiter