Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von MarsStein
Thema: Auf Übergeordnete Eigenschaften zugreifen
Am im Forum: Grundlagen von C#

Hallo,

Zitat
Nur wie sonst schafft man eine saubere Trennung?
Könnte man z.B. auch über ein Interface lösen:

interface IStatusHolder
{
    int Status { get; }
}

class Basisklasse: IStatusHolder
{
...
}

class EinzelnesElemente
{
    private IStatusHolder StatusHolder { get; set; }
    EinzelnesElemente(IStatusholder statusHolder)
    {
        StatusHolder = statusHolder;
    }

    public string StatusAbfragen()
    {
        return Convert.ToString(StatusHolder.Status);
    }
}

Dann ist es vollkommen egal, ob der Status von Basisklasse osder sonst irgendwoher kommt. Eine feste Kopplung gibt es nur noch zum Interface.
Und dann kann man sich überlegen, ob IStatusHolder bereits auch ein INotifyPropertyChanged ist, um sich - wie von FZelle vorgeschlagen - über Änderungen benachrichtigen zu lassen.

Gruß, MarsStein

Thema: Henne-Ei-Problem in Bezug auf Sicherheitsfunktionen
Am im Forum: Rund um die Programmierung

Hallo,

Zitat
Doch dann gibt es leider Anforderungen an den untersten Layer (im Bild: der Kernel), die ebenfalls irgendwie einer Rechteprüfung unterliegen müssen.
Damit besteht also in jedem Fall eine Abhängigkeit zwischen Kernel und Rechteprüfung. Da kommst Du nicht drum herum.
Das Problem lässt sich also eingrenzen auf 2 Fälle:

1. Die Logik wird direkt in dem Kernel Layer implementiert.
2. Die Logik wird in einem abgesetzten Dienst/Modul implementiert, der sowohl vom Kernel als auch Anwendungen verwendet werden kann.

Logisch wäre so ein abgesetzter Dienst aber trotzdem irgendwie Teil der Kernel-Schicht, eben aufgrund der Abhängigkeit. Es ist nur eine Frage der Betrachtungsweise.
Zitat
Damit wird a) u.U. Code gedoppelt und vor allem b) die Idee der zentralen Benutzerverwaltung ad absurdum geführt
Das verstehe ich aber nicht so ganz. Vor allem b). Viel zentraler als Dein Kernel Layer kann es doch gar nicht mehr werden??

Vielleicht wäre es eine Alternative - auch um Code Dup zu vermeiden, den Teil der Auth-Logik, der vom Kernel benötigt wird, auch dort zu implementieren. Dann hast Du zusätzlich ein Modul, das erweiterte Logik für die Applikationen bereitstellt, und für die bereits im Kernel implementiertwe Logik als Proxy fungiert.

Und wenn ich mir das jetzt selbst durchlese, ist man damit wieder in gewisser Weise beim oben genannten Fall 2 eines abgesetzten Dienstes/Moduls, von dem der Kernel dann eben abhängt.

Also sozusagen eine Zwischenschicht zwischen Kernel und Modulen, von dem der Kernel abhängt. Die Anwendungen greifen dann aber nicht direkt darauf zu, sondern über ein Modul in der Modulschicht, das für bereits implementierte Logik als Proxy fungiert.

Ich hoffe ich habe Dich jetzt nicht komplett falsch verstanden. Aber vielleicht ist das mal ein Anfang für:
Zitat
und freue mich auch über eifrige Diskussionen

Gruß, MarsStein

Thema: [Gelöst] scintilla-Form mit Backgroundworker füllen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

warum ist FH_WorkerFinished denn static? Das sollte eine Instanzmethode der Form sein, dann kannst Du auch zugreifen :)

So in der Art:

void FH_WorkerFinished(object sender, EventArgs e)
{
    Console.WriteLine("Event ausgelöst!");
    var fileHandler = (FileHandler)sender;
    myTextField.Text = fileHandler.ConvertedText;
}

Gruß, MarsStein

Thema: [Gelöst] scintilla-Form mit Backgroundworker füllen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

