Notizbuch erstellen, die nächste

  • WPF

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

    Notizbuch erstellen, die nächste

    Hallo Ihr lieben, Hallo @Nofear23m,

    da es mir bisher nicht gelungen ist mein Notizbuch für die Arbeit fertigzustellen, was häufig daran lag, das ich so viele Baustellen zeitgleich in diesem Projekt habe, und ich auf Dauer immer den Durchblick verloren habe, wollte ich dieses Thema erneut aufrollen, zuerst einmal eine grobe Zusammenfassung dessen, was ich zu erreichen versuche, zusätzlich, will ich auch erläutern, warum ich manches so umsetzen will, aber evtl. fallen euch ja bessere Ansätze ein, da bin ich mittlerweile recht flexibel geworden :P

    Hintergrund: Ich arbeite als technischer HelpDesk und supporte sowohl Kollegen als auch Kunden im Umgang mit unseren Simulatoren (Wir produzieren weltweit die Simulations/Übungs-Puppen, an welchen Ärtze, Schwestern, Pfleger und Ersthelfer(CPR) ausgebildet werden). Aufgrund der schieren Menge an verschiedenen Modellen, und damit verbundenen Problemen die auftreten können, benötige ich die Möglichkeit, in meinen Notizen zu suchen, um schnellstmöglich Hilfestellung geben zu können, da ich mir alle Kniffe einfach nicht merken kann, ebenfalls benötige ich Simple Informationen, wie Versandgewichte, oder Artikelnummern.

    Eine der Hürden ist, das mir hier leider keine Datenbank oder dergleichen zur Verfügung steht, sondern lediglich ein Netzlaufwerk, ein langsames, per VPN mit gerade einmal 100Mbit angebundenes Netzlaufwerk, so das jedes gesparte Kb an Daten, einem direkten Performance-Schub gleichkommt.
    Eine weiter Verkomplizierung ist, das mindestens 3 Leute zeitgleich, das Programm benutzen können sollen, in älteren Versuchen hab ich dies per pessimistic Lock erreicht, allerdings scheint mir das einfach nicht elegant genug, evtl. ist euch ja eine Art Datei bezogene Datenbank bekannt, die auch mit mehreren zeitgleich stattfindenden Zugriffen umzugehen weiß?
    Ich habe das SampleProgramm direkt mit einem IDataService aufgesetzt, sodass ich die Heranschaffung oder Abspeicherung der Daten auch im Nachhinein noch problemlos anpassen kann.

    Eine der Haupthürden, mit denen ich bislang einfach keinen Ansatz finde, ist, das Ich gerne x Kategorien benutzen möchte, also jede Kategorie soll unbegrenzt Unterkategorien haben können, z.B. ModellName > ProblemKategorie > Problem > Notiz, aber eben, nur wenn notwendig, ein einfaches ArtikelnummerSammlung > Notiz oder auch Notizen ohne Kategorie sollen ebenfalls möglich sein. Des Weiteren komme ich bisher nicht dahinter, wie ich den jeweiligen Notizen, noch Datei oder URL (wenn möglich ohne Unterscheidung also beides lediglich als "Anhang") Anhänge verpassen könnte, wichtig ist das diese Dateien, aus jeder ProgrammInstanz auf verschiedenen Rechnern heraus abgerufen werden können müssen, daher vermute ich das ich die jeweiligen Anhänge mit auf das Netzlaufwerk kopieren muss, das reine kopieren sollte hier kein Problem darstellen, evtl. als Byte>Base64.String oder dergleichen? Nicht falsch verstehen, wie das grundsätzlich ginge, ist mir bekannt und das sollte ich auch hinbekommen, aber evtl. gibt es ja hierfür eine Art "Patentlösung" die mir bislang nur nicht bekannt ist. Dieser Thread soll vor allem grundlegende Ideen schaffen, damit ich weiß wie ich mich am besten orientieren sollte.

    Die View betreffend, wäre es mir am liebsten, wenn die einzelnen Notizen in einer "Art" TreeView angezeigt werden, die Kategorien sollen also nach Möglichkeit einklappbar sein, jedoch habe ich bisher bei etlichen Versuchen, nie wirklich mit dem TreeView arbeiten können, entweder konnte ich nie das ausgewählte Item abrufen, oder wenn ich per Suche, nach einer Notiz gesucht habe, wurden die entsprechenden Nodes nie aufgeklappt, weshalb ich es aktuell nach wie vor mit einer ListBox angehe, aber evtl. habt ihr auch hier ein paar Ideen, die WPF ist ja enorm anpassbar =)


    Das anhängende SampleProjekt habe ich heute geschrieben, und ich habe nach bestem Wissen und Gewissen alles so weit eingebaut wie es mir derzeit am besten scheint, IDataService, erstmal Simple Notizen, lediglich mit Text und Name, und ich weiß dafür gibbets wahrscheinlich haue, aber ich habe es nicht im klassischen MVVM-Pattern erstellt, da sich mir bisher einfach nicht erschließt, wofür ich noch zugrundeliegende Models brauche, im Allgemeinen arbeite ich mit VM-V. Bisher verwende ich zum Abspeichern die Xml-Serializer Klasse von @Nofear23m allerdings ist diese Version um 2-Fache Komprimierung erweitert, da ich so zum einen deutlich kleinere Dateien habe, und die XML´s nicht im Klartext lesbar sind, was ich irgendwie als Vorteil empfinde. Im Sample hab ich selbst noch ein paar Problemchen entdeckt die mein Gehirn hoffentlich "nur" "noch" nicht zu lösen weiß, z. B., wie ich nach Verändern einer Notiz, direkt abspeichern kann, ich meine klar, wenn ich eine neue Notiz anlege, könnte ich ja einfach SaveNotes aufrufen, aber bei Veränderung fällt mir nichts ein, wo ich das einbauen sollte, etwa bei jedem PropertyChanged oder wie würde ich das am besten angehen?

    So das war jetzt echt erstmal eine ganze Menge Text, danke das Ihr euch das angetan habt =)

    Vielleicht schaffe ich es diesmal mit eurer Unterstützung zu einem Verwendbaren Programm zu kommen, vielen Lieben Dank im Voraus, gerne könnt ihr mir auch Kritik am SampleProjekt mitteilen, man lernt halt nie aus =)
    Dateien
    • SampleNotes.zip

      (146,42 kB, 93 mal heruntergeladen, zuletzt: )
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @ErfinderDesRades Hm die Antwort lautet wohl am ehesten: sowohl als auch.

    Ich hatte mich da mal mit CollectionViewSource. GroupDescriptions beschäftigt, wie es dann etwa aussah ist hier zu sehen, nur habe ich das dann verworfen weil ich nicht dahinterkam wie das mit Mehreren Categorien umsetzbar wäre
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    ah - du meinst: Weder noch.
    Weil eine grouped CollectionView entspricht relational gesehen einem Parent-Child-View: links Kategorien, rechts die Notizen der ausgewählten Kategorie.



    Nur dass das bei diesem Grouped-Klickibunti mit auffnzuklappn is.
    Damit man bei mw. 100 Notizen in einer Kategorie nicht mehr sehen kann, in welcher Kategorie man sich eiglich befindet.



    asusdk schrieb:

    das Ich gerne x Kategorien benutzen möchte, also jede Kategorie soll unbegrenzt Unterkategorien haben können,
    Wie stellst du dir das in einer GroupedListView vor?
    Da müsste dann ja in die OberKategorie-Gruppe entweder Unterkategorieen und/oder Notizen hinein oderwie?
    Und wenns Unterkategorien sind muss man die auch aufklappnBunti, oder?

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

    Das ist mitunter einer der Gründe für diesen Thread, ich bin mir noch nicht sicher, ob und/oder wie das, in etwa in dieser Optik mit mehreren Kategorien umsetzbar ist/wäre oder ob ich dann doch nur eine Übergeordnete Kategorie verwenden kann, bzw. einen anderen Darstellungsweg verwenden muss.
    Ich möchte mich an dieser Stelle schonmal dafür entschuldigen, das ich mich häufig nicht deutlich genug ausdrücke, da mangelts zugegebenermaßen noch an Grundverständiss, wie Objekte überhaupt in beziehung gesetzt werden.

    Ich dachte vor einiger Zeit mal an diesen Ansatz: Eine Klasse Kategorie, die Ihrerseits selbst Kategorien oder aber direkt eine Notiz beinhalten kann, das hab ich damals verworfen, weil ich keinen Weg gefunden habe das umsetzen. Danach hatte ich es wie oben gepostet versucht, musste so aber feststellen, dass ich wohl "nur" eine Kategorie pro Notiz angeben kann. Du siehst ich bin mir hier weder über die korrekte Umsetzung, noch über alternativen wirklich im Klaren. Ich hoffe du konntest meinem Erklärungsversuch einigermaßen folgen, Danke dir auf jeden Fall =)

    LG
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Ich hab mal ein FotoAlbum geproggt - da gabs ein hierarchisches Kategorie-System.
    Es gab grundverschiedene Kategorien, wie NachtAufnahmen und Menschenbilder.
    Aber es gab auch Unterkategorien, etwa
    Menschenbilder->Gruppenfotos->Zweier-Portraits->Portraits

    Die Kategorien wurden im TV mit Checkboxen angezeigt.
    Das wurde auf zwei weisen verwendet:
    1. Man konnte in einem AlleBilder-View mehrere Fotos anwählen, und ihnen mehrere Kategorien zuordnen
    2. Man konnte mit Drag&Drop aus den Kategorien einen neuen kleinen Kategorie-Baum zusammenbasteln.
      Dieser stellte dann ein komplexes Suchkriterium dar: Ineinander-geschachtelte Kategorien waren eine Und-Verknüpfung, nebeneinanderliegende galten als Oder-Verknüpfung.
      Und es gab auch einen Negations-Knoten.
      Also man konnte Gruppenfotos+Nachtaufnahme definieren - da kamen auch Portraits bei Nacht raus.
      Ausser man definierte Gruppenfoto+Nachtaufnahme+Nicht+Portrait
    Schöner Ansatz das, aber es blieben noch immer boolsche Ausdrücke, die sich mit dem Bäumchen-Query-Builder nicht konstruieren liessen.

    Langer Rede kurzer Sinn: Hierarchische Kategorien kann man als Baum darstellen, und mit derlei Kategorien kann man boolsche Ausdrücke bauen, um gut geziehlte Suchabfragen abzufeuern.
    Bei dem Ansatz scheint mir nicht machbar, die Notizen als innerhalb von Kategorien darzustellen.
    Sondern eben jede Notiz verweist auf viele Kategorien, und Kategorien kann man verwenden um komplexe Filter zu bauen.
    Sorry das ich einhake.

    Ich würde als erstes die Sache mit der Datenhaltung und den Anhängen klären.
    Gerade wenn das Netzlaufwerk langsam ist ist ne XML eher nix, vorallem weil man keine gite Möglichkeit für Projektion und der gleichen hat.

    Würde denn eine Rest API in Frage kommen? Klar, die musste irgendwo hosten, dafür hätte jeder von überall aus Zugriff. Ich denke es sollte mal feststehen welche Backend in Frage kommen würden.

    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. ##

    Hm also mit REST habe ich noch nie gearbeitet, bezogen darauf, das folgender Thread das richtige ist:
    REST API wirkt es jedenfalls schonmal sehr komplex. Von meinem Arbeitgeber werde ich leider keine Möglichkeit erhalten irgendwas zu hosten, wenn es also darauf hinausliefe, würde ich es allerhöchstens bei mir zuhause per Apache-Server hosten können, da ich aber zuhause gerade einmal 6Mbit down und 4 Mbit Upload habe wird das dafür vermutlich nicht ausreichen, nehme ich mal an ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Ja, genau solche Dinge will ich eben alle erstmal durchgehen. Wenn du keine Möglichkeit hast eine WEB API zu Hosten und die 3 Euro zu viel sind muss man was anderes nehmen. Es gibt aber auch Datenbank die man als File auf nem Netzlaufwerk haben kann, aber zu meintest ja das die Performance von diesem Laufwerk sehr schlecht ist weshalb ich persönlich dann eben ins Web gehen würde.
    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 denke nicht das das Geld hier das ausschlaggebende Argument ist, sondern vielmehr, das meine Firma möglichst keine außenstehenden Speicherorte für Firmeninterne Daten haben möchte, und da wir in DE nur eine Art Zweigstelle sind, und unser Mutterkonzern in Norwegen uns für so ein "kleinkram" keinen eigenen Server einrichtet, sind mir leider tatsächlich die Hände an das Netzlaufwerk gebunden
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    Ich denke nicht das das Geld hier das ausschlaggebende Argument ist, sondern vielmehr, das meine Firma möglichst keine außenstehenden Speicherorte für Firmeninterne Daten haben möchte, und da wir in DE nur eine Art Zweigstelle sind, und unser Mutterkonzern in Norwegen uns für so ein "kleinkram" keinen eigenen Server einrichtet, sind mir leider tatsächlich die Hände an das Netzlaufwerk gebunden


    Warum keine Access DB nehmen?
    Ein Freund von mir hatte das selbe "Problem". Aber. Wenn die Firma es will dann muss sie auch was zur Verfügung stellen.
    Er hatte es dann ne weile so laufen das er einfach auf seinem Rechner in der Firma die DB laufen hatte. Braucht man ja nur SQL Server installieren.
    Als die Firma merkte das sein Tool funktioniert haben sie einfach einen "alten" Rechner irgendwo ohne Monitor platziert welcher einfach immer läuft und gut. Ist wie ein Server. Dort läuft SQL Server und alles ist gut.

    Wenns von ausserhalb erreichbar sein soll dann einfach ein Portforwarding und gut ist.

    Verstehe mich nicht falsch, ohne Werkzeug kann man nicht arbeiten. Entweder dir wird Werkzeug gestellt oder eben nicht. Es bringt nichts wenn man auf etwas aufbaut was auf dauer nicht funktionieren kann und wo man weis das es mit der Zeit auch immer langsamer wird.

    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. ##

    Ja dann werd ich versuchen da mal etwas auf die Beine zu stellen, aber schon mal eine kurze Zwischenfrage, da ich beim Überfliegen der Kapitel in deinem Tutorial nicht fündig geworden bin, gibt es von dir ein Tutorial bezüglich des WPF-TreeViews ? Ich denke das wäre mir auf jeden Fall die liebste Darstellungsmethode, aber bisher hab ich kein für mich verständliches Tutorial dazu gefunden.

    LG und Danke
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    echt nicht? ich hab doch glaub zwei Samples drinne im wpf-bereich. Oder drei, das BindingPicking hat auch ein Treeview.

    Aber ich sehe das Kategorie-Datenmodell noch überhaupt nicht auskonzipiert.
    Da hats wenig Sinn, sich auf den TV zu stürzen, wenn du noch garnix hast, im TV anzuzeigen.
    Klar kannst du ein Kategorie-Baum-Bearbeitungs-Programm schreiben, aber was willste eiglich mit den Kategorien anfangen und wie?
    Naja, die Kategorien sollen eigentlich wie eben in einem TreeView auf und zugeklappt werden können, da ich eben nur Ein TreeView oder Eine ListBox verwenden möchte und eben nicht 2 Spalten. Es geht also am ehesten darum, das nur die Notizen angezeigt werden, deren Kategorie aufgeklappt ist.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo

    Ich habe im Kapitel zu den HirarchicalDatatemplates einiges mit Treeview drinnen wenn ich nicht irre.

    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. ##

    asusdk schrieb:

    Es geht also am ehesten darum, das nur die Notizen angezeigt werden, deren Kategorie aufgeklappt ist.
    1. Aber wenn einer Notiz mehrere Kategorien zugeordnet sind - soll sie dann in viele Kategorie-Nodes gleichzeitig eingehängt sein?
    2. Und was ist mit übergeordneten Kategorien?
      Muss man da alle untergeordneten Kategorien auch aufklappen, um alle matchenden Notizen sehen zu können?
    3. Was ist, wenn eine Kategorie 200 Notizen enthält?
      In einem Treeview verliert man sich recht schnell, wenn mehr als Hundert Nodes in einen Node eingeschachtelt sind.
      Weil beim drin herum-scrollen schieben sich die Parent-Nodes aus dem Gesichts-Feld.
    Ich gebe ErfindeDesRades völlig recht, ich würde in solch einem vorhaben jetzt auch nicht unbedingt an ein TV denken.
    Ich kann mir hier eher vorstellen das ich eine Art mehrstufigen Filter mittels Autocompletebox implementiere. Ist sicher auch schneller zu bedienen für den User. Speziell nach mehrmaliger verwendung wenn die Kateogien bereits bekannt sind.

    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. ##