Laden...
Avatar #avatar-2329.gif
xxxprod myCSharp.de - Experte
Programmierer Österreich\Wien Dabei seit 13.04.2006 1.378 Beiträge
Benutzerbeschreibung

Forenbeiträge von xxxprod Ingesamt 1.378 Beiträge

03.12.2010 - 13:47 Uhr

Stimmen die Dateiversionen zusammen. Ist die Assembly wirklich die Gleiche? Ich hab auch schon mal ewig gesucht bis ich drauf gekommen bin, dass eine Assembly beim Batch-Script nicht (richtig) mitkopiert wurde und somit immer alter Code ausgeführt wurde.

Lg XXX

03.12.2010 - 11:34 Uhr

Ich seh hier kein Problem... Das ist eines der Möglichkeiten Generalisierungen in der Datenbank abzubilden und damit darf Hibernate oder sonst wer kein Problem haben.

Lg XXX

03.12.2010 - 10:49 Uhr

Aber leider keine kompakte Lambda Überladung.

03.12.2010 - 10:42 Uhr

Zumindest eine kompaktere Lösung 😃


        private List<MyObject> GetLocksWithoutDuplicates(List<object> myEntries)
        {
            return myEntries.GroupBy(entry => entry.Property).Select(g => g.First()).ToList();
        }

Lg XXX

30.11.2010 - 14:15 Uhr

...

sondern außschließlich von deiner DLL was etwas schöner ist im Allgemeinen.
Findest Du? Ich würde schon aus Gründen der Pflege beide Dlls überall referenzieren wo sie benötigt werden. Bei Änderungen muss sonst immer noch zusätzlich der Wrapper angepasst werden.

Gruß, MarsStein

Nein man kann das wahrscheinlich nicht verallgemeinern... Es kommt auf die Umstände drauf an, ob Abhängigkeiten eine Rolle spielen oder nicht.

30.11.2010 - 13:16 Uhr

Nein. Wenn du keine Abhängigkeiten von deinem Programm auf die UnterDLL haben willst, musst du die Objekte von der UnterDLL in deiner DLL duplizieren und nur diese Typen nach außen geben.

Lg XXX

//EDIT: Das heißt nicht, dass du die UnterDLL dann nicht mehr brauchst, sondern nur, dass dein Programm nicht mehr direkt von der UnterDLL abhängig ist sondern außschließlich von deiner DLL was etwas schöner ist im Allgemeinen.

30.11.2010 - 10:14 Uhr

Eine alternative wäre auch eine Extensionmethode:


public static Type ElementType<T>(this IEnumerable<T> items)
{
   return typeof(T);
}

Lg XXX

29.11.2010 - 15:07 Uhr

Hallo m.grauber,

meine Empfehlung ist alle relevanten Informationen, die du nach einem Pagewechsel noch benötigst in einem ViewModel zu halten, da eben alles in der View bei Pagewechsel verloren geht. Und dort wäre das Äquivalente der Konstruktor oder eine eigene Intialisierungsmethode.

Lg XXX

29.11.2010 - 11:28 Uhr

Wenn du ein typisiertes Array wie zB int[] hast, kannst du mit

int[] myArray;

myArray.GetType().GetElementType()

den ElementTyp abfragen. Bei generischen Collections mittels

List<int> list;

list.GetType().GetGenericArguments()[0]

Wenn du allerdings so wie du erwähnt hast beliebige Typen in deinem Array hälst, dann hat dieses auch keinen konkreten Elementtyp und somit ist dieser auch nicht ermittelbar.

Lg XXX

29.11.2010 - 10:13 Uhr

Diesen Link habe ich dazu gefunden.

Lg XXX

29.11.2010 - 09:47 Uhr

[LightCore] - weil es sehr einfach in der Handhabung ist.

In der letzten Firma haben wir Unity eingesetzt, was aber wahrscheinlich dank der Komplexität(keine Ahnung) dauernd Probleme gemacht hat.