dem BackgroundWorker musst Du bestimmt keine GUI bekannt geben.
Die brauchst Du ja auch nur in dem RunWorkerCompleted-Handler, und der Handler gehört nicht zum BackgroundWorker, sondern zu einer Deiner eigenen Klassen.
Du hast also 2 Möglichkeiten:
Entweder gibst Du gibst der FileHandler-Klasse die Form (oder die zu aktualisierenden Controls) mit - das ist die unschöne Variante.
Oder Du verpasst Deiner FileHandler-Klasse ein eigenes Event, das Du von der Form aus abonnieren kannst - das ist die saubere Variante. Dieses Event feuerst Du dann im RunWorkerCompleted-Handler. In einer entsprechenden EventArgs-Klasse gibst Du alle Informationen mit, die die Form kennen muss, um die GUI zu aktualisieren: [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)

Die Invoke-Geschichten kannst Du Dir beim BackgroundWorker normalerweise sparen, weil sie in dem Thread laufen, in dem RunWorkerAsync aufgerufen wird. Wenn Dein FileHandler nicht schon einen eigenen Thread hat, ist das der GUI-Thread, und Du kannst auf die Controls ohne Invoke zugreifen.

Gruß, MarsStein

EDIT sagt noch: Wenn Du das eigene Event angehst, und die Informationen für die GUI in der FileHandler-Klasse als public Properties vorliegen, kann es auch reichen, in der Form im EventHandler, den sender auf FileHandler zurückzucasten und dann auf diese Properties zuzugreifen. Dann sparst Du Dir eine eigene EventArgs-Klasse. Geschmackssache.

Thema: [Solved] Wie kann ich mit VB.NET einen Screenshot erstellen und ausdrucken?
Am im Forum: GUI: WPF und XAML

Hallo,

wie kommst Du auf die Angabe 400 für die Resolution?

Image.SetResolution(400, 400)

Du machst ja einen Screenshot. Die meisten Bildschirme haben eher eine Auflösung von 96 dpi, das solltest Du dann auch für das Bild verwenden, sonst wird es viel zu klein gedruckt.

hth

Gruß, MarsStein

Thema: Statische Methode in einer anderen Klasse aufrufen
Am im Forum: Grundlagen von C#

Hallo,

Du musst die Methode als public deklarieren.
Das sind absolute Grundlagen. Deshalb empfehle ich dringend [FAQ] Wie finde ich den Einstieg in C#?

Gruß, MarsStein

Thema: Wie kann ich nach TCP/IP Verbindungsaufbau auch Daten übertragen?
Am im Forum: Netzwerktechnologien

Hallo,

es ist eigentlich ganz einfach:

Wenn man direkt mit Socket arbeitet, verwendet man socket.Send(...)
Wenn man mit TcpClient arbeitet, besort man sich mit client.GetStream() den zugehörigen NetworkStream und verwendet dann stream.Write(...)

Gruß, MarsStein

Thema: Menü links darstellen, nach Buttonklick soll rechts der Content erscheinen
Am im Forum: GUI: Windows-Forms

Hallo,

da Du mit Windows Forms unterwegs bist, empfehle ich die Lektüre von [FAQ] Assistenten/Wizards: Mit Windows Forms eine Art Frameset einer Website nachbauen (auch wenn Du keinen Wizard bauen willst, findest Du da hilfreiche Tipps - musst das ganze halt etwas für Deinen Gebrauch anpassen).

Benutzersteuerelemente sind grundsätzlich dafür völlig OK und brauchbar, und werden auch in dem verlinkten FAQ-Artikel erwähnt (als UserControls).

Gruß, MarsStein

Thema: [erledigt] Thread wird nicht durch While Schleife abgebrochen
Am im Forum: Grundlagen von C#

Hallo,

die Schleife in Run(), die jedesmal einen Thread startet, sicht grauselig aus - aber das wurde ja schon angemerkt.

Der Kern des Problems aus der Fragestellung ist der:

                            while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                var pos = ms.Position;
                                ms.Position = ms.Length;
                                ms.Write(buffer, 0, read);
                                ms.Position = pos;
                            }

Dieser inneren Schleife (im inneren Thread) ist es völlig schnuppe, ob beende auf true gesetzt wird. Die läuft also munter weiter, solange Daten ankommen. Und damit auch der (innere) Thread.

