Laden...
E
Easyrider myCSharp.de - Member
Anwendungsentwickler Bayern Dabei seit 18.12.2006 200 Beiträge
Benutzerbeschreibung

Forenbeiträge von Easyrider Ingesamt 200 Beiträge

06.05.2013 - 15:32 Uhr

Da ich aus Bayern, und um genau zu sein aus Niederbayern komme, wird bei uns traditionell am 1. Mai der Maibaum aufgestellt. Den Rest des Tages mit den Kindern gespielt oder im Garten entspannt. 😉

04.06.2012 - 06:59 Uhr

Beispielprojekt siehe Anhang

23.02.2012 - 10:07 Uhr

Hallo Herbi,

ja, du hattest Recht. Durch einen Bug ist die Spalte leider als String hinzugefügt worden.

Vielen Dank für den Tip. 👍

mfg

Stefan

23.02.2012 - 07:50 Uhr

Hallo,

in einer meiner Anwendungen bin ich gerade auf ein Problem gestoßen, das ich alleine + Suche in Google + MSDN nicht lösen kann.

Aufgabenstellung:

Die Anwendung bekommt ein Dataset via DataSet.ReadXML. Es ist keine Datenbankanbindung dahinter vorhanden. Jetzt muss auf das DataSet ein Filter gesetzt werden. Dies geschieht über eine DataView mit einem RowFilter. Der Benutzer muss den Filter in einer Textbox eingeben können. Bei der Eingabe des Filters kann es zu Berechnungen kommen.

Beispiel:

Dataset mit 100 Einträgen:

Spalten A zeigt die Werte für einen Minimalwert an, beispielhaft 1 - 100.
Spalte B zeigt die Werte für einen Maximalwert an, beispielhaft 100 - 1000.
Spalte C zeigt die Werte für einen aktuellen Wert an, der irgendwo zwischen Minimal- und Maximalwert liegt.

In der Berechnung soll der Benutzer eine Formel wie folgt eingeben können:

AktuellerWert > MinimalWert * 1,1

Wenn ich so etwas in einem richtigen DataView eingebe, dann schafft er es nicht den Wert für MinimalWert zu finden. Es kommt die Fehlermeldung, das die Operation "*" mit System.String nicht durchgeführt werden kann. Bedeutet, er kann den Text MinimalWert nicht mit dem Wert der Spalte ersetzen.

Hat jemand eine Idee, wie ich das Problem lösen könnte?

mfg

Stefan

19.01.2012 - 10:06 Uhr

Hallo,

ich beantworte mir meine Frage mal selbst, falls andere das Problem auch noch haben.

Das DataGrid kann anscheinend keine Bindings per ElementName auf einzelne Einträge in einer Row. Man kann das Problem umgehen, indem man einen DataContextProxy benutzt. Die vollständige Lösung dazu findet ihr hier.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace JobPlan.Controls
{
    public class DataContextProxy : FrameworkElement
    {
        public DataContextProxy()
        {
            this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);
        }

        void DataContextProxy_Loaded(object sender, RoutedEventArgs e)
        {
            Binding binding = new Binding();
            if (!String.IsNullOrEmpty(BindingPropertyName))
            {
                binding.Path = new PropertyPath(BindingPropertyName);
            }
            binding.Source = this.DataContext;
            binding.Mode = BindingMode;
            this.SetBinding(DataContextProxy.DataSourceProperty, binding);             
        }

        public Object DataSource
        {
            get { return (Object)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }

        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null);


        public string BindingPropertyName { get; set; }

        public BindingMode BindingMode { get; set; }
        
    }
}

Sobald man diese Klasse in den StaticResources einbaut und die Property mit Binding Source={StaticResource DataContextProxy},Path=DataSource.MeineProperty anspricht, dann gehts.

Was ich mich noch frage ist, warum es im DataGrid nicht geht. Das konnte ich leider noch nicht beantworten. Falls jemand die Antwort weiß, würde ich mich freuen wenn Sie mir jemand beantwortet.

mfg

Easy

19.01.2012 - 08:30 Uhr

Hallo winsharp93,

wir verwenden bei unserem Projekt eine vergleichbare Implementierung von ICommand. Diese wurde bereits über hundert Mal benutzt, da vermute ich keine Probleme.

Wenn ich anstatt eines Buttons eine Checkbox hinbaue und das IsChecked={Binding IsSelected} setze, dann geht das. Selbst wenn noch das Command dabei steht. Aber mehr leider auch nicht. Der Command wird wieder nicht ausgeführt.

Folgende Ideen hatte ich noch über Nacht, aber die muss ich noch überprüfen:

  • Das DataGrid registriert die Commands und bearbeitet sie, somit bekomme ich sie nie.
  • Die Checkbox selbst registriert das Click-Command und behandelt es.

Werds mir heute Vormittag nochmal genauer angucken.

18.01.2012 - 21:57 Uhr

Hallo,

ich habe aktuell ein Problem mit verschachtelten DataTemplates und Command-Binding und finde einfach keine Lösung. Folgende Problemstellung:

In meiner View habe ich einen TemplateSelector, der mir je nach Einstellung eines von drei verschiedenen Grids anzeigt. Die Grids liegen somit in einem DataTemplate. Innerhalb eines Grids muss ich nun eine Spalte anzeigen, welche wiederum ein eigenes DataTemplate hat. In diesem DataTemplate liegt nun ein Control, das einen Command aus dem ViewModel ausführen soll.

Der DataContext der Grids ist an das ViewModel gebunden. Leider reicht das aber nicht. Der Command bzw. das Command-Binding wird nie aufgerufen. Egal welche Lösung ich probiere. Folgende Dinge bin ich schon durch:

  • DataContext innerhalb des DataTemplates noch einmal setzen (per ElementName mit Grid und TemplateSelector)
  • Command via normales Binding setzen
  • Command via RelativeSource=RelativeSource TemplatedParent setzen
  • Command via ElementName (Grid + TemplateSelector) setzen

Bei Google habe ich heute bestimmt schon eine Stunde gesucht. Hat jemand eine Idee, wie ich das Problem lösen könnte? Es muss doch eine Lösung dafür geben... Wahrscheinlich seh ich nur den Wald vor lauter Bäumen nicht mehr.

mfg

Easy

14.12.2011 - 06:08 Uhr

Zurück zum Thema:

Wie könnt ihr euch da motivieren?

Bei mir ist es meistens eine Mischung aus allem. Ich höre manchmal (vor allem nach 10 Stunden aufwärts) Technobase.fm oder Hardrock.fm, damit mein Hirn nicht wegdöst. Bei richtig langweiligen Arbeiten versuche ich, sie immer so schnell wie möglich hinter mich zu bringen. Nix aufschieben, nicht warten. Sofort erledigen. Dann hat man es hinter sich. Und man kann wieder an interessanteren Dingen arbeiten.

