-
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.
|
2 Jahre Living.NET
29.11.07 - Blog-Intern Beitrag von Norbert Eder| | Jetzt hab ich doch glatt selbst die 2-Jahres-Feier vergessen. Asche auf mein Haupt. Aber glücklicherweise fiel mir dann doch noch ein, dass da irgendwas war. Es jährt sich also zum zweiten Mal, dass ich auf meinem Blog über .NET und SQL Server berichte.
Auf folgende Daten kann ich zurück blicken:
639 Einträge mit 134,277 Wörtern verbrauchen 937,133 Bytes.
668 Kommentare mit 43,521 Wörtern verbrauchen 298,417 Bytes.
Im Vergleich dazu die geposteten Daten aus dem Vorjahr:
211 Einträge mit 31,668 Wörtern verbrauchen 231,031 Bytes.
85 Kommentare mit 4,194 Wörtern verbrauchen 28,992 Bytes.
Man kann also durchaus sagen, dass sich hier einiges getan hat. Viele Posts (hoffentlich hilfreiche), sondern auch jede Menge Kommentare. Nicht nur das, auch konnte ich einige Veranstaltungen besuchen und gute Kontakte knüpfen, die nicht nur mir, sondern auch meinen Lesern zu Gute kommen. Zusätzlich wurden auch einige Projekte (allen voran .NET Casts) ins Leben gerufen werden.
Ich möchte auf jeden Fall all meinen Lesern für die Treue danken und natürlich auch allen aktiven Teilnehmern, die mit hilfreichen Kommentaren meine Beiträge untermauern und/oder verbessern und mit zusätzlichen Informationen anreichern.
Und daher bleibt mir nur zu sagen: Auf ein weiteres Jahr!
| | | 2 Kommentare
- 766 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
.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
Ü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
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 | Zurück Weiter
|
|
|
|
|
|
|