Gruß, MarsStein

Thema: System.Collections.Generic.List: eigenartiges Verhalten der Methode Contains(T item)
Am im Forum: Grundlagen von C#

Hallo,

Abt war mal wieder schneller...

um es etwas auszuführen, und damit ich nicht umsonst getippt habe:
Arrays sind Referenztypen, und es wird ein Instanzvergleich durchgeführt wenn man sie vergleicht.

Da Du mit new immer wieder eine neue Instanz erzeugt, sind die Objekte zwar möglicherweise inhaltlich gleich, aber es handelt sich doch um unterschiedliche Objekte.
Deshalb wird das neue Array, nach dem Du suchst, in der Liste nicht gefunden. Es steckt halt nicht drin.

Gruß, MarsStein

Thema: [MVVM WPF] [Erledigt] Viewmodelgröße- /struktur - Best Practise?
Am im Forum: GUI: WPF und XAML

Hallo,

@Blaster: WTF?
Du hattest einfach nur Vererbung in den Raum geschmissen. Das eignet sich im Bzug auf die Fragestellung überhaupt nicht.
Ach sooo, Du hattest bei der Vererbung sowieso Komposition im Hinterkopf? Dann hättest Du's auch gleich dazuschreiben können :evil:
Was Du jetzt hier mit dem generischen <T> willst, erschließt sich mir im Kontext der Frage auch nicht... aber seis drum. Die Frage ist beantwortet, und ich diskutiere hier nicht weiter.

Gruß, MarsStein

Thema: ItemsControl-Item Listenelement bei klick auf Element löschen
Am im Forum: GUI: WPF und XAML

Hallo,

die Löschfunktion muss ja ohnehin dort ausgeführt werden, wo die Liste gehalten wird. Das Element kann sich ja nicht selbst löschen.
Das ist aber relativ einfach. Dein Ansatz ist auch schon ganz gut. Einen Verweis auf das übergeordnete ViewModel brauchst Du aber in den Items nicht.

Es reicht ja, wenn Dein ICommand zum Löschen das ItemViewModel als Parameter bekommt.
Dann musst Du eben nur das Command aus dem übergeordneten DataContext (dem ViewModel, das die Liste enthält) binden.

<Button Content="X"
        Command="{Binding DataContext.RemoveElement, RelativeSource={RelativeSource AncestorType=ItemsControl}}" 
        CommandParameter="{Binding}"/>

Gruß, MarsStein

Palladin007 war schneller. Ob ich hier allerdings einen BindingProxy nehmen würde... Kanonen, Spatzen und so...

Thema: [MVVM WPF] [Erledigt] Viewmodelgröße- /struktur - Best Practise?
Am im Forum: GUI: WPF und XAML

Hallo,

Zitat von Blaster
Vererbung!
Nein. Komposition.
Verschiedene Sub-ViewModels, von denen jeweils ein Property in den ViewModels, die sie benötigen. Und dann mit entsprechenden Bindings auf der View in die SubVMs klettern.
Das ist wesentlich flexibler.
Die SubVMs dann möglichst logisch so einteilen, dass sie wiederverwendbar sind. Das gleiche gilt für die View und UserControls.

Gruß, MarsStein

Thema: Lesen von Live Datenstrom eines Drucksensors
Am im Forum: Rund um die Programmierung

Hallo,

Zitat von Abt
Für Windows 7 x64 gibt es RTX.
Kenne das aber auch ur aus der Theorie. Nie eine Industrieanlage damit gesehen.
Das haben wir bei einem unserer Geräte im Einsatz (nicht bei dem, an dem ich arbeite).

Ist aber wenn ich das richtig mitbekommen habe jetzt nix, wo man sich eben mal kurz einarbeiten kann.
Das ist Real-Time Programmierung mit C++, das hat wieder ganz eigene Anforderungen und ist quasi eine Welt für sich.
Wir haben da extra einen Spezialisten eingestellt - das ist für ein Praktikum bestimmt nicht geeignet.

Gruß, MarsStein