Sollte ich dazwischen mal fünf Minuten Pause brauchen, um den Kopf frei zu kriegen, surf ich entweder oder geh mal kurz einen Tee holen. Aber nicht länger, sonst geht die Motivation flöten.

Ich weiß das die meisten Menschen versuchen, ungeliebte Arbeiten auf die lange Bank zu drücken. Oder sie geben sie anderen Kollegen. Aber die Arbeit bleibt die gleiche. Wenn man sich angewöhnt hat, so etwas sofort zu machen, quält es einem nicht mehr, und man hat den Kopf frei für wichtigere Dinge.

Just 4 your Info

Easy

25.11.2011 - 14:38 Uhr

Hallo hypersurf,

hab deinen Quellcode kopiert und in ein komplett leeres Projekt eingefügt. Der Fehler ist einfach nachzuvollziehen. Leider macht er keinen Sinn. Es sieht so aus, wie wenn das Polygon bei dem Punkt einfach fünf Pixel hinzufügt.

Wenn man den Punkt X2 auf 390 legt, dann stimmt die Zeichnung:

        <Canvas Height="600" Width="400">
            <Polygon Stroke="Black">
                <Polygon.Points>
                    <Point X="201.0" Y="135.0"/>
                    <Point X="390.0" Y="135.0"/>
                </Polygon.Points>
            </Polygon>
            <Polygon Stroke="Red">
                <Polygon.Points>
                    <Point X="377.0" Y="145.0"/>
                    <Point X="395.0" Y="135.0"/>
                    <Point X="377.0" Y="125.0"/>
                </Polygon.Points>
            </Polygon>
        </Canvas>

Als optionale Lösung würde ich vorschlagen, kein Polygon zu benutzen. Du hast ja nur zwei Koordinaten, was einer Linie entspricht:

<Canvas Height="600" Width="400">
            <Line X1="201.0" Y1="135.0" X2="395.0" Y2="135.0" Stroke="Black" />
            <Polygon Stroke="Red">
                <Polygon.Points>
                    <Point X="377.0" Y="145.0"/>
                    <Point X="395.0" Y="135.0"/>
                    <Point X="377.0" Y="125.0"/>
                </Polygon.Points>
            </Polygon>
        </Canvas>

Hier funktioniert 395.0 einwandfrei.

mfg

Easy

23.11.2011 - 09:34 Uhr

So, muss auch mal meine Erfahrungen dazu wiedergeben. Zu mir persönlich:

Ausbildung zum FIAE, dualles System mit Arbeit und blockweise staatliche Berufschule.

Von der Ausbildung her kann ich mich nicht über meine Berufschule beschweren. Die Themen über die drei Jahre verteilt vermitteln ein sehr gutes Basiswissen, auf dem ich aufgebaut habe. Meine Lehrer in den Fächern IT waren alle gut bis sehr gut.

  • Im Fach Anwendungsentwicklung Programmierung (C++) hatte ich einen sehr guten Lehrer, der einem die Fehler und Beispiele gut erklären konnte. Die Theorie der Objektorientierung ist zwar abstrakt, aber da muss man durch 😉
  • Im Fach Netzwerk war der Lehrer auch gut und hat es gerne an Praxisbeispielen gezeigt. Beispielsweise eigene Netzwerkkabel bauen, Netzwerke aufbauen etc.
  • In der Kategorie Unix hatte ich den besten Lehrer. Er war zwar streng, hat sich aber für jeden Zeit genommen und auch Erfahrungen weitergegeben, die unabhängig zum Thema sind. Beispielsweise war sein fachliches Wissen so gut, das er als als Forensiker bei der Polizei geholfen hat. Ein "touch" auf gewisse Dateien simuliert, das man an einer Datei gearbeitet hat 😉

Im Großen und Ganzen hängt die Ausbildung viel zu sehr von den Lehrern ab. Ob jetzt eine private oder staatliche Schule besser ist, kann man pauschal nicht beurteilen. Ich für meinen Teil hätte ohne die staatliche Berufsschule ziemlich viel Wissen versäumt, vor allem im Bereich Unix. Würde meine Ausbildung in der Schule nicht freiwillig gegen eine private eintauschen.

mfg

Easy

P.S.: Meine Berufschule war die Karl-Peter-Obermaier-Schule in Passau.

24.10.2011 - 15:34 Uhr

Benutz die Eigenschaft Application.ProductVersion. Damit kannst du die Version aus der AssemblyInfo auslesen.

13.10.2011 - 14:09 Uhr

Das ist zwar kein Horror, musste aber auf Anhieb schmunzeln:

/// <summary>
///     Yes, we can.
/// </summary>
public bool CanSort
{
    get { return true; }
}

😃

*edit: Codestyle überarbeitet

04.10.2011 - 15:06 Uhr

Erstmal danke für deine Antwort.

Hast du vielleicht ein Beispiel dazu? Ich bekomme die Fehlermeldung "A value of type 'DataTemplate' cannot be added to a collection or dictionary of type 'ToolTipGroup'".

Zum Test habe ich mir ein Objekt in den Resources des Controls vom Typ ToolTipGroup angelegt. Darunter dann das DataTemplate. Ich bin mir ziemlich sicher, das ich es einfach noch falsch mache, verstehe aber den Fehler leider nicht ganz.


<class:ToolTipGroup x:Name="toolTipGroup">
    <DataTemplate>
        <Stackpanel>
         ...
        </Stackpanel>
    </DataTemplate>
</class:ToolTipGroup>

04.10.2011 - 13:50 Uhr

Hallo,

ist das "static" oben im Konstruktor Absicht?

04.10.2011 - 13:48 Uhr

Hallo,

ich bin gerade auf der Suche nach Lösungsansätzen für folgendes Problem:

Für ein neues Usercontrol (ListBox) soll der ToolTip variabel gestaltet werden. Das bedeutet, das pro ListBoxItem der ToolTip zur Laufzeit via Datenbankeinträge manuell gesetzt wird. Dieser soll in einer Liste von "ToolTipGroups" sowie ToolTipItems gespeichert werden.

ListBoxItem 1

  • ToolTipGroup 1
    -- ToolTipItem 1
    -- ToolTipItem 2
    -- ToolTipItem 3
  • ToolTipGroup 2
    -- ToolTipItem 1
    -- ToolTipItem 2
    -- ToolTipItem 3
    ...

