Abarbeitungs-Reihenfolge mittels Combobox festlegen.

  • WPF

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Hallo,
    Ich frage mich gerade ob ich tatsächlich den Programmieraufwand, für mein kleines Tool, so total unterschätze?!
    Da sag ich mir, dass die Antwort auf diese Frage ja wohl nur JA lauten kann.

    ErfinderDesRades schrieb:

    Denk das mal durch, die "Nummer-Tänzchen", bei....

    Wenn sogar einer wie ErfinderDesRades dem "Nummer-Tänzchen" mit Respekt begegnet! :(

    ​Ich verstehe eure Einstellung ja sehr gut, was das händische eingreifen in eine Produktionseinreihung betrifft.
    ​Aber, vielleicht habe ich auch vergessen zu erwähnen, dass unsere Orders von dem Megamächtigen SAP Programm auf die verschiedene WorkCenter verplant werden.
    ​Und da ist die Reihenfolge ja von Kriterien wie, Liefertermin, Eingangsdatum der Bestellung.....und weiß der Kukuk noch wovon die "optimal errechnete" Durchlaufposition an einem Wkc festgelegt wird.
    ​Aber mein kleines Tool, kommt gerade dann zum Einsatz, wenn trotz SAP auf einmal die Wkc total vollgestopft sind.....
    ​Und dann überleg ich einmal pro Woche mit einem vierköpfigen Team, wie wir die Sache in die Hand nehmen können um dann doch trotz SAP Planung an die tatsächlichen Gegebenheiten unsere Produktionseinheit anzupassen.
    ​Ich weiß wie das für Außenstehende klingen muss.....
    ​Aber SAP ist wirklich sehr mächtig und berücksichtigt enorm vile Faktoren, aber leider nicht z.B. den Faktor Mensch....
    ​Wir Binden dann z.B. in unserer wöchentlichen Besprechung ein welcher Mitarbeiter gerade Früh- oder Spätschicht hat. Der eine kann z.B. das Wkc für eine Bestellung einrichten, ein anderer vielleicht nicht. Aber der andere kann die Maschine vielleicht bedienen wenn sie mal eingerichtet ist.
    ​Ein anderer Faktor kann auch die Form der Teile sein. Gruppieren wir die Bestellungen z.B. nach Bearbeitungsspezifichen Gegebenheiten (Form, Größe....o.ä.) dann erspart man sich z.B. die Einrichtzeit (setuptime) der Maschine um sie jedes mal auf ein komplett anderes Teil einzurichten...

    ​So, solche Gründe gibt es noch ein paar die machen können, dass wir in manchen fällen lieber auf unsere Erfahrung zurückgreifen, und nicht immer "blind" dem "scheduling" von SAP folgen.

    ​Das ist aber glaube ich nicht das Thema hier. (und hoffentlich schaut hier auch keiner von SAP rein...das könnte ärger werden wenn ich hier sowas schreibe...)

    ​Hier ist doch hoffentlich eher meine kleine Demo Thema, oder?

    ​Also, nachdem das ja jetzt hoffentlich einigermaßen geklärt wäre, würde ich gerne noch ein letztes mal versuchen euch zu überzeugen mir mit dieser Demo zu helfen.

    ​Nofear23m,
    ​Ja natürlich verstehe ich deine Sorge auch.

    Nofear23m schrieb:

    Solltest du hier auf einen "grünen" Zweig kommen kann ich dir ja ein kleines Demo machen, bedenke aber das dies ja doch auch ein wenig Arbeit ist und das möchte ich nicht unbedingt einfach so mal machen obwohl es gar nicht dem entspricht was du haben willst.


    ​Könnten wir es dann, wegen des großen Aufwandes eines solchen "Nummer-Tänzchen", und weil ich mir trotzdem vorstellen kann wieviel Zeit da draufgehen kann, so machen dass, ihr mir eben nur einen "Tanzschritt" zeigt. Z.B. das erteilen einer Durchlauf-Nummer und ein daraus erfolgendes "nach vorne verschieben" eines Orders. Und ich kümmere mich dann um die anderen "Order-Bewegungen".

    ​Aber ich bin euch natürlich nicht böse, wenn ihr irgendwelche Bedenken wegen der Anforderungen oder so habt, und euch nicht darauf einlassen wollt.

    ​Egal wie, wünsche ich euch ein schönes Wochenende.

    ​Danke,
    ​Jeiss

    Guten Morgen

    Wenn ich das so lese kommt mir gerade sowieso was anderes in den Kopf. Ich sehe gerade die WorkCenter vor mir und darunter alle noch keinem WC zugeordneten Orders. Per Drag&Drop schiebt man die Orders rüber wo sie unten angereiht werden. Innerhalb des WC kann man die Orders dann wiederum per Drag&Drop umsortieren. Aber das wird sicher heftig.

    Ich sehe schon. Du wirst dich von dem "Nummerntänzchen" nicht abbringen lassen.
    Wie es im Grunde funktioniert ist soweit ja klar. Ich muss ehrlich gestehen. Nochmals die Infos auf diesem Thread rausholen ist sicher nicht lustig. Evtl. hat sich bei dir im Kopf ja auch schon was geändert.
    Mach doch hier ein kleines kurzes Lastenheft zum besseren Verständniss. Ich weis nur noch. OK. Keine Nummer doppelt. Nächst höhere wird automatisch erstellt. Gibt es bereits 1-7 und ich machen die 5 zu 3 müssen die "alte" 3 und 4 eines hochgezählt werden. Also eben keine doppelt. Das gilt aber nur für jedes WS an sich oder? In einem anderen WS kann es dann auch wieder eine 3 geben oder?
    Was soll passieren wenn von WS 2 (mit 10 Orders) ein Order mit Prio 2 in ein WS mit 20 Orders verschoben wird? Wird es bei 2 eingereiht oder bekommt es dann die 21 ?

    Klar kann ErfinderDesRades oder ich ein Demo machen, hier gilt aber... je genauer die Angaben desto mehr kann bedacht und in die Logik gebracht werden.

    Schönen Samstag noch
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Guten Morgen

    Nofear23m schrieb:

    Ich sehe gerade die WorkCenter vor mir und darunter alle noch keinem WC zugeordneten Orders. Per Drag&Drop schiebt man die Orders rüber wo sie unten angereiht werden. Innerhalb des WC kann man die Orders dann wiederum per Drag&Drop umsortieren.

    Ja genau das war auch meine ursprüngliche Idee.
    Der Titel meines Themas lautete bei meinem ersten Versuch:
    Mehrere Listboxen an gleiche Daten binden. Ich sehe gerade das war erst am 16.Dezember. Ich bin schon so lange damit unterwegs , dass es mir vorkommt als es schon länger her wäre. Ist auch bestimmt länger her. Ich habs ja auch schon ein oder zwei Monate ohne die Hilfe des Forums probiert.
    Die listboxen sollten damals die verschiedene Wkc darstellen und die "Daten" waren natürlich die "keinem Wkc zugeordneten" Orders. Aber da wagte ich noch nicht an Drag&Drop zu denken.
    Aber die gleiche Vorstellung wie du. Oben die wkc und die liste der Orders darunter.
    Hab das mit der Bindung an den Listen aber nie hingekriegt.
    Also wollte ich es mir einfacher machen, und statt die Wkc "optisch" zu trennen, hab ich gedacht ich mach sie einfach all die Orders in das gleiche Datagrid und wollte das Grid dann irgendwie nach den Wkc sortieren oder gruppieren könne.
    Der Titel meines zweiten Versuches lautete dann am 28.Dezemger: Bindung nach Entity Model first aktualisiert Daten nicht.
    Da hab ich mir die Zähne auch am Entity Model ausgebissen. Musste ich leider auch aufgeben.
    Es musste also noch eine einfachere Variante her. Da hab ich mich dazu entschlossen die Daten in eine XML-Datei zu speichern.
    Da hab ich mir auch eine kleine App zusammen geflickt. Die ist sicherlich weit von perfekt, aber sie funktioniert zum Teil.
    Da kann ich die Orders aus einem ersten Grid per Drag&Drop in ein zweites Datagrid ziehen. In diesem Grid kann ich den Orders dann per Combobox ein Wkc zuweisen.

    Bleibt jetzt aber das aktuelle Problem der Reihenfolge der Orders innerhalb eines Wkc. Und da brauch ich halt eine Nummer/ein Buchstabe oder sonst eine sortier-Möglichkeit welche ich in der XML-Datei speichern und wieder abrufen kann.

    Nofear23m schrieb:

    Du wirst dich von dem "Nummerntänzchen" nicht abbringen lassen.

    Ja stimmt, denn viele Möglichkeiten hab ich leider bald nicht mehr wenn es bei diesem dritten Versuch auch nicht klappt..!

    Nofear23m schrieb:

    Wie es im Grunde funktioniert ist soweit ja klar.

    Das ist ja schon mal wass..... Dann müsste ja was drin sein.

    Nofear23m schrieb:

    Ich weis nur noch. OK. Keine Nummer doppelt. Nächst höhere wird automatisch erstellt. Gibt es bereits 1-7 und ich machen die 5 zu 3 müssen die "alte" 3 und 4 eines hochgezählt werden. Also eben keine doppelt. Das gilt aber nur für jedes WS an sich oder? In einem anderen WS kann es dann auch wieder eine 3 geben oder?Was soll passieren wenn von WS 2 (mit 10 Orders) ein Order mit Prio 2 in ein WS mit 20 Orders verschoben wird? Wird es bei 2 eingereiht oder bekommt es dann die 21 ?

    Keine Nummer doppelt: Genau nicht innerhalb eines Wkc
    Nächst höhere wird automatisch erstellt: Ja! wird einem Wkc ein neues Order zugewiesen, bekommt es "automatisch" die höchste Nummer innerhalb des wkc.
    Gibt es bereits 1-7 und ich machen die 5 zu 3 müssen die "alte" 3 und 4 eines hochgezählt werden. Also eben keine doppelt: Ja! Die "alten" 1-2 und 6-7 sind davon eigentlich nicht berührt.
    Das gilt aber nur für jedes WS an sich oder? In einem anderen WS kann es dann auch wieder eine 3 geben oder? Ja in all den anderen Wkc kann es einen 3. Platz geben.
    Was soll passieren wenn von WS 2 (mit 10 Orders) ein Order mit Prio 2 in ein WS mit 20 Orders verschoben wird? Wird es bei 2 eingereiht oder bekommt es dann die 21 ? =>Bekommt dann "einstweilen" die Position 21. Nach dem Motto: Bitte hinten anstellen.

    Nofear23m schrieb:

    Ich muss ehrlich gestehen. Nochmals die Infos auf diesem Thread rausholen ist sicher nicht lustig. Evtl. hat sich bei dir im Kopf ja auch schon was geändert.

    ​Ja kann ich mir vorstellen. Aber ich glaub du brauchst das nicht noch mal durchlesen. Wenn die eben genannte Aspekte berücksichtigt werden dann ist ja schon vieles drin. Ich denk mal ich komm dann mit dem Rest klar.
    ​Ok, das soll nur "FYI" sein. Denn ich glaub nicht, dass das diesen Teil der App beeinflusst.
    ​Jedes mal wenn die App (nicht die angehängte Demo) startet, wird geprüft, ob die Daten in der App noch aktuell sind. D.h., es wird geprüft ob nicht vielleicht, in der Zwischenzeit, ein paar Orders abgearbeitet worden sind.
    ​DIe müssen dann natürlich aus dem entsprechenden Wkc entfernt werden. (und dann startet natürlich wieder ein kleines Nummerntänzchen​, dann müssen die Orders dahinter nachrücken).
    ​Später muss dann auch noch der Fall dazu kommen, wenn ein Order aus der Liste eines Wkc "rausgeschmissen" wird, kann auch vorkommen! => dann muss natürlich auch wieder nachgerückt werden.
    ​Ja und wie gesagt, es soll in eine xml-Datei gespeichert werden.

    ​Also ehrlich gesagt mir fallen zur Zeit keine andere wichtigen Anforderungen ein.
    Mal sehen was ErfinderDesRades vor paar Tagen in seiner Antwort bedacht hat.

    Denk das mal durch, die "Nummer-Tänzchen",
    beiZufügen eines Elements
    Erledigung des ersten Auftrags
    Aufrücken eines Elements nach vorn
    Aufrücken nach hinten
    und alles muss auch funzen, wenn die liste nicht ganz voll ist.

    ​Das hätten wir ja eigentlich alles oben schon behandelt, oder?
    ​Ja ok, die "Einschränkung" der Plätze in einer Wkc-Liste hatte ich immer als, auf c.a. 5 Plätze beschränkt. Das sollte das Erstellen einer Demo vereinfachen, ist aber ersten nicht der Fall, und zweitens gar keine reale Anforderung. Im Gegenteil, da soll es keine Grenze geben.
    Ach ja, Nofear23m, du hast in einer vorherigen Antwort mal gefragt:

    Nofear23m schrieb:

    Ich nehme an nicht jede WS könnte jeden Order übernhemen oder "können" alle das selbe?

    ​Nein nicht jedes wkc kann das gleiche. Dürfte für den Code aber keine Rolle spielen.

    Befasse mich heute Nachmittag sowieso noch mit meiner App, falls mir doch noch was einfallen sollte, mach ich ein Update (Edit).

    ​Schönes Wochenende noch,
    ​Jeiss

    Nummer-Tänzchen

    Jeiss schrieb:

    Keine Nummer doppelt: Genau nicht innerhalb eines Wkc
    Nächst höhere wird automatisch erstellt: Ja! wird einem Wkc ein neues Order zugewiesen, bekommt es "automatisch" die höchste Nummer innerhalb des wkc.
    Gibt es bereits 1-7 und ich machen die 5 zu 3 müssen die "alte" 3 und 4 eines hochgezählt werden. Also eben keine doppelt: Ja! Die "alten" 1-2 und 6-7 sind davon eigentlich nicht berührt.
    Das gilt aber nur für jedes WS an sich oder? In einem anderen WS kann es dann auch wieder eine 3 geben oder? Ja in all den anderen Wkc kann es einen 3. Platz geben.
    Was soll passieren wenn von WS 2 (mit 10 Orders) ein Order mit Prio 2 in ein WS mit 20 Orders verschoben wird? Wird es bei 2 eingereiht oder bekommt es dann die 21 ? =>Bekommt dann "einstweilen" die Position 21. Nach dem Motto: Bitte hinten anstellen.
    Das ganze bietet mein Ansatz - eben ohne Nummern.
    Und ich denk, die einfachste Lösung, das NummerTänzchen zu implementieren ist, die Logik mit meim Ansatz zu gestalten.
    Wenn deine Orders zusätzlich noch eine Ranking-Nummer haben - ist das ja nicht verboten.
    Und wann immer mit meinem Ansatz die ObservableCollection umsortiert wurde - dann einfach durchlaufen und die Nümmerken komplett neu und widerspruchsfrei zuteilen - wie gesagt: das ist das einfachste.
    (Nur was die Nummern dir schließlich bringen habich noch nicht ganz verstanden)

    Nofear23m schrieb:

    ... kommt mir gerade sowieso was anderes in den Kopf.... Drag&Drop....
    Oh - please!
    Tu das dem Jeiss nicht an - D&D in Wpf!
    Ich kenne mich bisserl damit aus, und es ist echt irre kompliziert.
    Und mein Sample demonstriert ja auch, dasses ohne geht: Der Up-Button verschiebt einen Oder nach oben, bis an die "Grenze" des Wkcs.
    Und die Wkc-Combobox ermöglicht, einen Oder von einem Wkc ins andere zu beamen - alles äusserst einfach gehalten.


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo

    OK, soweit wäre mir dann alles klar. Ich weis jetzt nicht genau was ich dazu komme mich hier zu "spielen" werde es aber versuchen das du ja jemand vbist der immer korrekt "mitarbeitet" und brav Antworten und versucht alles zu verstehen und zu lernen. Weiter so.
    Mal sehen ob sich da was zufriedenstellendes machen lässt.

    Jeiss schrieb:

    Da hab ich mir die Zähne auch am Entity Model ausgebissen. Musste ich leider auch aufgeben.
    Es musste also noch eine einfachere Variante her. Da hab ich mich dazu entschlossen die Daten in eine XML-Datei zu speichern.

    Nur weil was nicht von Anfang an klappt muss man nicht aufgeben. Auch wenn es für DIESES Projekt vielleicht nicht unbedingt benötigt wird. Spielt dich mit dem EF mal. Es ist echt eine feine Sache und performancemäßig echt top.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,
    ok gleich zwei Antworten genau zur gleichen Zeit. Gucken wir uns mal an was wir schon haben.
    Wir haben bereits einen Lösungsvorschlag. Einen ohne Nummern, der von ErfinderDesRades. (Der mag wohl nicht tanzen...)
    Aber zum Tanzen sind wir ja auch nicht hier! Wir wollen WorkCenter Verplanen damit die Arbeit vorankommt und die Kunden zufrieden sind.
    Die bestellen dann erneut, und dann steh ich ja wieder da, mit ein paar Orders mehr.... Dann hat sich für mich ja nichts geändert :D

    ​Nein, Spaß bei Seite!
    ​ErfinderDesRades, waren wir uns nicht vor ein paar Tagen noch einig, dass OHNE NUMMERN die Reihenfolge beim Speichern in eine xml-Datei und erneutem laden der Daten, das erhalten der Reihenfolge der Orders innerhalb der Wkc nicht garantiert ist?
    Ja oder Nein?

    ​War denn nicht auch eine Bedingung für deinen Vorschlag, dass OHNE NUMMERN auch kein "umsortieren" der ObservableCollection in Frage kam?
    Ja oder Nein?

    Oder hab ich da was verpasst? War doch so? Ohne Nummern kein Umsortieren und Reihenfolge bei erneutem Laden der Daten nicht garantiert.
    ​Also die Daten müssen gespeichert werden, da komm ich nicht drum herum.
    ​Ob es wirklich Sinn macht, und notwendig ist die ObservableCollection um zu sortieren, darüber kann ich mir vielleicht Gedanken machen.

    ​Danke,
    Jeiss
    Hallo

    Ich sehe jetzt auch nicht viel sinn darin die ObservableCollection zu sortieren. Wenn ich schon mit "den Nummern rumtanze" dann ist mir ja auch egal in welcher Reihenfolge die Daten abgespeichert werden.
    Ich sortiere bei/nach dem laden ja ohnehin.
    Fakt ist allerdings, wenn du speichern und wieder laden möchtest benötigst du irgendeine art der Reihenfolge. Du möchtest ja nach dem Laden wieder genau die selbe Ansicht haben.

    Aber was anderes....
    Wie ErfinderDesRades bereits vor mir gesagt hat ist das mit deiner, ich nenns jetzt mal Prio ein Tänzchen. OK, wenn man am Tanzen spaß hat oder einem die Situation dazu zwingt ist das auch weniger das Problem.
    Es ist einfach nur eine "spielerei" mit dem Nummerntänzchen, man muss eben immer aufpassen das alles schön genau so passiert wie man es sich vorstellt und darf hierbei nichts auslassen.

    Ich habe mal schnell eine kleine Demo erstellen wie ich mir denke das du dir das vorgestellt hast. Glaube ich hald.
    Es ist sicher nicht "perfekt" und sowohl ohne Refactoring als auch nicht komplett ausgetestet. Aber ich denke sowas in der Art wolltest du ja haben oder?
    Mal sehen.

    Auf was ich trotzdem etwas geachtet habe:
    • DesignTime-Support für XAML
    • Das der Code nicht zu kompliziert wird und leicht verständlich ist. Dadurch ist der Code evtl. nicht so schlank und EDR hat sicher was in Punkto "Boilerplate Code" auszusetzen aber er ist so leichter verständlich.
    • Das im XAML nicht zig Styles, Template und was weis ich was sind. Wieder damit man es besser nachvollziehen kann



    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Komisch, plötzlich so ruig hier? :huh:
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    sry - hab die letzten 2 Tage auf eim anneren Rechner gearbeitet

    Also zu deim Sample - kurz angemacht - mir scheint, da fehlt die Problemlösung?
    Ich hab nix gefunden, wie man ein Item auf eine annere Position bewegt?

    Oder ist diese Funktionalität verlorengeganen - ich muss immer auf vb2013 downgraden
    Hallo @ErfinderDesRades

    Aber warum denn? Es gibt die Spalte "Reihung". Ob das jetzt ne ComboBox oder ein Textfeld ist für das Demo jetzt ja egal. Da kann eine beliebige Zahl eingegeben werden.
    Siehe Screenshot.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,
    Also die Demo, einfach nur SUPER! :thumbsup:
    Vielen Dank Nofear23m.

    Ich hab natürlich noch nicht jedes kleine Detail in deiner Demo richtig begriffen, aber sie ist auf jeden Fall sehr Lehrreich für mich.
    Und mein "Nummern-Problem" ist jetzt endlich gelöst.

    ​Gestern war ja Sonntag, naja ist immer doch eher "Family-day". Da komm ich nicht so leicht an meinen PC ran.... ;)
    ​Hab aber natürlich trotzdem reingeguckt, und hab mich riesig gefreut.

    ​Du hast dir echt viel Mühe gegeben. Hast ja sogar die Properties aus meiner Demo übernommen.
    ​Und ich freue mich auch, dass du den Code nicht zu "kompliziert" ausgelegt hast. Dann kann ich auch verstehen worum es geht.

    ​Ich schließe das Thema einstweilen aber noch nicht, für den Fall, dass ich noch Fragen zum Code hätte.
    ​Diese Woche werde ich erst gegen Ende der Woche dazu kommen mir die Demo etwas gründlicher anzugucken. Aber von dem was ich bis jetzt gesehen habe weiss ich jetzt schon, dass ich einiges dazu lernen werde.

    ​Und ich freue mich natürlich auch sehr, dass ich, dank deiner Demo, mit meiner Orders-App endlich wieder ein grosses Stück weiter kommen werde. Ich kam da wegen dieser "Nummern-Affäre" einfach nicht mehr weiter.

    ​Also nochmal Danke,
    Jeiss
    Sorry, wollte nicht stressen. Dachte nur das du die Antwort vieleicht übersehen hast.
    Family geht vor, das ist vollkommen klar!!!!

    Schöne Grüße
    Sascha

    PS: Wenn du fragen hast frag einfach nur. Wie gesagt, ich habe versucht es einfach zu halten und Code ist sicher nicht allzu sauber. Hatte dann irgendwie keine Lust zu einem refactoring. Vorallem nicht ohne UnitTests, das ist so langweilig immer manuell zu testen.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ich hab das Nummer-Tänzchen mal vereinfacht, indem ich wie angekündigt eine ObservableCollection den Job machen lasse, und dann neu durchnumeriere:

    VB.NET-Quellcode

    1. Public Property CurrentOrderSequence As Integer
    2. Get
    3. Return CurrentOrder.CurrentOrderSequence
    4. End Get
    5. Set(value As Integer)
    6. Dim ordrs = New ObservableCollection(Of OrderVm)(CurrentWorkCenter.Orders.OrderBy(Function(o) o.CurrentOrderSequence))
    7. value = Math.Max(1, Math.Min(ordrs.Count + 1, value))
    8. If value > CurrentOrderSequence Then value -= 1
    9. ordrs.Move(CurrentOrderSequence - 1, value - 1)
    10. For i = 0 To ordrs.Count - 1
    11. ordrs(i).SetNewSequenceOrder(i + 1)
    12. Next
    13. CurrentWorkCenter.DoRefresh()
    14. End Set
    15. End Property
    Hallo,
    Hab endlich Zeit gehabt mich um meine kleine Order-App zu kümmern.
    Ich muss zugeben, dass es schon lange her ist, dass ich so gut vorangekommen bin. Ich konnte vieles von Nofear23ms Demo in meiner App einbauen.
    Und ich bin noch nicht fertig. In der Demo ist wirklich alles drin was ich in meiner App brauch. Die Variante meiner App mit den detaillierten WorkCenter-Listen hatte ich schon aufgegeben. Aber dank der Demo müsste ich es fertig bringen die Orders in getrennte Wkc-Listen anzuzeigen. Also ich bin sehr zufrieden.
    Und natürlich kann ich aus so einer kompletten Demo sehr vieles lernen. Was mir auch sehr gut entgegen kommt, ist, das der Code recht einfach gehalten ist und deshalb noch ziemlich verständlich ist. Aber, dass ich den Code verstehen heißt ja noch lange nicht, dass ich in der Lage wäre eine solche demo ohne fremde Hilfe selbst zu erstellen.... Dazu fehlt doch noch einiges.

    Gut finde ich auch den vielfachen Einsatz von Lambda Funktionen (heisst doch irgendwie so...), sogar ineinander "verschachtelt". Echt lehrreich.
    Da wir schon beim verschachteln sind. Nicht so gut liegt mir die Verschachtelung von den "View-Elementen". Sieht natürlich sehr sauber und aufgeräumt aus. Für mich aber irgendwie verwirrend..
    Hab mich auch gefragt, wieso einige Code-Element als "Friend" deklariert werden. Hab das ge-Googelt, hab's trotzdem nicht so richtig kapiert...
    Hängt das damit zusammen, dass du dein Projekt auf "viele Projekte" wie Model,ProductionOrder.App,View und ViewModel aufteilst?
    ​Hab mich auch gewundert was ​NameOf in einem RaisePropertyChanged​-Aufruf "verloren hat"? (z.B. in der DoRefresh​ Methode zu finden). Ist aber nicht so wichtig wenn ich das nicht verstehe. Kommt noch bestimmt noch im Laufe der Zeit.

    Und weil ich neugierig war, hab ich auch ErfinderDesRades Variante der CurrentOrderSequence Eigenschaft getestet. Funktioniert natürlich einwandfrei. Hat aber den kleinen Nachteil, dass man nicht irgendeine Zahl eingeben darf. Sind z.B. einem Wkc nur drei Orders zugeteilt worden, kann der User bei dieser Variante ruhig die Zahl "5 "eingeben. Aber da ich ja der alleinige User dieser App bin, dürfte das ja nicht vorkommen. Könnte sogar als "Platzhalter" dienen. wenn man z.B. weiss, dass bald auch ein viertes Order kommen wird, dann kann man ja ruhig einem Order den Platz "5" vergeben....Warum nicht. Auf jeden fall aber auch interessant.

    ​Und ich finde, dass NoFear23m auch sehr "kreativ" war. Er hat sogar neue Elemente eingebaut von denen nie die Rede war. Einfach nur weil sie logisch sind. Das mit der Kapazität der Wkc ist natürlich tatsächlich ein Thema bei uns...
    ​Als nächstes werde ich z.B. die Gruppier-Funktion in meine App übernehmen. Auch ein sehr hilfreiches feature.
    ​Und wenn meine App dann mal fertig ist, dann kann ich mich ja endlich wieder mehr aufs Lernen von WPF konzentrieren.

    ​Ich hab mir leider, wie von ErfinderDesRades vorhergesagt, ein bisschen Ärger mit Drag&Drop eingefangen. Das war aber lange bevor ErfinderDesRades sich darüber geäußert hat. Ist tatsächlich etwas seltsam. Ich hoffe dass da nicht zu viel Zeit drauf geht um das Problem sauber zu lösen.
    ​Ach ja, ein angenehmer "Nebeneffekt" für den ich auch sehr dankbar bin ist die Tatsache, dass ich nicht versucht habe NoFear23m's Code an den meiner App anzupassen. Sondern hab meinen Code an den von NoFear23m's Demo angepasst. Und siehe da, da sind doch ein paar schöne fette Fehler aufgeflogen....
    ​Also nochmal ein grosses Dankeschön, vor allem an NoFear23m und aber auch an ErfinderDesRades.

    ​Ich werde das Thema aber immer noch nicht abschliessen. Es wäre doch zu schade wenn ich doch noch fragen hätte.

    ​Schönes Wochenende,
    ​Jeiss
    Hallo @Jeiss

    Erstmal freut es mich das dir meine Demo etwas nützt. Das ist gut so und in meinem Sinne.

    Jeiss schrieb:

    Hab mich auch gefragt, wieso einige Code-Element als "Friend" deklariert werden. Hab das ge-Googelt, hab's trotzdem nicht so richtig kapiert...

    Naja, ich habe 1-2 Veriablen statt Private mal der einfachheit halber als Friend deklariert damit ich von einer anderen Klasse innerhalb des VM darauf zugreifen kann.

    Private könnte ich ja nur innerhalb der Klasse zugreifen. Public von überall aus. Also z.b. auch vom View aus.
    Beispiel: Würde ich eine Variable welche von einem Typ eines Models ist würde die View auch einen Verweis auf das Model benötigen wenn ich die Variable als Public kennzeichne da diese ja nach aussen gereicht wird.

    Jeiss schrieb:

    Hab mich auch gewundert was ​NameOf in einem RaisePropertyChanged​-Aufruf "verloren hat"?

    Dir ist ja mittlerweile bekannt das man in der WPF mit INotifiPRopertyChanged bekannt gibt das sich ein Property geändert hat. Üblicherweise im Setter. Soweit sogut.
    Bei einem ReadOnly Property z.b. gibt es keinen Setter. Wie oder besser wo gebe ich jetzt bekannt das sich der Wert der Eigenschaft nun womöglich geändert hat?
    Tja. Beisiel: Es gibt folgende Eigenschaften. Vorname, Nachname und VollerName. Vollername ist ReadOnly. Dann kann ich z.b. jeweils im Setter von Vorname und Nachname auch "PropertyChanged("VollerName")" schreiben damit die WPF auch diesen Wert aktualisiert. Denn.... man kann ja davon ausgehen das sich VollerName geändert haben wird wenn sich entweder VorName oder Nachname ändert.
    Damit ich hier aber Tippfehler ausschlissen kann und auch Compilerprüfung habe (z.b. kann es ja sein das ich mal VollerName auf FullName unbenenne) schreibe ich PRopertyChanges(NameOf(VollerName)).
    Der Compiler macht nix anderes als den Namen der Eigenschaft in einen String zu wandeln. Aber ICH gebe es nicht als String an, somit kann ich mich auch nicht vertippen.

    Wenn du noch Fragen hast frag einfach nur.

    PS: Schade, ich habe extra versucht den XAML sogar ganz einfach zu halten und nicht zu sehr zu verschachteln. Wohl doch noch zu viel ;(

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,
    Ja stimmt funktioniert perfekt identisch! Sorry!

    Ich hatte ErfinderDesRaes's Version der CurrentOrderSequence-Pproperty in meiner App, und nicht in Nofear23m's Demo getestet.
    Und da bekam ich tatsächlich ein anderes "Nummerntänzchen"..?!

    Lag wohl daran, dass ich ein paar kleine "Fehler" in meiner App hatte.
    Wie schon erwähnt, sind diese zum Teil dadurch aufgeflogen, dass ich Nofear23m's Code "1 zu 1" in meine App übernommen hab ohne ihn zu verändern. Ich hab stattdessen meine App an seinen Code angepasst. Dadurch lief meine gesamte App schon etwas "runder".

    Hab aber sowieso beide Varianten in meine App integriert. Die eine ist halt nur aus kommentiert. Meine kleine App ist ja ohnehin noch nicht ganz fertig, welche Variante ich zum Schluss zurückbehalten werde, weiss ich jetzt ja auch noch nicht.
    Und auf meinem "Niveau" ist es immer sehr lehrreich, wenn man verschiedene Wege zur Auswahl hat um das gleiche Ziel zu erreichen.

    Danke,
    Jeiss
    Hallo,
    da bin ich wieder. Hatte die letzte Zeit leider nicht sehr viel Zeit um an meiner kleinen App zu arbeiten.

    Hab es aber doch noch, nach ein paar Wochen, hingekriegt NoFear23m's Demo weiter auszubauen.
    Es fehlte ja noch die Delete-Funktion, um ein Order löschen zu können wenn er fertiggestellt ist.

    Wäre nett wenn jemand sich das angucken könnte.
    Ja, war ja eigentlich nicht so schwierig, denn die Original Demo von NoFear23m war ja schon fast fertig.
    Ich hab mir ziemlich viel Mühe gegeben, dass nicht gleich jeder meinen Kode erkennt. (Im vergleich zu NoFear23m's Kode)
    Das ganze soll ja auch irgendwie "gut aussehen"......

    Funktionieren tut die Delete-Funktion ja mal, ist schon nicht so schlecht. Kann aber natürlich sein, dass ich irgendwas übersehen oder nicht bedacht hab.
    Neben der Gruppier Checkbox, auf dem Hauptfenster, befindet sich jetzt auch ein Delete-Button. Nur drauf klicken und testen....

    Danke,
    Jeiss
    Dateien
    Hallo @Jeiss

    Habe mir die Demo gerade angesehen. OK. Ist es richtig das sich hier ja nicht viel verändert hat? Nur löschen oder?

    Es war/ist ja eigendlcih recht ungeschickt von mir implementiert das sich die WorkCenterVMs nicht mit den OrdersVms snycronisieren.
    Ich hatte das so gemacht weil ich dachte das du ja auch noch was zu tun brauchst. Sowas würde ich mit einem Refactoring machen.

    Im Moment ist es ja so das man die Vms Syncron halten muss. Ändert sich also die Reihenfolge weil man diese im DataGrid umstellt so muss im Code die Reihenfolge auch für die WorkCenter (die Listboxen oben) nachgetragen werden. Kann man gut sehen in OrderVm im Setter von CurrentOrderSequence.

    VB.NET-Quellcode

    1. 'Die WOrkCenter aktualisieren
    2. For Each wc In AviableWorkCenters
    3. wc.DoRefresh()
    4. Next


    Viel schöner wäre es wenn diese VMs das mitbekommen würden. Dann spar man sich die Arbeit. Aber ist kein muss.

    Gut, du deiner implementierung vom löschen.
    Ja, du hast etwas vergessen. Löscht man ein Order so wird dieses gelöscht und das nächste rückt nach und die Reihenfolge wird auch neu gesetzt. Soweit völlig richtig.
    Du hast du vergessen das Order nun auch aus dem WorkCenter zu nehmen. Das bleibt oben drinnen. Unlogisch. Lösche ich es unten muss es oben auch weg sein. ^^

    Habe die DeleteCurrentOrderCommand_Execute Methode mal umgeschrieben. So sieht diese nun aus. Das funzt soweit.

    VB.NET-Quellcode

    1. Private Sub DeleteCurrentOrderCommand_Execute(obj As Object)
    2. 'Throw New NotImplementedException()
    3. If Not SelectedOrder Is Nothing Then
    4. Dim currentOrderSequence As Integer = SelectedOrder.CurrentOrderSequence
    5. Dim NameOfDeletedWkc As String = SelectedOrder.CurrentWorkCenter.WorkCenterName
    6. 'Delete the Order from WorkCenterVm
    7. Dim wsVm = AllAviableWorkCenters.Where(Function(wc) wc.WorkCenterName = NameOfDeletedWkc).First
    8. If wsVm IsNot Nothing Then
    9. wsVm.Orders.Remove(wsVm.Orders.Where(Function(o) o.OrderNo = SelectedOrder.OrderNo).First)
    10. wsVm.DoRefresh()
    11. Else
    12. Throw New Exception("Cannot find WorkCenter")
    13. End If
    14. AllOrders.Remove(SelectedOrder)
    15. REM Reorder the remaining orders WITHIN the wkc.
    16. For Each ord In AllOrders.Where(Function(wc) wc.CurrentWorkCenter.WorkCenterName = NameOfDeletedWkc)
    17. If ord.CurrentOrderSequence >= currentOrderSequence Then ord.CurrentOrderSequence -= 1
    18. Next
    19. End If
    20. End Sub


    Das sollte klappen.


    EDIT:
    Weil es hier auch schon angesprochen wurde und alle immer davor zurückschrecken dachte ich mir das ich mal einfach Drag&Drop einbauen versuche. Ich muss gestehen, ich hatte da nicht wirklich Ahnung und wenn man sich das ganze Online ansieht ist das ganze nicht so prickelnd. Vorallem dann nicht wenn sich die zwei Objekte zwischen denen hin und her gedropt werden soll in unterschiedlichen Ebenen im View befinden. Die Listboxen befinden sich ja jeweils immer in einer eigenen UserControl-Instanz. Somit kann man sich beispielsweise im CodeBehind nicht merke von welche Listbox der "Move" vorgang gestartet wurde. Hier müsste dann wieder was gebastelt werden.

    Tja, und wie kann es anders sein. Dank MVVM sparen wir uns das alles. War agieren ja mit unserem ViewModel.
    Bevor jetzt wer schreit. JA, der Code ist in der CodeBehind des UserControl von die Listbox drinnen ist. Der gehört da auch hin da Drag&Drop NUR die View betrifft und nicht die Daten selbst.
    Und der View darf vom CodeBehind ruig das ViewModel aus dem DatenContext holen und damit hantieren. Und genau so habe ich es gemacht. Die Logik des Drag&Drops übernimmt das VM ohne das die View hineingereicht wird. Sauber.
    Und nicht mal viel Code. Ich weis nicht was immer alle davon abschreckt. Ist doch nicht so schlimm oder?

    VB.NET-Quellcode

    1. Public Class uclWorkCenterItem
    2. Private Sub WorkCenterDrop(sender As Object, e As DragEventArgs)
    3. Dim data = CType(e.Data.GetData(GetType(OrderVm)), OrderVm)
    4. 'Ist herkunft von data gleich mit DatenContext von Listbox
    5. Dim currentWorkCenter = DirectCast(CType(sender, ListBox).DataContext, WorkCenterVm)
    6. Dim dataWorkCenter = data.CurrentWorkCenter
    7. If currentWorkCenter.WorkCenterName = dataWorkCenter.WorkCenterName Then Exit Sub 'Wenn herkunft gleich dann nichts machen. Es ist ein Drop innerhalb der selben Listbox
    8. Dim vm = CType(Me.DataContext, WorkCenterVm)
    9. data.CurrentWorkCenter = data.AviableWorkCenters.Where(Function(wc) wc.WorkCenterName = vm.WorkCenterName).First
    10. currentWorkCenter.DoRefresh()
    11. dataWorkCenter.DoRefresh()
    12. End Sub
    13. Private Function GetDataFromListBox(ByVal source As ListBox, ByVal point As Point) As Object
    14. Dim element As UIElement = TryCast(source.InputHitTest(point), UIElement)
    15. If element IsNot Nothing Then
    16. Dim data As Object = DependencyProperty.UnsetValue
    17. While data Is DependencyProperty.UnsetValue
    18. data = source.ItemContainerGenerator.ItemFromContainer(element)
    19. If data Is DependencyProperty.UnsetValue Then
    20. element = TryCast(VisualTreeHelper.GetParent(element), UIElement)
    21. End If
    22. If element Is source Then
    23. Return Nothing
    24. End If
    25. End While
    26. If data IsNot DependencyProperty.UnsetValue Then
    27. Return data
    28. End If
    29. End If
    30. Return Nothing
    31. End Function
    32. Private Sub ListBox_PreviewMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
    33. Dim data As Object = GetDataFromListBox(CType(sender, ListBox), e.GetPosition(CType(sender, ListBox)))
    34. If data IsNot Nothing Then
    35. DragDrop.DoDragDrop(CType(sender, ListBox), data, DragDropEffects.Move)
    36. End If
    37. End Sub
    38. End Class


    Das wars, das ist alles was man für Drag&Drop zwischen allen drei WorkCenters benötigt. Jedes Order kann in jedes WorkCenter verschoben werden. Und zugleich werden unten dioe Daten mit aktualisiert!

    Hab das Beispiel angehängt. 8o

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ () aus folgendem Grund: Projekt mit Drag&Drop eingefügt

    jo - so ist D&D einfach - von einer Listbox in eine annere.
    Ich hatte dich damals so verstanden, du wollsest die Anordnung der Order innerhalb der Listbox durch D&D verändern.
    Dafür ist imo nämlich auch erforderlich, schon während des Draggens die Stelle zwischen 2 anneren Elementen zu markieren, wo das Item dann "hinfällt", wenn man loslässt.