Thema: Ohne Reflektion, this Parameter übergeben und (z.B. aus Variablenname) eine ID generieren
Am im Forum: Grundlagen von C#

Hallo,

Zitat
Stadtessen ist die Operator-Überladung das, was der Mehrheit aufstößt?
Ja - mir auch.
Und zwar aus einem einfachen Grund: Das Verhalten ist völlig missverständlich, und zwar vor allem, weil Du auch noch eine implicit-Konvertierung nach int hast.

Folgender Code:

SynchronizedObject mySync = new SynchronizedObject(...);
int myInt = mySync;

if(mySync == myInt) // true

// -----

mySync |= 8;
myInt |= 8;

if(mySync == myInt) // false
Das halte schon für verwirrend und vor allem inkonsistent und würde davon unbedingt absehen.
Früher oder später verwechselt jemand da etwas und dann fliegt es Euch um die Ohren.

Daher eigent sich IMO auch kein anderer Operator, zumindest keiner, der auch auf int anwendbar wäre.

Die Semantik ist hier ganz klar die einer Set-Methode und sollte dann auch so implementiert werden.
Was ist daran eigentlich so schlimm? Dank Intellisense musst Du noch nicht mal mehr tippen, auch wenn die Zeile 2 Zeichen(!) länger wird als mit dem Operator.


Gruß, MarsStein

Edit: Diese Antwort bezieht sich nur auf die Operator-Überladung an sich. Nicht auf das gesamte Konzept. Da würde ich auch zusehen, ob man das nicht ganz anders umsetzt.

Thema: [Gelöst]Custom Exception Popup-Dialog selbst implementieren
Am im Forum: GUI: WPF und XAML

Hallo,

Du könntest ein Popup dafür verwenden.

Gruß, MarsStein

Thema: Selbstzweifel für die Eignung zum Programmieren
Am im Forum: Smalltalk

Hallo,

Es ist wie ein Puzzelspiel.

Zitat
Ich weiß was Schleifen sind, Vererbung, Klassen, Objekte, Methoden, Datentypen, arrays usw.
Das sind alles Puzzleteile, die sich erst mit der Zeit zu einem Gesamtbild zusammenfügen. Und je größer das Bild wird, desto leichter programmiert es sich.

10 Wochen sind viel zu wenig, um jetzt schon die Flinte ins Korn zu werfen. Die meisten Programmierer brauchen viel(!!) länger, um überhaupt eine Sprache vollständig zu beherrschen - dazu kommt dann noch die Kenntnis des Frameworks, das braucht also alles seine Zeit. Erwarte einfach am Anfang nicht zuviel von Dir selbst, damit Du den Spaß nicht gleich wieder verlierst.

In diesem Sinne, Kopf hoch!

Gruß, MarsStein

Thema: TabControl Multiline - Zeilenwechsel verhinden
Am im Forum: GUI: Windows-Forms

Hallo,

witzig - MrSparkle hat eigentlich genau richtig erklärt, warum sich TabControls so verhalten, und es ist ja nun mal das Standardverhalten und mag so auch sinnvoll sein.

Ich persönlich konnte mich aber auch bis heute nicht dran gewöhnen, dass Tab-Zeilen durch die Gegend springen.

Gruß, MarsStein

Thema: Invalidate DataGrid - welches Event nutzen? [Gelöst, INotify nicht implementiert]
Am im Forum: GUI: WPF und XAML

Hallo,

wenn Foo INotifyPropertyChanged richtig implementiert und "IsOnline" ein gebundener Wert ist, sollten Änderungen an de Property direkt sichtbar werden.

Gruß, MarsStein

Thema: Wie kann ich einen Counter im UpdateProgress anzeigen?
Am im Forum: Web-Technologien

Hallo,

das ist alles schon etwas länger her... aber wenn ich mich richtig erinnere, geht das so mit einem UpdateProgress nicht.
Wenn Du einen Partial Postback durchführst, wird ein Teil der Seite neu geladen und anschließend der gesamte neu geladene Teil gerendert. Da kommst Du so einfach nicht dazwischen.