Die ObservableCollection<ToolTipGroup> hat eine Liste von ToolTipItems. Ein ToolTipItem besitzt zwei Eigenschaften namens Key und Value, welche in zwei Textblöcken dargestellt werden soll.

Mein Problem besteht jetzt darin, das ich nicht weiß wie ich das ganze darstellen soll. Ich kann es nicht fest in XAML implementieren, da die Anzahl der ToolTipGroups und -Items unbekannt ist. Dynamisch kann ich (meines Wissens nach) nur Text als CodeBehind zum ToolTip hinzufügen.

Wie kann ich im Code-Behind den Content des ToolTips pro Item so setzen, dass er so arbeitet wie folgender Codeabschnitt?


<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Key}" />
    <TextBlock Text="{Binding Value}" />
</StackPanel>

mfg

Easy

30.09.2011 - 10:03 Uhr

Das etwas über das Netzwerk verloren geht kannst du ausschließen. Laut dem Codefragment weiter oben benutzt du TCP. Im TCP-Protokoll gibt es Überprüfungen, die sicherstellen das jedes einzelne Paket vollständig und in der richtigen Reihenfolge ankommen. Siehe Wikipedia TCP, Datenintegrität und Zuverlässigkeit.

Sollte es dennoch zu einem Fehler kommen und ein Paket unvollständig / nicht rechtzeitig ankommen, gibt es eine Exception nach oben.

Schau mal in den Schichten weiter oben nach, ich denke da liegt der Fehler.

*edit: Zu blöd für korrektes Deutsch...

19.08.2011 - 10:27 Uhr

OT: Egal was da im Hintergrund gemacht wird, der Speicherverbrauch ist exorbitant zu hoch. Sowas kann man von keinem Anwender verlangen, wenn man nicht gerade hochaufwendige mathematische Berechnungen anstellt. /OT

19.08.2011 - 09:21 Uhr

Hallo,

wenn du trotzdem noch den alten Weg bevorzugst, wäre die entsprechende Lösung die Eigenschaft "SelectedItem".

18.08.2011 - 15:35 Uhr

Nein, weil das ein ungültiger Threadübergreifender Vorgang wäre. In den oben genannten Links findest du mehr Infos darüber.

16.08.2011 - 10:09 Uhr

Gerade in einem Prototypen auf Arbeit gefunden:

foreach (var dokument in SelectedDokuments)
{
    selectedDoc = dokument;
    break;
}

Schädel -> Wand

11.08.2011 - 11:42 Uhr

Hallo,

wie in der Überschrift beschrieben versuche ich gerade, das Expander Icon eines gecustomizten TreeViewItems auszustauschen. Aber irgendwie krieg ich das nicht gebacken.

Meine Klassen sehen so aus:

ExtendedTreeView:

    public class ExtendedTreeView : TreeView
    {

        private bool isChanging = false;

        /// <summary>
        /// Default Constructor
        /// </summary>
        public ExtendedTreeView()
        {
            this.Loaded += new RoutedEventHandler(ExtendedTreeView_Loaded);
        }

        private void ExtendedTreeView_Loaded(object sender, RoutedEventArgs e)
        {
            this.UpdateLayout();

            foreach (ExtendedTreeNode node in this.Items)
                node.ItemWidth = this.ActualWidth - 70;
        }

        // More code here
}

ExtendedTreeNode:

 public class ExtendedTreeNode : ContentControl, INotifyPropertyChanged
    {

        #region " Private Variables "

        private double itemWidth = 100.0;
        private string text = string.Empty;
        private ImageSource image = null;
        private ImageSource defaultImage = null;
        private ImageSource folderImage = null;
        private NodeType type = NodeType.Folder;
        private ObservableCollection<ExtendedTreeNode> nodes = new ObservableCollection<ExtendedTreeNode>();

        #endregion

        #region " Properties "

        /// <summary>
        /// Get or set the list of tree nodes, which are below this node.
        /// </summary>
        public ObservableCollection<ExtendedTreeNode> Nodes
        {
            get { return this.nodes; }
            set
            {
                this.nodes = value;
                this.OnPropertyChanged("Nodes");
            }
        }

        /// <summary>
        /// Get or set the width of the item
        /// </summary>
        public double ItemWidth
        {
            get { return this.itemWidth; }
            set
            { 
                this.itemWidth = value;
                OnPropertyChanged("ItemWidth");
            }
        }

        /// <summary>
        /// Get or set the text for the tree node.
        /// </summary>
        public string Text
        {
            get { return this.text; }
            set 
            {
                this.text = value;
                this.OnPropertyChanged("Text");
            }
        }

        /// <summary>
        /// Get or set the image, which is shown on the left side of the node text.
        /// </summary>
        public ImageSource Image
        {
            get
            {
                if (this.image == null)
                    if (this.type == NodeType.Category)
                        return this.defaultImage;
                    else
                        return this.folderImage;
                else
                    return this.image;
            }
            set
            {
                this.image = value;
                this.OnPropertyChanged("Image");
            }
        }

        /// <summary>
        /// Get or set the type of the node.
        /// </summary>
        public NodeType Type
        {
            get { return this.type; }
            set
            {
                this.type = value;
                OnPropertyChanged("Type");
            }
        }

        #endregion

        #region " Event "

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
}

generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:local="clr-namespace:XXX.YYY.Controls"
                    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
                    xmlns:converter="clr-namespace:XXX.YYY.Controls.Converter"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    mc:Ignorable="d">

    <converter:ToolTipConverter x:Name="tooltipConverter" x:Key="toolTipConverter" />

    <Style TargetType="local:ExtendedTreeView">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                    <StackPanel Orientation="Horizontal" Height="18">
                        <Image Source="{Binding Image}" Width="16" Height="16" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                        <TextBlock Text="{Binding Text}" FontWeight="{Binding FontWeight}" Margin="5,0,0,0"
                                   TextTrimming="WordEllipsis" TextAlignment="Left" Width="{Binding ItemWidth}"
                                   VerticalAlignment="Center" HorizontalAlignment="Left">
                        </TextBlock>
                        <ToolTipService.ToolTip>
                            <ToolTip>
                                <TextBlock Text="{Binding Text}" />
                            </ToolTip>
                        </ToolTipService.ToolTip>
                    </StackPanel>
                </sdk:HierarchicalDataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

Ich habe versucht, die Lösung von hier zu implementieren, aber nicht hinbekommen. Auch weil ich kein Blend habe.

Bei vielen weiteren Google-Suchen und auch hier habe ich leider kein funktionierendes Beispiel gefunden.

Hat so etwas schon mal jemand gemacht? Hat jemand ein (funktionierendes) Beisp dazu? Oder hat jemand die Zeit+Geduld, mir das zu erklären?