26.11.2010 - 10:09 Uhr

Nicht das Replace ist dein Problem sondern das Parse in Kombination mit der eingestellten Culture... Bei deinem Rechner ist offenbar '.' als Tausendertrennzeichen aktiviert weshalb der Punkt auch nicht als Komma geparst wird. Um sicherzustellen, das das mit dem Komma überall funktioniert, müsstest du die Culture fix auf de-DE oder en-GB oder so einstellen.

Lg XXX

26.11.2010 - 08:26 Uhr

Aber du brauchst doch den Servicelocator nur dort, wo du erst zur Laufzeit weißt welche oder wieviele Objekte du brauchst.

Wenn ich schon im vorhinein weiß, dass mein "MainForm" ein "PopupForm" hat, dann lass ich das gleich im Konstruktor injecten und verwende nur diese eine Instanz weiter. Ich brauche also hier keinen ServiceLocator im MainForm.

Wenn ich aber eine beliebige Anzahl an Fenstern aus meiner "MainForm" aus öffnen kann, brauche ich eine Art Factory, die mir die Fenster erzeugt und diese wird wiederum den ServiceLocator behinhalten. Aber außer in Factories wirst du nirgends den ServiceLocator direkt brauchen.

Und gegen einer solchen Verwendung spricht mMn. nichts - man trennt die Zuständigkeiten und bleibt ausgezeichnet testbar.

Lg XXX

25.11.2010 - 16:21 Uhr

Falls sonst von niemanden etwas kommt kannst versuchen das Settingsfile zu löschen und neu anzulegen.

Lg XXX

25.11.2010 - 13:44 Uhr

Kann mir nicht vorstellen, dass das von der Abhängigkeit MyUC->MyObj kommt sondern nur anders herum. Hat dein Datenobjekt irgendeine Referenz auf das UC?

Lg XXX

24.11.2010 - 13:34 Uhr

Zu a) Stil ist Geschmackssache. Ich bevorzuge es soviel wie möglich in XAML abzuhandeln.
Zu b) Siehe (a).

Bei einem kleinen Versuch gerade eben, hat das SelectionChanged Event nicht automatisch ausgelöst. Es sollte nur auslösen wenn sich die Selektion auch wirklich verändert was es bei dir wahrscheinlich auch tut.

Lg XXX

24.11.2010 - 12:05 Uhr

Das Frag ich mich auch denn der Codeausschnitt den du gepostet hast funktioniert bei mir einwandfrei.

Überprüfe nochmal den Wert, den du SetValue zur Laufzeit übergibst...


    static void Main(string[] args)
    {
        MyClass<double> c = new MyClass<double>();
        c.SetValue(0.5);
    }
    public class MyClass<T>
    {
        public void SetValue(T value)
        {
            Console.WriteLine(value);
        }
    }

@herbivore 0.5 ist aber schon double und für float muss man f angeben....?!?

Lg XXX

24.11.2010 - 11:17 Uhr

Hast du die DataContexte der UserControls überprüft ob dort auch wirklich die richtigen ViewModels drinnen sind? Der DataContext wird vererbt wenn er nicht überschrieben wird und wenn das richtige VM drinnen ist sollte auch auf die richtigen Daten zugegriffen werden.

Lg XXX

24.11.2010 - 11:00 Uhr

Also erstens mal was zum Loaded Event. Das wird bei der ersten Erzeugung des Objektes gefeuert, was soviel bedeutet, dass bei jedem Aufruf von Loaded du dich in einem neuen Objekt befindest.

In WPF werden die GUI Elemente erzeugt, wenn sie angezeigt werden und auch wieder verworfen, wenn sie nicht mehr gebraucht werden.(Beispiel TabControl - wenn du durch die Tabs schaltest und in jedem Tabitem ein UserControl liegt, wird jedes UserControl neu erzeugt wenn man wieder dorthin navigiert). Insofern eignet sich ein Frameworkelement nicht wirklich zum Halten von Daten.