Um so was mit WebForms zu realisieren, bräuchtest Du einen Timer, der auf dem Server den Status pollt - z.B. per WebMethod - und diesen dann entsprechend anzeigt.
Oder Du müsstest in mehreren Schritten arbeiten - das läuft dann auf mehrere UpdatePanels raus, eines für jeden Schritt.

Beides nicht schön, aber wie Du Dir das vorstellst geht es out of the box eben nicht.
Es gibt vermutlich in Netz noch irgenwelche WebForms-Controls die sowas können, könntest Du mal suchen.

Aber Abt hat schon recht, Du reitest ein totes Pferd.

Gruß, MarsStein

Thema: Task.ContinueWith mit Parameter aufrufen
Am im Forum: Grundlagen von C#

Hallo,

t = new Task(() =>
    {
        …
        t.ContinueWith(…);
    });
Das geht böse aus. Du kannst die Variable t nicht verwenden, bevor sie zugewiesen ist.
Die Zuweisung erfolgt aber erst nach dem Konstruktor.
Unsinn. Du benutzt es ja erst in der Action.


async/await wäre auf jeden Fall zu empfehlen, ich bin da gestern nicht drauf eingegangen, weil explizit nach ContinueWith gefragt wurde.
Das wurde eingeführt, um einfacheren (und damit besser lesbaren und wartbaren) Code zu schreiben. Alles was hinter einem await steht, ist sozusagen die Contiuation. Das funktioniert auch wunderbar und der Code wird stark vereinfacht.
Allerdings muss man es wenn man damit anfängt auch durchziehen. Du kannst await nur in Methoden benutzen, die async sind und dementsprechend void, Task oder Task<T> zurückgeben (man sollte immer Task statt void nehmen, ausser man schreibt asynchrone EventHandler).
Das ist also viral. Bei neuen Projekten auf jeden Fall zu empfehlen, in alten Projekten ggf. aufwändig einzupflegen, lohnt sich IMO aber trotzdem.

Gruß, MarsStein

Thema: Task.ContinueWith mit Parameter aufrufen
Am im Forum: Grundlagen von C#

Hallo,

hast Du schon mal in die Doku geschaut?
Alle Überladungen von Task.ContinueWith wollen einen Delegaten, der als ersten Parameter die ursprüngliche Task annimmt. Das ist bei Dir nicht der Fall.

Zusätzlich gibt es jede Menge Überladungen, die als zweiten Parameter ein object state annehmen.
Das Objekt, das dann an den Delegaten übergeben wird, kannst Du beim Aufruf von ContinueWith mitgeben. Damit kannst Du Dir theoretisch alle möglichen Parameter übergeben, Du musst sie nur in eine Klasse verpacken und innerhalb des Delegaten auf den richtigen Typ zurückcasten.
Das müsste dann so aussehen:

class MyFancyParamsClass
{
    public string Param1 { get; set; }
    public int Param2 { get; set; }
    ...
}

private void ZahlungseingaengeGespeichert(Task prevTask, object state)
{
    var parameters = (MyFancyParamsClass)state;
    ...
}

task.ContinueWith(ZahlungseingaengeGespeichert, new MyFancyParamsClass { Param1 = "whatever", Param2 = 7 }, TaskScheduler.FromCurrentSynchronizationContext());
Und wenn Dir das nicht gefällt, kannst Du auch mit einer Lambda-Expression arbeiten, und mit Closures.
Dann würde es so aussehen:

task.ContinueWith(t => ZahlungseingaengeGespeichert(/* hier kannst Du alles mögliche übergeben, z.B. auch t.Result */), TaskScheduler.FromCurrentSynchronizationContext());

Gruß, MarsStein

Thema: SerialDataReceived Event wird nur auf einer Seite angezeigt
Am im Forum: GUI: Windows-Forms

Hallo,

nur zu Richtigstellung:

Zitat von panicJonny
du list ja in deinem Event den seriellen Port erst aus.
Ist soweit richtig.
Zitat von panicJonny
Also ist der Buffer vom Port beim zweiten Aufruf des Events bereits leer und nichts kann gelesen werden.
Ist etwas unglücklich formuliert. Man müsste eher schreiben:
Also ist der Buffer vom Port beim Aufruf des zweiten Eventhandlers (für das selbe Event) bereits leer und nichts kann gelesen werden.
Zitat von panicJonny
SerialDataReceived += func1
SerialDataReceived += func2