mfg

Easy

05.08.2011 - 16:58 Uhr

Hallo,

vielen Dank für das ausgiebige Beispiel gfoidl, jetzt hab ich verstanden was du meinst.

Gelöst habe ich das ganze jetzt mit einer Kombination aus dem Beispiel von dir sowie der CollectionViewSource, dir mir einiges an Arbeit abnimmt.

Danke Jungs 👍

mfg

Easy

05.08.2011 - 13:57 Uhr

Das heißt es wird auch erst zur Laufzeit entschieden nach was sortiert/gruppiert werden soll? Dann geht nur der Weg über Reflektion.

Ja, das wird erst zur Laufzeit entschieden. Über ein Kontextmenü hat der Benutzer die Möglichkeit, Gruppierung und Sortierung zu beinflussen (Ausschalten, Spalte Ändern, Sortierreihenfolge). Daher auch der Zwang, es mit Reflection hinzubekommen.

Der feste Cast im ObjectComparer ist nur zu "rationalen" Zwecken vorhanden. Bitte ignorier ihn. In der fertigen Anwendung wird das ganze natürlich über Reflection ausgelesen.

Wenn dem so ist würde ich ein Mapping Typ <-> Comparer erstellen (in einem Dictionary und dann kann von dort einfach der Comparer<T> geladen werden und gut ist es.

Ich gestehe, das ich diesen Satz nicht verstehe. Hast du ein Beispiel dazu, damit ich mir das Wissen aneignen kann?

mfg

Easy

P.S.: @winSharp93: Ich geh die CollectionViewSource gerade durch und schaue, ob ich diese auch anstelle des komplexen Reflection-Zeugs benutzen kann. Thx für den Tip. 😁

05.08.2011 - 13:28 Uhr

Hallo gfoidl,

mit Methoden und Funktion hast du Recht. Das passiert, wenn man zu lange VB programmiert. Bitte das Wording nicht ganz so genau nehmen. 😉

Zum Problem: Meine Objekte kommen von extern. Ich programmiere ein Control in Silverlight, das für die Anzeige der Objekte verantwortlich ist. Dazu gehört, das ich die Objekte gruppieren und sortiern kann. Da das Control aber von unterschiedlichen Anwendungen mit unterschiedlichen Objekten benutzt wird, habe ich keine Chance einen festen Datentyp zu benutzen. Ich weiß, dass genau das das große Problem ist. Aber es ist nunmal Teil der Aufgabe. Leider. 🙁

So etwas wie deinen Property-Selector habe ich drin, siehe GetSorter. Oder meinst du noch etwas anderes?

mfg

Easy

P.S.: Wäre dir der Threadtitel "Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)" lieber? Hab in .Net 1.0 angefangen, somit bin ich hier noch etwas oldschool veranlagt. 8)

05.08.2011 - 12:57 Uhr

Hallo,

ich wiedermal. Bin derzeit bei einer Sortierung, wo ich nicht weiterkomme. Als Aufgabe habe ich, eine Liste von Objekten (z. B. als ObservableCollection) nach Eigenschaften aus dem Objekt selbst zu sortieren. Das schwierige daran ist, das ich die Klasse des Objekts selbst nicht zur Verfügung habe. Die Eigenschaften müssen also via Reflection ausgelesen werden.

Hier mal ein bischen Quellcode:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person()
        {}

        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public override string ToString()
        {
            return this.Name + " " + this.Age.ToString();
        }
    }

    public class ObjectComparer : IComparer<object>
    {
        public int Compare(object x, object y)
        {
            Person a = (Person)x;
            Person b = (Person)y;

            if (a.Age < b.Age)
                return -1;
            else if (a.Age > b.Age)
                return 1;
            else
                return 0;
        }
    }

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        public IOrderedEnumerable<object> OrderSequence()
        {
            object[] persons = 
            {
                new Person("Christian", 13),
                new Person("Thomas", 20),
                new Person("Stefan", 25),
                new Person("Alex", 1)
            };

            var sorter = GetSorter();
            var sortedNumbers = persons.OrderBy(sorter, new ObjectComparer());

            return sortedNumbers;
        }

        private Func<object, IComparable> GetSorter()
        {
            return o => ((object)o).GetType().GetProperty("Age").Name;
        }

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {

            IOrderedEnumerable<object> numbers = OrderSequence();

            foreach (object num in numbers)
            {
                this.lblResult.Text += num.ToString() + Environment.NewLine;
            }
        }
    }

Ich habe die eigentliche Aufgabe in ein kleines Beispielprojekt ausgegliedert und den Quellcode dann kopiert.

Die Liste mit den Personen soll nun nach dem Alter der Person sortiert werden. Die Funktion "OrderSequence" darf aber die Klasse "Person" selbst nicht kennen.

Leider funktioniert die Sortierung so noch nicht, da ich andauernd Kompilerfehler wie invalid Arguments oder > Fehlermeldung:

The type arguments for method 'System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>, System.Collections.Generic.IComparer<TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. bekomme. Selbst nach vielfachem Suchen in Google und hier konnte ich kein Beispiel finden.

Kann mir jemand von euch erklären, was ich hier falsch mache? 🤔

mfg

Easy

05.08.2011 - 12:49 Uhr

Hallo,

ich möchte euch die Lösung nicht vorenthalten:

  • Im Projektordner die Ordern "bin" und "obj" löschen
  • Visual Studio (2010) schließen
  • Computer neu starten.

Das hat das Problem gelöst. Keine Ahnung woher das Visual Studio die Informationen bzw. die alte DLL hatte, aber er musste sie sich irgendwo noch speichern. Eine Windows-Suche hat hier nix gefunden.

Hauptsache jetzt funktioniert es.

03.08.2011 - 11:50 Uhr

Habs gerade probiert über "Extras - Browserverlauf löschen - Alles anhaken - Löschen". Danach DLL neu kompiliert, von Hand rüber kopiert und Referenz neu gesetzt. Leider immer noch das gleiche Problem.

03.08.2011 - 11:22 Uhr

Hallo,

wir haben derzeit in der Firma ein etwas ungewöhnliches Problem mit Silverlight 4. Während dem Erstellen von DLLs "verschwinden" einige Eigenschaften, die wir kurz vorher implementiert haben. Das ganze passiert nicht regelmäßig, sondern nur hin und wieder. In den letzten vier Wochen hatte unser Team (10 Mann) das Problem exakt drei Mal.

Ausführliche Problembeschreibung:

Es gibt zwei Komponenten. Eine DLL, die Controls bereitstellt, und eine Silverlight-Anwendung, die diese DLL benutzt und die Controls anzeigt.