Falls dir MVVM noch kein Begriff ist dann lies dich da mal rein denn damit kann dir sowas nicht passieren.

Lg XXX

23.11.2010 - 12:08 Uhr

Hast du die InnerException rekursiv bis zuletzt durchgesehen oder nur die erste Ebene?

Lg XXX

23.11.2010 - 11:40 Uhr

Schon mal die InnerExceptions durchgeschaut? TargetInvocationException hat meistens noch mehr Informationen.

Lg XXX

23.11.2010 - 11:20 Uhr

Ja aber das passt doch perfekt.

Du übergibst die ganze Settingsklasse als Parameter deiner Viewmodels und die horchen per PropertyChanged auf die Änderungen.

Im Prinzip genauso wie dus jetzt machst nur das du halt kein Singleton dann hast.

lg XXX

23.11.2010 - 11:11 Uhr

Die reagieren auf Änderungen der Globalen Settings? Wie tun die das?

23.11.2010 - 10:54 Uhr

Du kannst deine "Globalen Settings" auch immer als Parameter deiner ViewModels übergeben, dann brauchst du dieses SingleTon Konstrukt nicht und bleibst flexibler.

Lg XXX

23.11.2010 - 09:23 Uhr

Stimmt die Variante ist mir erst am Abend dann eingefallen wo ich kein Internet mehr hatte. Ist sicher abgesehen von den Wartungsintervallen die elegantere Lösung.

Lg XXX

22.11.2010 - 17:40 Uhr

Mag vielleicht nicht elegant sein aber so wie ich das sehe gibts keine Alternativen zu deinem Problem.

Und ja tauschen ist hier die falsche Variante...

Dort wo ein Item eingefügt wird müssen ab dem Item alle Nachkommenden inkl. dem neuen Item neu durchnummeriert werden.

Die Sortierung im Allgemeinen ist hier ja nicht das Problem ich vermute du findest das Updaten von x Datensätzen wegen eines Sortiervorgangs unelegant und dem stimm ich dir auch zu, wüsst aber trotzdem keine bessere Lösung.

Lg XXX

22.11.2010 - 17:09 Uhr

Nach langem hin und her, schauts eigentlich gar nimma so kompliziert aus:

  • Einfach alle Items durchsortieren von 1-n
  • Jeder Benutzer kann seine Items sortieren(Ansicht durch Location eingeschränkt). Sortieren heißt ja nur die Order_number der zu sortierenden Items vertauschen bzw. verschieben. Also hast du nie doppelte Sortiernummern.
  • Benutzer 3 unterscheidet sich in der Sortierlogik nicht von den anderen(lediglich die Sicht auf die Items wird erweitert)

Lg XXX

22.11.2010 - 15:45 Uhr

Was heißt die Sortierung gilt Global aber jeder sieht nur seine Sortierung... und wenn einer alles sehen darf was heißt dann "zusammengewürfelt"? Vielleicht postest mal ein kleines Beispiel mit Pseudodaten, damit man sich mehr darunter vorstellen kann? Für mich hört sich das zur Zeit noch widersprüchlich an.

Lg XXX

22.11.2010 - 15:14 Uhr

Die Sortiertabelle braucht noch die BenutzerId dann kann dir egal sein, welcher Benutzer wie sortiert und jeder behält seine eigene Sortierung.

Lg XXX

22.11.2010 - 10:24 Uhr

Hallo viggi,

hier ein kleines Beispiel:

UC1-XAML:


<UserControl x:Class="WPFTester.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBlock Text="UC1"/>
        <Button Content="Click" Click="Button_Click"/>
    </StackPanel>
</UserControl>

UC1-Code:


    public partial class UserControl1 : UserControl
    {
        public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
            "Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));

        public event RoutedEventHandler Click
        {
            add { AddHandler(ClickEvent, value); }
            remove { RemoveHandler(ClickEvent, value); }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            base.RaiseEvent(new RoutedEventArgs(ClickEvent, this));
        }
    }