ruft das Event zwei mal auf

Ist so also nicht ganz richtig. Es werden vielmehr jedesmal, wenn das Event vom SerialPort ausgelöst wird, beide registrierte Handler nacheinander aufgerufen. Wenn der erste Handler dann die Daten vom Port liest, bleibt für den zweiten Handler eben nichts mehr übrig.
Das Event selbst wird dadurch aber nicht öfter ausgelöst.

Beim SerialPort darf man sowas generell nicht machen - es könnte sogar sein, dass zwischen den Aufrufen der beiden Handler schon wieder neue Daten anfallen, die dann dieser zweite Handler liest. Dadurch kann sehr schnell ziemlich viel durcheinandergeraten.

Gruß, MarsStein

Thema: "Type" als generischen Parameter verwenden
Am im Forum: Grundlagen von C#

Hallo,

Zitat von Sir Rufo
Ist nur die Frage, ob man das wirklich will.
Und diese Frage sollte man sich unbedingt auch stellen. Nur weil es geht, heisst das nicht, dass es auch gut ist, das zu tun.

In fast allen Fälle weisen solche Probleme wie hier beschrieben auf Mängel in der Architektur hin und mit einem anderen Ansatz lösen sie sich von selbst.

Gruß, MarsStein

Thema: Wie kann ich mehrere Schleifen schachteln (Würfelspiel)?
Am im Forum: Grundlagen von C#

Hallo,

leider hast Du nicht genau beschrieben was Du willst.

Wenn Du einfach nur die einzelnen Würfel betrachten willst, brauchst Du nichts zu schachteln.
Dann reicht es, die Anzahl der Würfel mit der Anzahl Wiederholungen zu multiplizieren, weil es keinen Unterschied macht, bei welcher Wiederholung ein Würfel geworfen wurde.

Wenn Du die Summen der einzelnen Wiederholungen zählen willst, musst Du für zwei Dinge sorgen:

  1. Das Objekt (bei Dir das Array), in dem die Anzahl gespeichert wird, muss groß genug sein, um alle möglichen Summen aufnehmen zu können. Dann eignet sich statt einem Array ggf. besser ein Dictionary<int,int>.
  2. Du musst dafür sorgen, dass für jede Wiederholung (äußere Schleife) soviele Würfe addiert werden, wie es Würfel gibt (innere Schleife).
Also sowas in der Art (nicht getestet):

           var resAndNumber = new Dictionary<int,int>();

            // für jede Wiederholung...
            for (int i = 0; i < numberRepeats; i++)
            {
                // ...rolle Anzahl Würfel und addiere Ergebnisse
                int rolledResult = 0;
                for (int i = 0; i < numberDice; i++)
                {
                    rolledResult1 += DiceRandomGenerate.Next(1, 7);
                }

                // wenn diese Summe noch nicht geworfen wurde, einen Eintag dafür im Dictionary anlegen
                if(!resAndNumber.ContainsKey(rolledResult))
                {
                    resAndNumber[rolledResult1] = 0;
                }

                // bisherige  Anzahl für diese Summe hochzählen
                resAndNumber[rolledResult1]++;
            }


Bei der Ausgabe dann mit foreach das ganze Dictionary durchlaufen (sechsmal reicht ja dann nicht mehr).

Finde ich übrigens sehr gut, dass Du als Einsteiger erst mal auf der Konsole arbeitest statt Dich direkt auf grafische Oberflächen zu stürzen (persönliche Meinung)

Gruß, MarsStein

Thema: Prozess auf Server von Client aus manuell starten
Am im Forum: Rund um die Programmierung

Hallo,

Zitat
Über eine Konf Datei in der das Clienttool einen paramter setzt und der Server es dauernd abprüft!?
Wohl eher nicht -> dann brauchst Du ja auf dem Server auch einen Prozess, der die Prüfung übernimmt.
Dann kann dieser Prozess aber auch gleich ein (Windows-)Service sein, der im Netzwerk auf Anfragen wartet und dann bei einer entsprechenden Anfrage den Prozess startet.
Und dann könntest Du (optional) letztendlich die Funktionalität des Tools auch direkt im Service unterbringen.