Silverlight-DLL (Class control):

  • Property A
  • Property B
  • Property C

Silverlight Anwendung (Class UI):

  • Control control
  • ...

Wenn wir jetzt in der DLL eine neue Property namens "Property D" hinzufügen, das Projekt neu kompilieren und die DLL in der Anwendung ersetzen, fehlt manchmal die neu erstellte Property D.

Wir haben bereits alle Möglichkeiten von menschlichen Fehlern ausgeschlossen. Die Datei wurde definitiv neu kompiliert (clean build, bin-folders löschen etc). Die Datei wurde, von wo die DLL-Refernenz kommt, gelöscht und in der Anwendung neu hinzugefügt. Wir haben das ganze eingecheckt und auf einem komplett anderen Rechner durchkompiliert. Er findet die Eigenschaft D trotzdem nicht.

Vom Gefühl her ist das so, wie wenn er eine Shadow-Copy macht, die Kopie aber beim neu Erstellen nicht Ersetzen kann und somit die alte DLL benutzt. Wie wenn er sich diese irgendwo wegspeichern würde.

Ein weiteres Problem ist, dass das ganze nicht regelmäßig auftritt. In den letzten vier Wochen hatten wir es drei mal, jedesmal bei unterschiedlichen DLL-Projekten, bei unterschiedlichen Personen und auf unterschiedlichen Rechnern. Nach einer gewissen Zeit, meist so ein guter Tag, verschwindet das Problem wie von Geisterhand.

Der Fehler ist da, lässt sich aber nicht konstant reproduzieren. Uns gehen langsam die Ideen aus, was das noch sein könnte. Daher unsere Frage an euch:

Kennt jemand von euch dieses Problem?
Hatte es vielleicht schonmal jemand selbst?

Über ein paar Tips würden wir uns freuen.

mfg

Easy

P.S.: Beispielcode darf ich aus sicherheitstechnischen Gründen leider nicht liefern.

12.07.2011 - 15:02 Uhr

Hallo,

die Breite vom Wrappanel ist die wichtige. Der Expander sollte eine komplette "Zeile" des Wrappanels ausfüllen.

11.07.2011 - 15:25 Uhr

Hallo,

ich bin gerade bei einem technischen Problem und bräuchte kurz eure Hilfe:

In meiner Anwendung ist eine Listbox mit einem Wrappanel als ItemsPanel. Dieses Wrappanel hat ein DataTemplate, um die einzelnen Items grafisch darstellen zu können. Via einem Slider und einer ViewBox ist zusätzlich ein Zoom implementiert.

<ListBox x:Name="listbox2" SelectionMode="Extended"
                     ItemsSource="{Binding Converter={StaticResource GroupingItemsControlConverter},
                     ConverterParameter={StaticResource SimpleGroupingItemsControlConverterParameter}}"
                     SelectionChanged="ListBox_SelectionChanged"
                     Height="280" Width="570"
                     HorizontalAlignment="Left" VerticalAlignment="Top">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel Orientation="Horizontal" Width="540" Loaded="WrapPanel_Loaded" />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
...
<DataTemplate>
                        <Viewbox Stretch="UniformToFill">
                            <Border BorderBrush="DarkGray" BorderThickness="1" Margin="5,5,5,5">
                                <StackPanel Orientation="Vertical" Width="100" Height="50">
                                    ...
                                </StackPanel>
                            </Border>
                        </Viewbox>
                    </DataTemplate>
...

Meine Ziel ist es jetzt, zusätzlich zu diesen Funktionalitäten eine Gruppierung einzubauen. Wenn ich darin z.B. 15 Tiere habe, haben diese jeweils eine bestimmte Spezies (Fisch, Katze, Hund). Die Items sollen bei aktivieren der Gruppierung mit einem Expander angezeigt werden.

Die gängigen Lösungen im Internet für Gruppierungen funktionieren leider nicht. Sobald ich den Wert ItemWidth oder ItemHeight des Wrappanels setze, wird auch das Item für die Gruppierung auf die Breite gesetzt. Das darf aber nicht sein, da die Gruppe die ganze Zeile ausfüllen muss.

Wie kann ich innerhalb eines Wrappanels in einer Listbox so etwas umsetzen? Hat so etwas schon mal jemand gemacht?

Würde mich über Hilfe freuen.

mfg

Easy

10.06.2011 - 11:40 Uhr

Hallo,

hab es nach einigen weiteren Versuchen und einer schönen Anleitung im Internet doch noch hinbekommen. Da ich leider im Firmennetzwerk keine Dateien hochladen kann, poste ich den kompletten funktionierenden Code so. Die ursprüngliche Quelle, die noch ein paar Bugs enthält, findet ihr hier.

Mainpage.xaml

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:interaction="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:local="clr-namespace:SilverlightApplication1"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <UserControl.Resources>
        <Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
            <Setter Property="Padding" Value="3"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Top"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="TabNavigation" Value="Local"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="{TemplateBinding Background}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver">
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="SelectionStates">
                                    <VisualState x:Name="Unselected"/>
                                    <VisualState x:Name="Selected">
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="FocusVisualElement">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unfocused"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}"/>
                            <Rectangle x:Name="FocusVisualElement" RadiusY="1" RadiusX="1" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <DataTemplate x:Key="ThumbnailTemplate">
            <Border BorderThickness="1" BorderBrush="#FFECECEC" Margin="5">
                <StackPanel>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <i:Interaction.Behaviors>
                            <ei:DataStateBehavior Binding="{Binding IsSelected, Mode=TwoWay}" Value="True" TrueState="Selected" FalseState="Unselected"/>
                        </i:Interaction.Behaviors>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="Selection">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.25"/>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="fillColor" d:IsOptimized="True"/>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="fillColor2" d:IsOptimized="True"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unselected"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <VisualStateManager.CustomVisualStateManager>
                            <ei:ExtendedVisualStateManager/>
                        </VisualStateManager.CustomVisualStateManager>
                        <Rectangle x:Name="fillColor" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1" Grid.ColumnSpan="2"/>
                        <Rectangle x:Name="fillColor2" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1" Grid.ColumnSpan="2"/>
                        <Image Source="error_thumbnail.png" HorizontalAlignment="Left"  Margin="5,0,0,0" x:Name="thumb" Width="80" Height="125"/>
                        <CheckBox x:Name="checkBox" IsChecked="{Binding IsSelected, Mode=TwoWay}" Grid.ColumnSpan="1"  Margin="88,5,0,0" Click="CheckBoxChanged"/>
                    </Grid>
                </StackPanel>
                <Border.Effect>
                    <DropShadowEffect BlurRadius="15" Color="Gray" Direction="-45" Opacity="0.5" ShadowDepth="5"/>
                </Border.Effect>
            </Border>
        </DataTemplate>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White" >
        <ListBox
			x:Name="lbThumbnails" 
			SelectionMode="Extended"
			RenderTransformOrigin="0.5,0.5"
			BorderBrush="{x:Null}"
			Visibility="Visible"
            Margin="0,0,0,100"
            Height="200"
            ItemContainerStyle="{StaticResource ListBoxItemStyle1}"
            ItemTemplate="{StaticResource ThumbnailTemplate}"
            Background="Bisque"
            >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel Orientation="Horizontal"  ItemWidth="125" ItemHeight="145" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.Template>
                <ControlTemplate>
                    <ScrollViewer>
                        <ItemsPresenter/>
                    </ScrollViewer>
                </ControlTemplate>
            </ListBox.Template>
        </ListBox>
        <TextBlock Text="{Binding ElementName=lbThumbnails, Path=SelectedItem.IsSelected}" FontWeight="Bold" Margin="0,218,0,82" VerticalAlignment="Bottom"/>
        <CheckBox Content="Aktuelles Objekt selektiert" IsChecked="{Binding ElementName=lbThumbnails, Path=SelectedItem.IsSelected}" VerticalAlignment="Bottom"/>
        <Button Click="showActive" Height="35" Width="75" HorizontalAlignment="Left" VerticalAlignment="Bottom" Content="Show active parts" />
    </Grid>