UC2-XAML:


<UserControl x:Class="WPFTester.UserControl2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBlock Text="UC2"/>
        <Button Content="Click" Click="Button_Click"/>
    </StackPanel>
</UserControl>

UC2-Code:


    public partial class UserControl2 : UserControl
    {
        public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(
            "Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl2));

        public event RoutedEventHandler Click
        {
            add { AddHandler(ClickEvent, value); }
            remove { RemoveHandler(ClickEvent, value); }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            base.RaiseEvent(new RoutedEventArgs(ClickEvent, this));
        }
    }

Window-XAML:


<Window x:Class="WPFTester.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="clr-namespace:WPFTester">
    <StackPanel>
        <local:UserControl1 x:Name="uc1" Visibility="Visible" Click="UserControl1_Click"/>
        <local:UserControl2 x:Name="uc2" Visibility="Collapsed" Click="UserControl2_Click"/>
    </StackPanel>
</Window>

Window-Code:


namespace WPFTester
{
    public partial class Window1 : Window
    {
        private void UserControl1_Click(object sender, RoutedEventArgs e)
        {
            uc1.Visibility = Visibility.Collapsed;
            uc2.Visibility = Visibility.Visible;
        }

        private void UserControl2_Click(object sender, RoutedEventArgs e)
        {
            uc2.Visibility = Visibility.Collapsed;
            uc1.Visibility = Visibility.Visible;
        }
    }
}

Lg XXX

22.11.2010 - 09:40 Uhr

Habe in meiner letzten Firma IBEX verwendet und das war nicht so schlecht. Ist aber kostenpflichtig.

Lg XXX

22.11.2010 - 09:15 Uhr

Meiner Meinung nach ist das keine Aufgabe eines DI-Containers sondern einer eigens dafür entwickelten Factory, welche dann im Container registriert wird. In deinen Objekten rufst du dann nur Factory oder Provider GetGuiElements oder was auch immer auf und du bekommst was du brauchst.

Lg XXX

18.11.2010 - 16:27 Uhr

Du musst nicht wissen wie man was macht sondern nur wie man danach sucht. 😉

  1. Treffer bei Googlesuche nach "Wlan ssid c#" hat schon ganz brauchbaren Inhalt.

Lg XXX

18.11.2010 - 15:57 Uhr

Folgendes hab ich zwar in TSQL fabriziert aber bis auf das Except kommt nicht wirklich was spezifisches vor. Ist wahrscheinlich auch nicht die performateste Variante. 😃


CREATE TABLE Warenkorb
(
	WarenkorbId int,
	ArtikelId int
)

insert Warenkorb values(1, 1)
insert Warenkorb values(1, 2)

insert Warenkorb values(2, 1)

insert Warenkorb values(3, 1)
insert Warenkorb values(3, 2)

insert Warenkorb values(4, 2)


select w1.WarenkorbId, w2.WarenkorbId
from Warenkorb w1
join Warenkorb w2 on w1.WarenkorbId<>w2.WarenkorbId
	AND NOT Exists
	(
		select ArtikelId from Warenkorb tmp1 where tmp1.WarenkorbId=w1.WarenkorbId 
		except 
		select ArtikelId from Warenkorb tmp2 where tmp2.WarenkorbId=w2.WarenkorbId
	)
	AND NOT Exists
	(
		select ArtikelId from Warenkorb tmp1 where tmp1.WarenkorbId=w2.WarenkorbId 
		except 
		select ArtikelId from Warenkorb tmp2 where tmp2.WarenkorbId=w1.WarenkorbId
	)
group by w1.WarenkorbId, w2.WarenkorbId

Lg XXX

18.11.2010 - 15:36 Uhr

Controls erben bestimmte Eigenschaften wie unter anderem auch den Font von ihren Parents sofern sie nicht explizit gesetzt wurden. Wenn du also diese Labels in einem Panel oder so zusammenfassen könntest, könntest du durch Ändern der Panel-Font Eigenschaft die Fonts aller Labels verändern.

Lg XXX

18.11.2010 - 15:17 Uhr

Das Thema Focusübergabe könnte auch noch etwas Tricky werden, weil zum Zeitpunkt des LostFocus Events noch kein anderes Control den Focus hat(soweit ich das in Erinnerung habe). Evt. löst du das mit einem Timer, sodass du erst nach einer bestimmten Zeit nach dem Lostfocus event prüfst ob das aktuell Fokusierte Element entweder ein Eingabebutton oder ein Textfeld ist.

Lg XXX

18.11.2010 - 14:26 Uhr

Sehe zum ersten mal dynamic in Action... schauder 😃

Wieso castest du nicht "value" nach IList(nicht generisch). Dort hast du gleich auch die Count Eigenschaft dabei um nicht mit Exceptions rumhantieren zu müssen.

etwa so:


IList list = value as IList;
if(list!=null) //hier hast du also deine generalisierung
{
  if(index < list.Count)
  {
     return list[index];
  }
  else
  {     
     //TODO: do something senseful for value types
     Type type = value.GetType().GetGenericArguments().FirstOrDefault();
     
     return type != null && type.IsValueType
       ? Activator.CreateInstance(type) 
       : null;
  }
}
else
{
  //do something else
}

Lg XXX

18.11.2010 - 11:25 Uhr

Hallo Runnable,

so oder so ähnlich sollte es funktionieren:

"{Binding Path=DeineCollection, Converter=DeinConverter, ConverterParameter=DeinIndex}"

Lg XXX

18.11.2010 - 11:22 Uhr

Das mit dem Focus zurück geben find ich keine schlechte Lösung.

Während dem Click(also MouseDown) darf der Focus ja weg sein und sobald der Click vorbei ist, Focusierst du wieder das zuletzt focusierte Element. Die Cursorposition musst so oder so in jedem Fall aktualisieren sobald du den Text veränderst.

Wenn deine Eingabebuttons geclickt werden, merkst du das und fährst nicht automatisch die Tastatur wieder ein. Nur wenn die Textbox den Focus verliert und keiner deiner Eingabebuttons den Focus bekommt, dann fährst du sie wieder ein.

Lg XXX

17.11.2010 - 14:41 Uhr

Hier mal was zum spielen und ausprobieren:



    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();
        collection.Add("text");
        Console.WriteLine(collection[0]);
        Console.WriteLine(((ObservableCollection<string>)collection)[0]);        
        Console.WriteLine(((IList)collection)[0]);
        Console.WriteLine(((IList<string>)collection)[0]);
    }

    public class MyCollection : ObservableCollection<string>, IList, IList<string>
    {
        public new string this[int index]
        {
            get
            {
                return "Indexer";
            }
            set
            {
                throw new NotImplementedException();
            }
        }
        object IList.this[int index]
        {
            get
            {
                return "IList Indexer";
            }
            set
            {
                throw new NotImplementedException();
            }
        }
        string IList<string>.this[int index]
        {
            get
            {
                return "IList<string> Indexer";
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    }

Lg XXX

17.11.2010 - 08:12 Uhr

Hmm wenn man auf Classic Ansicht ist, kann man mit CollapseAll alles einklappen. Aber dorthin zu kommen dauert länger als ein Strg-End um ganz runter zu scrollen und die Einstellungen bleiben auch nicht gespeichert da man dort ohne Login unterwegs ist soweit ich das sehe.

//Edit: Anscheinend merkt sich die Seite doch die letzten Einstellungen. Also nachdem ich auf Classic umgestellt hab kommen alle MSDN Seiten in dem Format und man hat oben links gleich den CollapseAll Button zur Verfügung.

Lg XXX

16.11.2010 - 08:10 Uhr

Ich habs nicht probiert aber es scheint so als wären Hacks durch Reflection relativ leicht möglich? Wenn man den Gegner "o.o" anschaut kommt einem der Verdacht schon mal auf. 😃

15.11.2010 - 14:30 Uhr

Also als erstes muss ich dir mal zu dem tollen Spiel gratulieren. Macht echt Spaß! 😃

Und was mir aufgefallen ist: Man kann sich vor Ende einer Runde "retten" indem man einfach den Kampf abbricht. Hier sollten die Punkte meiner Meinung nach dem Gegner zugeschrieben werden.

Lg XXX

//Edit: Wenn eines der beiden Raumschiffe invisible ist, fliegen beide blind durchs All, was glaub ich nicht ganz korrekt ist.

//Edit²: Mir geht beim MyData Objekt die aktuelle Health-Eigenschaft ab ohne der weiß kann man nicht feststellen ob man eher ein Health Boni braucht oder doch weiter attackieren soll.

//Edit³: Bei einem Levelwechsel (im Tainingsmode) wird die Klasse nicht neu erzeugt sondern weiterverwendet. Dadurch werden aber Membervariablen nicht zurückgesetzt.

12.11.2010 - 15:45 Uhr

Genau ich hab Changetracking selber implementiert und die Logik steckt in den BL-klassen.

Bei mir gibts:

Services: Verwenden Repositories
ViewModels: Verwenden Services oder Repositories
Repositories: Verwenden EF

Alle zusammen verwenden die gleichen Domain-Objekte - bei mir DTO(DataTransferObjects) genannt und besitzen keinerlei Logik. Könnte sein, dass ich mich gerade vorher mit dem POCO begriff vergriffen hab. Bin mir nie ganz sicher wofür der eigentlich steht. 😃

12.11.2010 - 14:53 Uhr

Genau so mach ich das. 😃

Lg XXX

//EDIT: Sagt aber niemand das das eine optimale/beste Lösung ist. So mach ich das halt eben zur Zeit. 😃

12.11.2010 - 14:34 Uhr

Hallo Pezor,

für sowas hab ich auch oft einen Timer verwendet:

Die Ausführung soll erst beginnen, wenn der Timer seine Intervall abgelaufen hat jedoch wird der Timer bei jedem Event neu gestartet sodass bei häufigem Aufrufen der Methode (wie beim Drag der Form) nur der letzte Aufruf wirklich verarbeitet wird.
Wird allerdings diese Zeitspanne überschritten besteht wieder das alte Problem, dass auf die Verarbeitung gewartet werden muss.

Lg XXX

12.11.2010 - 14:26 Uhr

Hallo serial,

ich hab meine BusinessLogik so entwickelt, dass sie komplett unabhängig von den Linq Entities ist und auch Statuslos. Auch wenn ich keine verteilte Anwendung programmiere, finde ich die Trennung so schöner. (Repository verwendet intern die Linq Entities gibt aber nach außen hin POCOs weiter)

Mit EF4.0 hätt ich gleich alles mit POCOs gelöst aber die Option hatte ich leider nicht.

Lg XXX

12.11.2010 - 12:38 Uhr

Sieht jetzt auf den ersten Blick nicht so mörder Schwierig aus?


SELECT  ...

FROM rechnung r 
INNER JOIN Kunde e ON  e.ID_Kunde = r.FK_Empfaenger
INNER JOIN re_positionen rea ON r.ID_RE = rea.FK_RE_ID    
INNER JOIN artikel a ON rea.FK_ART_ID = a.ID_Art

WHERE r.Datum like '2010-08%'

Lg XXX

12.11.2010 - 11:10 Uhr

Hallo Don,

soweit ich das weiß, ist das die einzige Methode um auf veränderte Datensätze zuzugreifen. Was passt dir denn daran nicht?

Lg XXX

12.11.2010 - 09:42 Uhr

Mit Reflection überschreibt man nichts sondern man holt sich damit Informationen über Objekte und deren Aufbau.

Und was genau meinst du mit überschreiben? Du willst das sich eine Methode in einer Assembly anders verhält als vom Author vorgesehen?

Lg XXX