Gruß, MarsStein

Thema: Dividiere List<T> Property bevor Sum()
Am im Forum: Grundlagen von C#

Hallo,

Zitat
Folgendes habe ich versucht:

double ges_netto = itemList.Sum(item => item.StaticPreis / 1.19);
Das müsste doch funktionieren.

Aber eigentlich müsste es doch reichen, die Summe zu teilen:

double ges_netto = itemList.Sum(item => item.StaticPreis) / 1.19;
ansonsten, falls Du die Einzel-Nettopreise brauchst:

var nettoPreise = itemList.Select(item => item.StaticPreis / 1.19);
double ges_netto =nettoPreise.Sum();
Aber ob das einen Vorteil gegenüber Deinem Code bringt...

Es gäbe noch die Möglichkeit, ein Dictionary zu erzeugen, um die einzelnen Nettopreise den Positionen zuzuordnen:

var nettoDict = itemList.ToDictionary(item => item, item =>  item.StaticPreis / 1.19);
var double ges_netto = dict.Values.Sum();
// dann kannst Du den Einzelnettopreis auch abfragen über
var itemNetto = nettoDict[item];

Elegant wäre auch eine Erweiterungsmethode für den Nettopreis, die könntest Du überall verwenden, wo Du eben den Nettopreis benötigst:

public static double NettoPreis(this ItemType item)
{
    return item.StaticPreis / 1.19;
}

// Aufruf für Dein Beispiel:
itemList.Sum(item => item.NettoPreis())
(Code nur runtergetippt, nicht getestet)

Gruß, MarsStein

Thema: BackgroundWorker im ViewModel: Liste ist, je nach timing, noch nicht instanziiert
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

vermutlich gibt es im worker_DoWork eine Exception, bevor die TmpListe erstellt und zugewiesen ist.
Dann raucht Dir der BackgroundWorker ab, und Du bekommst es nicht mit, weil Du in worker_RunWorkerCompleted die e.Error-Property nicht auswertest. Da sollte die Exception drinstehen.

Zitat von Jessimaus
jedenfalls bei Aufruf von refresh_GeraeteListe() durch den Konstruktor. Wenn ich refresh_GeraeteListe() über das Command CmdRefreshGeraeteliste aufrufe, tritt das Problem scheinbar nicht auf.
Wenn das Ding einmal durchgelaufen ist, ist TmpListe ja schon initialisiert. Wenn der BackgroundWorker dann eine Exception verursacht, wird auch keine neue Liste zugewiesen. Im diesen Fall arbeitest Du dann aber mit den alten Daten aus dem letzten gelungenen Durchlauf.

Gruß, MarsStein

Thema: Vorraussetzungen um programmieren zu lernen?
Am im Forum: Smalltalk

Hallo,

ich glaube auch nicht, dass Du mit Anfang 30 zu alt dafür bist.
Ich selbst habe meine ersten Codezeilen auch erst mit 25 geschrieben, und dann mit 26 eine Ausbildung in dem Bereich begonnen - und bin letztlich noch ein recht ordentlicher Programmierer geworden (jedenfalls glaube ich, das behaupten zu können).

Was man dazu braucht?
Die wichtigsten Punkte waren für mich immer logisches Verständnis sowie ein gutes Abstraktionsvermögen. Aber das ist nur meine persönliche Einschätzung.

Zitat von Skydanith
dass das Thema programmieren riesig istt und dass man eigentlich nie "ausgelernt" hat.
Das ist übrigens völlig korrekt. Es ist in der Tat ein sehr weites Feld, und es gibt ständig neue Technologien. Da nicht am Ball zu bleiben, bedeutet Stillstand, und der ist in der Branche tödlich.

Gruß, MarsStein

Thema: Ausbildung abgeschlossen, nun Jobsuche --> Erfahrungen?
Am im Forum: Smalltalk

Hallo,

Zitat von Prodigio
Sind die meist explizit ausgeschrieben?
Zumindest oft.
Gabs auch hier in der Jobbörse schon zuhauf: Forumssuche nach junior

Gruß, MarsStein