</UserControl>

Mainpage.xaml.cs:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace SilverlightApplication1
{
    public class Dokument : INotifyPropertyChanged
    {
        private string name = string.Empty;
        private bool isSelected = false;

        public string Name
        {
            get { return this.name; } 
            set 
            {
                this.name = value;
                Changed("Name");
            }
        }

        public bool IsSelected
        {
            get { return this.isSelected; }
            set { isSelected = value;
                Changed("IsSelected");
            }
        }
    
        public Dokument(string name)
        {
            this.Name = name;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void Changed(string propertyName)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

    public class DokumentenListe : ObservableCollection<Dokument>
    {

        public void AddItems()
        {
            this.Add(new Dokument("Christian"));
            this.Add(new Dokument("Thomas"));
            this.Add(new Dokument("Alex"));
            this.Add(new Dokument("Stefan"));
        }
    }

    public partial class MainPage : UserControl
    {

        public DokumentenListe DokumentList = new DokumentenListe();
        List<Dokument> addList = new List<Dokument>();
        List<Dokument> deleteList = new List<Dokument>();

        public MainPage()
        {
            InitializeComponent();

            this.DokumentList.AddItems();

            this.lbThumbnails.Loaded += new RoutedEventHandler(lbThumbnails_Loaded);
            this.lbThumbnails.SelectionChanged += ListSelectionChanged;
        }

        void lbThumbnails_Loaded(object sender, RoutedEventArgs e)
        {
            this.lbThumbnails.ItemsSource = this.DokumentList;

            if(this.lbThumbnails.Items.Count > 0)
                this.lbThumbnails.SelectedIndex = 0;
        }

        void CheckBoxChanged(object sender, RoutedEventArgs e)
        {
            CheckBox box = (CheckBox)sender;
            Grid grid = (Grid)box.Parent;
            Dokument dokument = (Dokument)grid.DataContext;

            if (dokument.IsSelected)
            {
                addList.Add(dokument);
            }
            else
            {
                deleteList.Add(dokument);
            }
        }

        void ListSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // these both just need to toggle
            foreach (object o in e.AddedItems)
            {
                Dokument p = o as Dokument;
                p.IsSelected = !p.IsSelected;
            }
            foreach (object o in e.RemovedItems)
            {
                Dokument p = o as Dokument;
                p.IsSelected = !p.IsSelected;
            }

            foreach (Dokument dok in addList)
            {
                dok.IsSelected = !dok.IsSelected;
            }
            foreach (Dokument dok in deleteList)
            {
                dok.IsSelected = !dok.IsSelected;
            }

            addList.Clear();
            deleteList.Clear();
        }

        void showActive(object sneder, RoutedEventArgs e)
        {
            string active = string.Empty;

            foreach (Dokument dokument in this.DokumentList)
            {
                if (dokument.IsSelected)
                    active += dokument.Name + Environment.NewLine;
            }

            if (active != string.Empty)
                MessageBox.Show(active);
        }

    }
}

mfg

Easy

09.06.2011 - 15:02 Uhr

Hallo TheGear,

vielen Dank für deinen Vorschlag.

Laut Foreneinträgen und Lösungsvorschlägen, die ich über google gefunden habe, geht das so, aber nur in WPF. In Silverlight soll ich laut MSDN RelativeSource MarkupExtension benutzen:

IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent},Path=IsSelected}"

Das funktioniert leider nicht. Noch eine Idee?

09.06.2011 - 14:17 Uhr

Hallo xxMUROxx,

ich glaube ich muss die Aufgabe etwas detailierter Beschreiben:

Ziel ist es, eine Verbindung zwischen dem ausgewählten ListBoxItem und der Checkbox des ListBoxItems herzustellen. Wenn ich in der ListBox ein Item auswähle, soll gleichzeitig die Checkbox angehakt werden. Wird das Item wieder deselektiert, soll die Checkboxx auch ausgemacht werden.

Der Wert interessiert mich im Code derzeit nicht.

Ich möchte ein 1 zu 1 Binding zwischen ListBox.SelectedItem.IsSelected und der Checkbox.

09.06.2011 - 13:45 Uhr

Hallo zusammen,

ich hänge derzeit an einem Problem mit ListBoxItems.

Folgende Aufgabenstellung:

In einem ListView muss eine Liste von Objekten (z. B. Dokument) angezeigt werden. In dieser Liste gibt es pro Objekt eine Checkbox, welche den Status der Selektion (Property IsSelected) des entsprechenden ListBoxItems darstellen soll.

Dieses Binding klappt leider nicht. Egal was ich probiere, das ganze wird nicht aktualisiert.

Derzeit probiere ich das Binding so:

<ListBox
			x:Name="listBox" 
			SelectionMode="Extended"
			ItemsSource="{Binding DokumentList}"
            VerticalAlignment="Bottom"
			RenderTransformOrigin="0.5,0.5"
			BorderBrush="{x:Null}" Height="400"
			Visibility="Visible" Margin="0,0,0,100">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel Orientation="Horizontal"  ItemWidth="125" ItemHeight="125" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.Template>
                <ControlTemplate>
                    <ScrollViewer>
                        <ItemsPresenter/>
                    </ScrollViewer>
                </ControlTemplate>
            </ListBox.Template>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderThickness="1" BorderBrush="#FFECECEC" Margin="5">
                        <StackPanel Orientation="Horizontal">
                            <Image Source="error_image.png"  Margin="-5,0,0,0" x:Name="thumb" Width="90" Height="120"/>
                            <CheckBox IsChecked="{Binding ElementName=listBox, Path=Items[1].IsSelected}" Margin="1,1,1,1" x:Name="cbxSelecteditem" Width="15" Height="18"  VerticalAlignment="Top" HorizontalAlignment="Right"/>
                        </StackPanel>
                        <Border.Effect>
                            <DropShadowEffect BlurRadius="15" Color="Gray" Direction="-45" Opacity="0.5" ShadowDepth="5"/>
                        </Border.Effect>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Die Textbox ist nur zur Überprüfung, bitte ignoriert sie.

Und hier das entsprechende .cs file:

 public class Dokument : INotifyPropertyChanged
    {
        private bool isSelected = false;

        public string Name { get; set; }

        public bool IsSelected
        {
            get { return this.isSelected; }
            set { isSelected = value;
                Changed("IsSelected");
            }
        }
    
        public Dokument(string name)
        {
            this.Name = name;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void Changed(string propertyName)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

    public partial class MainPage : UserControl
    {

        public ObservableCollection<Dokument> DokumentList;

        public MainPage()
        {
            InitializeComponent();

            DokumentList = new ObservableCollection<Dokument>();
            DokumentList.Add(new Dokument("asdf1"));
            DokumentList.Add(new Dokument("asdf2"));
            DokumentList.Add(new Dokument("asdf3"));
            DokumentList.Add(new Dokument("asdf4"));

            foreach (Dokument dokument in this.DokumentList)
            {
                this.lbThumbnails.Items.Add(dokument);
            }

            this.DataContext = DokumentList;

        }
    }

Sieht jemand was ich falsch mache?

Zusätzlich würde ich auch gerne wissen, wie man auf den ausgewählten Index zugreifen kann.

Hoffe jemand hat eine Idee.

mfg

Easy

*edit: Auf Wunsch von gfoidl verkürzt.
*edit2: gelöst, Stichworte hinzugefügt

Stichworte:_ Silverligth 4, Listbox, ListboxItem, Checkbox, IsSelected_

06.07.2010 - 14:57 Uhr

Hmm, zum fit halten gibts viele Dinge:

Regelmäßige Übungen:

  • Krav Maga
  • Fussball
  • Geocachen
  • Wandern
  • Mein kleiner Sohn

Unregelmäßige Übungen:

  • Volleyball (Nur im Sommer)
  • Snowboarden (Tja, eben nur im Winter 😉 )

Derzeit liegt das ganze aber wegen einer kleinen Sportverletzung brach, mal schaun wann ich wieder was tun kann. Solange gibts nur Hanteln stemmen.

23.05.2010 - 19:28 Uhr

Zur Info an alle: cosmicgirl72 hat sich per Mail bei mir gemeldet und schickt mir ihre Bewerbungsmappe zu. Diese werde ich durchsehen und mit Ihr besprechen.

Danach werden wir die Ergebnisse soweit minimieren, das es für eine Veröffentlichung passt. Sobald wir fertig sind, wird es hier gepostet.

Dies kann ein paar Tage dauern.

mfg

Stefan

23.05.2010 - 12:04 Uhr

Hallo,

@gfoidl: Danke. 🙂

Kann die Tips und Hinweise gerne in diesem oder einem anderen Thread veröffentlichen wenn gewünscht. Ich werde versuchen, die Punkte so objektiv und generell wie möglich zu halten.

Natürlich nur, wenn cosmicgirl72 dem zustimmt.

mfg

Stefan

23.05.2010 - 09:15 Uhr

Hallo cosmicgirl72,

man muss nicht zwingend studiert haben, um einen Job zu bekommen. Je nach Firmengröße ist das Studium auch nicht so wichtig. Bei kleinen und mittelständischen Unternehmen (<50 Mitarbeiter) wird eher weniger darauf geachtet. Es ist wichtiger, das derjenige etwas drauf hat und seinen Job gern macht. Wissen ist anlernbar, Ehrgeiz und Einsatzbereitschaft nicht.

Bei uns in der Firma bin ich teilweise dafür verantwortlich, die Bewerber von ihrer technischen Seite zu überprüfen. Wenn man dabei etwas vorweisen kann (Open-Source-Projekt, Software zum selber nutzen, Unterstützung und Hilfe auf Webseiten wie mycsharp) hat derjenige schon viele Punkte gut. Das heißt für uns, das der Bewerber sich auch in seiner Freizeit mit der Materie beschäftigt. Wer freiwillig damit arbeitet, lernt automatisch und bildet sich so fort.

Zertifikate und Ausbildungen sind schön und gut. Aber nur ein Bruchteil davon kann in der Arbeit effektiv genutzt werden. Die grundlegenden Punkte, die einem in den meisten Schulungen beigebracht werden, sind meiner Meinung nach Grundwissen. Das jemand das .NET Framework nicht auswendig kann ist klar, aber er muss zumindest wissen wo er suchen soll. Schnelles lernen gehört auch zum Beruf eines Informatikers. Als Anwendungsentwickler sollte man auch Wissen aus anderen Bereichen der Informatik haben, z. B. Hardware, PC zusammenbauen, Networking.

Ausnahmsweise hab ich ein Angebot für dich: Wenn du willst, kann ich mir deine Bewerbungsunterlagen anschauen, sie Korrektur lesen und dir ein paar Tips und Verbesserungsvorschläge geben. Hab mir letzten Sonntag das Schien- und Wadenbein gebrochen und hab dadurch etwas Zeit. Natürlich nur, wenn du willst. Die Daten bleiben dabei unter Verschluss und werden nicht weitergegeben. 😉

mfg

Stefan

03.11.2009 - 11:33 Uhr

Hallo gfoidl,

wenn ein Board dabei ist, das mir passt, würd ich mir schon eins zulegen. Das Angebot selbst ist schon mal sehr gut 👍

Was mich gerade stört ist, das die Boarderseite unter Opera nicht immer richtig funktioniert. Wenn ich unten links oder rechts auf das bunte Board klicke, lädt die Seite nicht mehr. Nur nach drücken von F5 / STRG+R reagiert die Seite wieder, wenn ich auf einen Link klicke.

Information:
Version: 10.01
Build: 1844
Plattform: Win32
Betriebssystem: Windows XP
Java: Java ist nicht installiert
XHTML+Sprache: Das Plug-in ist nicht geladen

Nur mal so am Rande als kleiner Tip. 😉

mfg

Easy

05.10.2009 - 09:31 Uhr

Hallo Steffen,

hab soeben die russische Übersetzung bekommen. Sieht recht gut aus. Du kannst Sie dir hier downloaden.

Um das Chinesisch zu testen bräuchte ich jemanden, der es mir übersetzt.

mfg

Stefan

*edit: Dummes Rechtschreibfehler weggewischt.

02.10.2009 - 10:21 Uhr

If object1 Is Nothing AndAlso object1.property1 Then
    object1 = new object()
End If

🤔

01.10.2009 - 07:33 Uhr

Hallo Steffen,

erstmal danke für das Lob, sowas hört man gerne.

Automatisierungsfunktion
Also deine Idee für eine Automatisierungsfunktion zum erstellen der ersten Übersetzungsdatei gefällt mir. Hab dazu gleich mal ein Ticket erstellt und für die nächste Version zugewiesen.
0000035: Extend GUI for automatic creating the first translation file

Übersetzung von gleichnamigen Controls
Ja, bis jetzt werden diese gleich übersetzt. Hab schon mit dem Gedanken gespielt, eine eigene Spalte für den vollen Namespace oder den Namen des Forms / Controls mit anzugeben. Wäre zwar möglich, sieht aber dann auf der Oberfläche wieder etwas "overweight" aus. Wenn zwingend benötigt könnte man sowas aber innerhalb von einem Manntag implementieren. Aber in ca. 90% der Fälle (persönlicher Erfahrungswert) ist es sowieso erwünscht, das die Controls den gleichen übersetzten Text haben. Das erspart viel Arbeit.

Kann Dein Translator auch mit "{0}" umgehen?
Jup, kann er. Derzeit keine Probleme bekannt.

Wie geht dein Tool mit Umlauten und Sonderzeichen um?
(Russisch, Chinesisch)

Das weiß ich leider noch nicht. Mein Tool wird zwar gerade ins Russische übersetzt, aber ich hab diese Datei noch nicht gesehen. Und bei Chinesisch tu ich mich leider noch härter, wenn man sowas nicht spricht und nicht mal schreiben kann.

An diesem Punkt würde ich mich sehr über die Mithilfe der Community freuen. Wenn jemand eine kurze Übersetzung auf Chinesisch machen kann respektive auf Chinesisch testen könnte, wäre das super!

Import / Export Funktion
Derzeit gibt es noch keine Import- / Export-Möglichkeit. Für solche externen Übersetzungen macht das ganze aber Sinn. Was wäre den hier benötigt? Excel? Access-MDB? Hab dafür gleich mal ein Ticket erstellt: 0000036: Create an import / export function

Sind schon mal zwei super Vorschläge, die mir gefallen. Jetzt kommts drauf an, was ihr brauchen würdet bzw. wie eure Vorstellungen davon sind. Hab für dieses Jahr immer noch 30 Tage Urlaub, somit wäre eine eingermaßen "Zeitnahe" implementierung auch möglich 😉.

mfg

Easy

P.S.: Welche der Punkte sind für euch die wichtigsten, damit ihr dieses Tool benutzen würdet?

19.09.2009 - 21:02 Uhr

Hallo zusammen,

soeben habe ich die letzten Tests abgeschlossen und die aktuellen Dateien hochgeladen. Folgende Punkte wurden implementiert:

mfg

Easy

18.09.2009 - 12:18 Uhr

70 Zeilen? pfff, Minimalist. Unter 1500 Zeilen Code ist eine Funktion ja noch nicht mal erwachsen! 8o Programmierer such und schlagen will

14.09.2009 - 11:20 Uhr

Das Schlagwort dafür ist Mono. Das ist das Framework für Linux. Das ist zwar nicht von Microsoft, aber das einzige was unter Linux verfügbar ist.

10.09.2009 - 10:53 Uhr

Hallo t2t,

wir benutzen privat sowie beruflich derzeit Mantis. Hinzu kommen vier Plugins von deboutv.free.fr. Ich muss gestehen das ich mein Mantis-System aber schon etwas modifziert habe, um es unseren firmeninternen Projektansprüchen gerecht zu werden.

Persönlich kann ich dir nur zu Mantis raten. Ein besseres System ist mir noch nicht untergekommen. Es ist schnell, einfach zu bedienen, wartungsarm und leicht zu modifizieren. Und es ist (fast) alles vorhanden was man für einen Einsatz im Projekt braucht. Was fehlt kann man über die Oberfläche hinzufügen.

mfg

Easy

*edit: Wenn du dir meinen Bugtracker mal angucken willst, kannst das einfach hier machen.

27.08.2009 - 13:39 Uhr

Hallo deerhunter,

dein Hinweis wurde aufgenommen und wird in der nächsten Version auch so umgesetzt. Guter Tip 👍

In meinem Bugtracker findest du ein entsprechendes Ticket dazu:
0000034: Change XML structure to "better" xml.

Der Link zum linqtoxsd ist auch sehr interessant, das werde ich mir noch genauer anschauen. Sieht auf den ersten Blick zwar etwas "overweight" aus, aber mal gucken. Mir ist wichtig, das mein Tool schlank, einfach zu bedienen und leicht zu benutzen ist.

Als nächsten Release-Termin mit allen drei offenen Tickets plane ich Ende September. Es ist zwar nicht so viel Arbeit für dieses Tool, aber die normale Arbeit sowie andere private Projekte wollen auch noch gemacht werden. Und zusätzlich habe ich gerade Urlaub, was meinen Anreiz vor dem PC zu sitzen noch weiter minimiert. 😉

mfg

Easy

P.S.: Über weitere Verbesserungsvorschläge würde ich mich freuen!

23.07.2009 - 15:50 Uhr

Wie soll ich mir Opera nach einer Neuinstallation downloaden, wenn ich keinen Browser habe? 🙄

16.07.2009 - 10:52 Uhr

Habs mir gerade downgeloaded, installiert und angeschaut. Das ist leider nicht das, was ich suche. Viel zu viel overhead, ich muss einen ganzen Server installieren, und die Logfileauswertung ist für meine Zwecke leider nicht zu gebrauchen.

Trotzdem danke für den Hinweis 👍

15.07.2009 - 19:26 Uhr

Hallo Abt,

erstmal danke für die Antwort.

Habs mir vorher schon mal angesehen. Für die paar Kleinigkeiten sieht mir das ganze irgendwie zu heavy aus. Noch dazu kann ich es leider nicht testen, da der Download nicht geht (Windows XP 32bit). Werds morgen nochmal probieren, evtl. geht der dann...