TreeView: Artikel und Warengruppen-Struktur Dynamisch laden und nutzen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ryLIX.

    TreeView: Artikel und Warengruppen-Struktur Dynamisch laden und nutzen

    Guten Tag die Damen und Herren,

    Ich wende mich nun an dieses Forum da ich bzgl. meiner Anwendungs-Vorstellungen auf dem Schlauch stehe.

    Kurz zu mir:
    Ich selber habe bis vor kurzem nur mit "PowerBASIC" gearbeitet und darauf basierend Warenwirtschaftssysteme entwickelt. Selber mit direkten Controls und Elementen musste ich nicht arbeiten da die Hintergrund-Struktur gegeben war.
    Nun fange ich an und arbeite mit einer neuen Entwicklungsumgebung die Objekt-Orientiert ist. Damals, in meiner Ausbildung vor einigen Jahren, hatte ich zwar schon einige Kontakte mit dem Visual Studio.NET und Visual Basic 2003 aber das ist alles größtenteils versickert und darum bin ich nun hier.
    Ich arbeite mit Visual Basic 2005.


    Was soll erreicht werden?
    Ich habe eine Datei im Textformat die jeweils einen Artikel mit sämtlichen dazugehörigen Inhalten beinhaltet. Darunter ist auch die "Kategorietiefe", Gewicht, Anzahl und vieles mehr.
    Das Interessante hier ist das ich die "Kategorien" in das Treeview laden möchte.
    Die Datei bzw. Artikelzeile könnte wie folgt aussehen.

    Quellcode

    1. Kategorie1 - Unterkategorie1 - Unterkategorie2 | Artikelnummer - Bezeichnung - Gewicht .....

    Als Beispielt würde das dann so aussehen

    Quellcode

    1. Konsolen - Nintendo - Wii | 2345644 - WiiSports - 4 ......


    Diese Artikelzeile würde ich nun in einer FOR Schleife durchlaufen und mein Ziel ist es diese Kategorien in ein TreeView zu laden. Dynamisch natürlich.
    Es soll am Ende soweit möglich sein das ich jeden Knotenpunkt anklicken kann und die Unterkategorien aufgeploppt werden (so wie bei einer Ordnerstruktur). Ebenfalls sollen dann zu jeder Kategorie auch die untergeordnete Artikel angezeigt werden(das aber später in ein Datagrid, als nicht das Problem hier).

    Später möchte ich das ganze Auswerten können. Das heißt ich kann jeden Knotenpunkt "checken" und für diesen Bereich soll dann eine Routine durchlaufen.

    Wo brauche ich nun Hilfe?
    Wie kann ich die Struktur und das ganze am besten Lösen.
    Macht es vielleicht irgendwie Sinn eine Klasse oder ähnliches zu erstellen - wo man den Artikel, die zugehörigen Daten und die Obergeordnete Kategorie findet?
    Und wenn ja, wie müsste ich das ganze beginnen.


    Ich bedanke mich für jeden Hilfreichen Quellcode-Schnipsel, Link, Ideen oder dergleichen :)
    Gesucht habe ich natürlich selber aber wenn man irgendwann nicht die passenden Begriffe oder Idee-Stellungen hat muss man nachfragen.


    Vielen dank im vorraus

    Liebe grüße
    Bibi
    Müssen das Unbedingt Textdateien sein oder kannst du auch auf ein anderes Format wechseln?

    Mit XML wäre das ganze westenlich einfacher.
    Treeview mit XML befüllen

    Ich habe das als Grundlage für mein aktuelles Projekt genommen.
    Funktioniert wunderbar und ist selbst bei größeren Dateien sehr schnell.
    Zu dem hast du keine Einschränkungen was die Tiefe betrifft.

    Wenn es unbedingt die Textdateien sein müssen dann solltest du dir die TextFieldParser-Klasse aus Microsoft.VisualBasic.FileIO anschauen.
    Damit hast du die Möglichkeit über einen Delimiter Text zu trennen.
    Das ganze kannst du dann in ein Array (Datenfeld)speichern und die Treeview Komponente damit befüllen.
    Wobei das ganze dann nicht sehr dynamisch ist und auch nicht unbedingt schnell.
    Hey,
    vielen dank für die Antwort und das Annehmen meiner Problematik.

    ryLIX schrieb:

    Müssen das Unbedingt Textdateien sein oder kannst du auch auf ein anderes Format wechseln?

    Die Textdateien sind das Format, die ich bekomme.
    Diese muss ich dann nach einem bestimmte Zeichenformat auswerten. Wie das genau ist weiß ich "noch" nicht aber ich glaube mit Zeichenlänge wird das gefiltert. Das ist auch kein Problem.

    ryLIX schrieb:


    Mit XML wäre das ganze westenlich einfacher.
    Treeview mit XML befüllen

    Ich habe das als Grundlage für mein aktuelles Projekt genommen.
    Funktioniert wunderbar und ist selbst bei größeren Dateien sehr schnell.
    Zu dem hast du keine Einschränkungen was die Tiefe betrifft.

    Ich denke vielleicht wäre es Sinnvoll das nachdem auswerten der Textdatei in eine .xml zu wandeln?
    Aber andererseits, wäre es dann nicht Sinnvoll das in Objekte bzw. irgendwelchen Sammlungen festzuhalten um damit später weiter arbeiten zu können? (Sorry, aber hier fehlt mir noch etwas das Wissen)

    ryLIX schrieb:


    Wenn es unbedingt die Textdateien sein müssen dann solltest du dir die TextFieldParser-Klasse aus Microsoft.VisualBasic.FileIO anschauen.
    Damit hast du die Möglichkeit über einen Delimiter Text zu trennen.
    Das ganze kannst du dann in ein Array (Datenfeld)speichern und die Treeview Komponente damit befüllen.
    Wobei das ganze dann nicht sehr dynamisch ist und auch nicht unbedingt schnell.
    [/QUOTE]
    Ich danke dir, ich werde mal schauen was ich da machen kann.

    Nach wie vor ist mein größtes Problem noch das Füllen des Treeviews in einer Dynamischen Form.
    Hier werde ich mal schauen was ich machen kann.

    Sollte ich neues haben, Quellcode zum vorzeigen oder Hilfe benötigen melde ich mich. Bis dahin wäre ich dennoch für Vorschläge offen.


    Vielen Dank für die Anteilnahme
    Das Befüllen erfolgt zur Laufzeit (sonst wäre es ja nicht dynamisch ^^).
    Ich habe das bei mir mit 2 TreeView Komponenten gelöst.
    In einem ist der Hauptzweig, im anderen der Nebenzweig.
    Der Hauptzweig wird beim Start befüllt und der Nebenzweig dann dynamisch durch die auswahl im Hauptzweig.
    Troz zusätzlicher verlüsselung läuft das ganze auf einem 1000MHZ Rechner relativ schnell.

    Du kannst ein TreeView auch aus einem DataSet herraus befüllen.
    Wenn du die Möglichkeit hast deine vorgabe Daten in ein Datenbankfromat zu konvertieren (SQLite z.B.) kannst du auch das nutzen.
    Hier wäre der Vorteil das du Daten auch schnell ändern kannst.
    Und diese auch für andere Sachen ziemlich unproblematisch einsetzten kannst (grafische Dartsellung auf Charts o.ä.).

    Ob es sich wirklich lohnt die Daten in ein anderes Format zu bringen musst du entscheiden.
    Ich weiß ja nicht was dein Programm später alles können soll.
    Für mein Programm hab ich mir extra 2 Tools geschrieben die mir die Daten nach XML übersetzt haben da die Datenmenge für Handarbeit zu groß ist (~ 450.000 Zeilen XML).

    Es wäre also erstmal wichtig dass du das Programm planst um zu wissen was es können muss und in wie weit du folgende Versionen ausbauen willst. Und es wäre gut zu wissen ob du die Daten nur einmal bekommst oder ob diese regelmäßig erneuert werden müssen.
    Hey,
    vielen dank für die Hilfe.
    Dann erkläre ich dir erst einmal was das Programm können soll.

    Es ist ein Transfer-Programm das als Schnittstelle zu einem Warenwirtschaftssystem, den Artikeldaten per Textdatei und Online-Shops dienen soll.

    Ein Arbeitsablauf wäre folgender:
    1) Daten vom Lieferanten holen (FTP Download der .txt)
    2) Warengruppen (Computer --> Festplatten --> Extern) in ein Treeview laden
    3) Die Warengruppe, die wir nicht brauchen, "abwählen" (Checkbox)
    4) Filtern. Jetzt sollen die Daten in ein Datagrid geladen werden wo ich dann die einzelnen Artikel sehen kann. Aufgelistet werden sollen alle. Natürlich sollen diese auch dort bearbeitet werden können (in den einzelnen Zeilen)
    5) Jetzt habe ich die Daten im Datagrid, alles zu meiner Zufriedenheit bearbeitet und kann sie da überprüfen.
    6) Import in ein anderes bestehendes System. Das kann also sein das ich es in das Warenwirtschaftssystem oder den Webshop einpflege. Dazu durchlaufe ich später das Datagrid und führe dafür die einzelnen SQL Befehle aus.


    Ein anderer Arbeitsablauf könnte sich halt bei Schritt 1 ändern. Dort könnten dann in das Datagrid/Treeview Daten von dem Warenwirtschaftssystem oder dem Webshop gelanden werden und woanders eingefügt werden.


    Ich hoffe das Hilft für das Verständnis. Ansonsten würde ich es noch ausführlicher erklären.
    Vielen dank für deine Hilfe.
    Ich bin gerade dabei die Standard-Elemente wieder zu erlenen. Spricht FTP Upload(gerade hinbekommen aber nicht elegant, mit Statusanzeige wäre toll), Menü-Leiste und andere Kleinigkeiten.


    Danke :)
    Wenn der FTP Upload länger dauert such dir mal was zum Thema BackgroundWorker.
    Dann wird das mit der Statusanzeige auch einfacher.

    Wenn die Daten so kommen wäre es am besten sie direkt ins DataGrid zu schicken.
    Da dein Programm ja quasi schon als Converter dient "Txt->SQL"
    Also wäre esam besten du baust dir ein Modul oder eine Klasse mit dem TextFieldParser.
    Dazu 2 Arrays die dementsprechend befüllt werden.
    Also ein Array für die Warengruppen und eines für die Artikel der Warengruppen.
    In dem Artikel Array solltest du zusätzlich ein ID Feld anlegen.
    In dieses ID Feld legst du den Index der Warengruppe im Warengruppenarray.
    So kannst nachher anhand des Index der Warengruppe alle dazu gehörigen Artikel abrufen.

    Dann ist das Treeview der Warengruppe zwar statisch aber du kannst dann nutzen um ein zusätzliches TreeView für die Artikel (denn die sind ja wichtig) zu befüllen.
    Habs grad nicht vor mir aber wenn ich mich recht erinnere kannst du jedem TreeViewNode auch eine CheckBox verpassen.
    Über diese kannst du dann abfragen obs mit in den Datensatz des DataGrid soll oder nicht.

    Dann noch nen Button um das DG zu befüllen mit den ausgewählten Artikeln (ggf. auch mit Warengruppe) und der Rest ist dann einfach :)

    Schwierig wird nur der Parser.
    Aber ich denke das sollte lösbar sein.
    Wenn es nicht Möglich ist die beiden Elemente der Liste im Parser zu trennen (in deinem Beispiel also der Bereich vor und hinter dem | ) solltest du dort zu erst was machen.
    Z.B.:
    Die Datei in einen FileStream laden und immer nur eine Zeile an den Parser geben und an dem | trennen.
    Nun musst du ein wenig Tricksen, denn es ist eine Art FlipFlop nötig um Warengruppen und Artikel nicht in den gleichen Zielstream bzw Zeilstring (würde Streams empfehlen) zu schicken.
    Dann wieder Zerlegen in einzelne Zeilen und dann diese Zeilen auftrennen in die einzelnen Werte.
    Klingt etwas kompliziert aber dürfte einfacher sein als gedacht ;)

    ryLIX schrieb:

    Wenn der FTP Upload länger dauert such dir mal was zum Thema BackgroundWorker.
    Dann wird das mit der Statusanzeige auch einfacher.

    Werde ich dann später, beim Finetuning machen. Ich bin ja schon froh das ich es hinbekommen habe die Datei vom Server zu ziehen und in ein Zielverzeichnis zu bekommen.

    ryLIX schrieb:


    Wenn die Daten so kommen wäre es am besten sie direkt ins DataGrid zu schicken.
    Da dein Programm ja quasi schon als Converter dient "Txt->SQL"
    Also wäre esam besten du baust dir ein Modul oder eine Klasse mit dem TextFieldParser.
    Dazu 2 Arrays die dementsprechend befüllt werden.
    Also ein Array für die Warengruppen und eines für die Artikel der Warengruppen.
    In dem Artikel Array solltest du zusätzlich ein ID Feld anlegen.
    In dieses ID Feld legst du den Index der Warengruppe im Warengruppenarray.
    So kannst nachher anhand des Index der Warengruppe alle dazu gehörigen Artikel abrufen.

    Dann wären also die Arrays als "interne" Datenbank zum Nutzen und bearbeiten gedacht, richtig?

    ryLIX schrieb:


    Dann ist das Treeview der Warengruppe zwar statisch aber du kannst dann nutzen um ein zusätzliches TreeView für die Artikel (denn die sind ja wichtig) zu befüllen.

    Das TreeView soll am Ende "nur" die Warengruppen beinhalten.
    Du sagst das es dann "Statisch" ist.
    Wie muss ich das verstehen? Ich lese ja nun jede Warengruppe aus und packe die, falls nicht vorhanden, als Knotenpunkt in das TreeView... und natürlich als "Unterpunkt".
    Wenn ich diese dann noch auslesen kann ist doch eigentlich alles Dynamisch.


    ryLIX schrieb:


    Habs grad nicht vor mir aber wenn ich mich recht erinnere kannst du jedem TreeViewNode auch eine CheckBox verpassen.
    Über diese kannst du dann abfragen obs mit in den Datensatz des DataGrid soll oder nicht.

    Da liegst du richtig. Das kann man in den Eigenschaften einstellen. Aber soweit bin ich "noch" nicht :)

    ryLIX schrieb:


    Dann noch nen Button um das DG zu befüllen mit den ausgewählten Artikeln (ggf. auch mit Warengruppe) und der Rest ist dann einfach :)

    Wenn ich da angekommen bin habe ich auch das Meiste geschafft :)

    ryLIX schrieb:


    Schwierig wird nur der Parser.
    Aber ich denke das sollte lösbar sein.
    Wenn es nicht Möglich ist die beiden Elemente der Liste im Parser zu trennen (in deinem Beispiel also der Bereich vor und hinter dem | ) solltest du dort zu erst was machen.

    Das Parsen werde ich, bevor ich das TreeView fülle, als nächsten Schritt übernehmen. Sollte aber kein Problem sein da wir es in einem anderen Tool schon gemacht habe (in anderer Sprache). Hier werde ich dann abgucken. Dazu sollte gesagt sein das "|" nur ein Beispiel zum Verständnis war, nicht der Tatsache entspricht.
    In Wirklichkeit ist es glaube ich mit "nicht sichtbaren" Symbolen "oder" anhand einer Zeichenlänge getrennt. Das dürfte aber kein Problem sein.

    ryLIX schrieb:


    Z.B.:
    Die Datei in einen FileStream laden und immer nur eine Zeile an den Parser geben und an dem | trennen.
    Nun musst du ein wenig Tricksen, denn es ist eine Art FlipFlop nötig um Warengruppen und Artikel nicht in den gleichen Zielstream bzw Zeilstring (würde Streams empfehlen) zu schicken.
    Dann wieder Zerlegen in einzelne Zeilen und dann diese Zeilen auftrennen in die einzelnen Werte.
    Klingt etwas kompliziert aber dürfte einfacher sein als gedacht ;)

    Das bekomme ich sicherlich hin. So etwas habe ich damals in PowerBASIC auch machen müssen :)

    Ich danke vielmals für die ganzen Hilfestellungen, schön das man hier nicht alleine Redet *froi*

    Bibi schrieb:

    Das TreeView soll am Ende "nur" die Warengruppen beinhalten.
    Du sagst das es dann "Statisch" ist.
    Wie muss ich das verstehen? Ich lese ja nun jede Warengruppe aus und packe die, falls nicht vorhanden, als Knotenpunkt in das TreeView... und natürlich als "Unterpunkt".
    Wenn ich diese dann noch auslesen kann ist doch eigentlich alles Dynamisch.
    Ich glaub ich hatte da was falsch Verstanden :)
    Hatte es so verstanden das du feste Warengruppen hast und da drin die Artikel.
    Und dann auswählen möchtest welche Artikel in die Datenbank sollen.
    Aber wenn du die die komplette Warengruppe so über nehmen möchtest (wenn sie dan ausgewählt wurde) dann kannst du natürlich auf das zweite Treeview verzichten.
    Das mit statisch war auf das TreeView der Warengruppe bezogen. Wenn du ein zweites TV für die Artikel hast brauchst du das der Warengruppen nicht ändern und somit wird es statisch nach der Befüllung bis zur nächsten ;)
    Solltest du doch noch die Artikel auswählen lassen kannst du statt des Treeview auch eine ListBox mit MultiSelect nehmen ;)
    Ich hab mein Projekt heute auf eine TreeView, Listbox Kombination umgestellt weil es so mehr Bedingkompfort hat :)


    Bibi schrieb:

    In Wirklichkeit ist es glaube ich mit "nicht sichtbaren" Symbolen "oder" anhand einer Zeichenlänge getrennt. Das dürfte aber kein Problem sein.
    Feste Zeichenlänge wäre das absolute Optimum.
    Heißt wenn jedes Feld eine feste Zeichenlänge hat egal wieviele Zeichen die eigentliche beschriftung hat (z.B. jedes Feld Artikelname 20Chars) dann brauchst du dir unter dem Link zu TextParser nur den Abschnitt "Texte mit fester Zeichenlänge parsen" anschauen.
    Dann ist viel arbeit schon getan :)

    ryLIX schrieb:

    Und dann auswählen möchtest welche Artikel in die Datenbank sollen.

    So in etwas soll es auch sein. Ich soll zwar in erster Linie jede Warengruppe "aktivieren" bzw. "deaktivieren" können, welche dann in die Datenbank eingetragen wird aber ebenfalls auch die einzelnen Artikel in dem "Datagridview". Das Datagridview soll letzt endlich mit allen Daten gefüttert werden, gefiltert nach den aktivierten Warengruppen.


    Ich habe jetzt folgendes Problem wo ich im Internet oder hier nichts wirklich passendes finde. Oder ich bin zu blöd die richtigen Suchbegriffe zu nutzen :)
    Ich möchte nun mein DataGridView mit Daten füllen.
    Das mit der Berücksichtigung das ich später diese Daten im Grid "editieren", "erweitern", "löschen" und dann letzt endlich an die Datenbanken übergeben kann.

    Was muss ich dafür nutzen? Ich habe von einem Dataset gelesen. Ist das solch ein Objekt(?) das dafür am besten geeignet wäre?
    Was mir hier fehlt ist der passende Quellcode, Tutorial oder ähnliches. Ich finde nur Anbindungen an Datenbanken. Diese brauche ich aber im Moment nicht weil ich meine Zeichenwerte, die ich eingeben will, Zeile für Zeile erhalte.
    Ich durchlaufe ja eine Textdatei und möchte jede Zeile "passend" in das Datagrid füllen.

    Über jegliche Hilfe, Verständnisansätze, Links und c.o. wäre ich sehr dankbar.

    ryLIX schrieb:

    Gugg dir des mal an -> Klick
    Dort ist der Umgang mit den Datenbank Komponenten erklärt.

    Noch einmal vielen dank.
    Diese Quelle, die du mir dort genannt hast, habe ich bereits in meinen Bookmarks und wird natürlich mit zur Rate gezogen, danke für den Link :)

    Ich habe mich nun dazu entschieden mit XML zu arbeiten.
    Genauer genommen erstelle ich nun XML Dateien und arbeite bei diesen mit DataSets. Diese Source kann man schnell einlesen und auslesen und dürfte - sollte ich mich nicht irre - für die spätere Anwendung recht bequem sein.

    Nun habe ich mein Dataset gefüllt, bekomme es aber nicht ins DataGridView geladen. Auch die Suchfunktion hilft nichts, mein DataGridView bleibt leer.

    Folgender Code:

    VB.NET-Quellcode

    1. Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
    2. Dim ProductList() As String = IO.File.ReadAllLines("C:\Entwicklung\datei.txt")
    3. Dim i As Integer
    4. Dim sProductString As String
    5. Dim DS As New DataSet("Datenbank")
    6. Dim DT As DataTable = DS.Tables.Add("Products")
    7. DT.Columns.Add("Zeile 1", GetType(String))
    8. DT.Columns.Add("Zeile 2", GetType(String))
    9. Dim DR As DataRow
    10. i = ProductList.GetUpperBound(0)
    11. For i = ProductList.GetLowerBound(0) To ProductList.GetUpperBound(0)
    12. sProductString = ProductList(i)
    13. DR = DT.NewRow
    14. DR("Zeile 1") = i.ToString
    15. DR("Zeile 2") = sProductString
    16. DT.Rows.Add(DR)
    17. Next
    18. DS.WriteXml("C:\Entwicklung\Datei.xml")
    19. GridProduct.DataSource = DS
    20. End Sub


    Die XML Datei wird noch korrekt erstellt jedoch das DataGrid nicht ordentlich angezeigt.
    Ich hatte schon Probiert GridProduct.Refresh zu nutzen und habe von GridProduct.Databind() gelesen jedoch diese gibt es nicht.
    Was muss ich noch machen damit es angezeigt wird?

    Ich danke vielmals

    Edit: Ich habe es doch noch selber raus gefunden
    Folgendes Fehlte:

    VB.NET-Quellcode

    1. GridProduct.DataMember = "Products"
    2. GridProduct.Refresh()

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bibi“ ()

    Habe es nun soweit hinbekommen.
    Es wird nun eine .xml erstellt die jeweils ein Product und dessen Warengruppen + andere Infos beinhaltet.
    Selbiges wird nun auch im Datagrid ausgelesen.

    Nun habe ich das Problem mit dem TreeView.

    Wie bekomme ich es mit den Knotenpunkten und Unterpunkten hin?
    Ich habe jetzt bei diesen Artikel 3 tiefen.
    Beispiel:
    "Computer" -> "Kabel" -> "USB"

    Diese werden bei jedem Artikel als "Kategorie 1", "Kategorie 2" und "Kategorie 3" angeben.
    Das ist "noch" Statisch, an anderen Datenquellen muss ich es aber dynamisch hinbekommen.

    Nun muss ich es hinbekommen, das wenn ich die Produkte durchlaufe, das TreeView dementsprechend gefüllt wird. Wichtig ist auch das die einzelnen Kategorien nicht doppelt vorkommen.
    Wie mache ich das am besten?

    Über jede Hilfe bin ich nach wie vor sehr sehr dankbar :)
    Hmm ich weiß nicht von wo du deine Daten bekommst.
    Ich geb dir mal ein Beispiel von einer XML Datei:

    PHP-Quellcode

    1. <ROOT>
    2. <TreeViewNode value="Warengruppe1">
    3. <TreeViewNode value="Untergruppe1" />
    4. <TreeViewNode value="Untergruppe2">
    5. <TreeViewNode value"Untergruppe2.1" />
    6. </TreeViewNode>
    7. <TreeViewNode value="Untergruppe3" />
    8. </TreeViewNode>
    9. <TreeViewNode value="Warengruppe2">
    10. <--!Und so gehts halt immer weiter-->
    11. </TreeViewNode>
    12. </ROOT>


    Du kannst das ganze auch über eine zusätzliche Datenbank lösen.
    Wo dann diese Unterteilung drin ist.
    Google Suchwörter wären: TreeView aus DatenBank befüllen, TreeView aus XML Befüllen
    Leider finde ich nichts passendes für das TreeView und es bereitet mir noch immer Schwierigkeiten.
    Sowohl vom Aufbau, Anwendung und Umsetzung her bin ich da total unsicher und finde auch nichts passendes.

    Das ich die Artikel nun in ein Datagrid auslese klappt aber das mit dem Treeview ist bei mir noch mist.
    Ich habe leider keine Ahnung wie ich die Verbinung von Knoten zu Unterknoten zu Artikel, die dem Unterknoten aufgelistet sind, hin bekomme.

    -------------

    Anderes Thema:
    XML: Ich suche mich ja gerade dämlich, vor allem weil man in Foren ja nicht nach "XML" Suchen kann.
    Ich würde gerne das XML Format für Einstellungen nutzen. Genauso wie bei der .ini
    Ich habe also "feste" Schlüsselwerte die ich eintragen und auslesen will. Statisch so gesehen.
    Mir fehlt nun hierfür der passende Code wie ich den Schlüssel schreiben und lesen kann.
    Hat hier jemand etwas passendes? (Nicht das dynamische Auslesen ist gemeint)
    Für Benutzer Einstellungen kannst du My.Settings benutzen.
    Projekteigentschaften und dann auf Einstellungen ;)

    Ich weiß im Moment nicht wie du die Textdateien verarbeitest aber ich versuch dir mal nen Hinweis zu geben.

    Wenn du die Daten einliest bekommst du ja "Warengruppe" dann eventuell noch eine Untergruppe und dann die Artikelgruppe (ich hoffe das ich das so richtig verstanden habe).

    Also wenn du Warengruppe bekommst zu erst kontrollieren ob es schon einen Knoten auf dem Root(Level 0) gibt der diesen Namen trägt.
    Wenn ja das hinzufügen das Knoten überspringen und weiter machen. Für denn Fall das kein Knoten existiert einen hinzufügen mit der Bezeichnung der Warengruppe als Name.

    Dann kommt die Untergruppe. Nun musst du dir die Position der Warengruppe im TreeView holen (geht über den Namen soweit ich weiß) und dann in dieser Warengruppe kontrollieren ob es schon eine Untergruppe mit dem Namen gibt wenn nich einfügen sonst weiter ohne was zu tun.

    Und so musst du halt Stück für Stück alles ablaufen lassen.
    Eine Rekursive Funktion wäre auch Möglich.
    Dazu liest du den ganzen Text ein und arbeitest das Array dann ab.
    Hier kannst du aber darauf verzichten die Position des Nodes zu ermitteln da du diese beim einfügen auch zurück geliefert bekommst und so kannst du dann diese beim rekursiven Aufruf wieder mit übergeben :)

    ryLIX schrieb:

    Für Benutzer Einstellungen kannst du My.Settings benutzen.
    Projekteigentschaften und dann auf Einstellungen ;)

    Das ist leider nicht das was ich gebrauchen kann.

    Ich möchte sowohl Einstellungsprofile als auch FTP-Profile erstellen. Die Profile sind jeweils in einem Ordner zu finden. Der Ordner wird ausgelesen und zeigt jede .xml Datei in einer Combobox an. Diese XML Dateien möchte ich auslesen und meine Felder danach mit Werten aus dieser befüllen. Natürlich alles zur Laufzeit.
    My.Settings scheint nicht das Passende dafür zu sein.


    ryLIX schrieb:


    Ich weiß im Moment nicht wie du die Textdateien verarbeitest aber ich versuch dir mal nen Hinweis zu geben.

    Ich bekomme zu jedem Artikel Warengruppen in 3 Tiefen mitgeliefert. Also Statisch.

    VB.NET-Quellcode

    1. Computer --> Kabel --> USB Kabel


    Aber wenn ich später auf andere Datenbankquellen zurückgreife können diese Ebenen bis in eine Tiefe von 6 Ebenen dringen. Das müsste daher Rekursiv sein (glaube ich?).

    ryLIX schrieb:


    Also wenn du Warengruppe bekommst zu erst kontrollieren ob es schon einen Knoten auf dem Root(Level 0) gibt der diesen Namen trägt.
    Wenn ja das hinzufügen das Knoten überspringen und weiter machen. Für denn Fall das kein Knoten existiert einen hinzufügen mit der Bezeichnung der Warengruppe als Name.

    Dann kommt die Untergruppe. Nun musst du dir die Position der Warengruppe im TreeView holen (geht über den Namen soweit ich weiß) und dann in dieser Warengruppe kontrollieren ob es schon eine Untergruppe mit dem Namen gibt wenn nich einfügen sonst weiter ohne was zu tun.

    Und so musst du halt Stück für Stück alles ablaufen lassen.

    Genau das ist mein Problem.
    Ich finde keinen Quellcode in der Suche der ungefähr das macht, was ich möchte bzw. mich dahinführt. Leider tippe ich vollkommen im Dunklen. Ich habe es zwar hinbekomme auf 2 Ebenen was angezeigt zu bekommen. Das aber ist statisch, für meine Anwendung nicht brauchbar und totaler murks geworden.


    Oh man, nun hänge ich noch immer an der "ersten" Stelle fest mit der ich mich befasst habe. Die TreeViews scheinen ja wirklich nicht das einfachste zu sein. O.o

    Danke für deine Bemühungen und Hilfen.
    TreeViews sind nicht einfach.
    Das hab ich auch gemerkt ^^
    Habe mein Programm mittlerweile nach Delphi portiert und wollte dort mit einem DBTreeView arbeiten.
    Hab eininge Stunden gebraucht bis ich raus hatte wie es geht ;)

    Ich schau mal ob ich dir mal schnell was basteln kann als praktisches Beispiel :)

    Hier was zu deinen UserSettings :)
    vb-fun.de/cgi-bin/loadframe.pl?ID=dotnet/tipps/tip0185.shtml

    Edit:
    Hihi.
    TreeView + CSV waren die Suchwörter die gebraucht hättest :)
    Hier der Quellcode um CSV Dateien in ein TreeView zu laden.

    VB.NET-Quellcode

    1. ' Load a TreeView control from a CSV file.
    2. Private Sub LoadTreeViewFromCsvFile(ByVal file_name As _
    3. String, ByVal trv As TreeView)
    4. ' Load the CSV file.
    5. Dim stream_reader As New StreamReader(file_name)
    6. Dim file_contents As String = stream_reader.ReadToEnd()
    7. stream_reader.Close()
    8. ' Break the file into lines.
    9. Const charCR As Char = CChar(vbCr)
    10. Const charTab As Char = CChar(vbTab)
    11. Dim lines() As String = file_contents.Split(charCR)
    12. ' Process the lines.
    13. trv.Nodes.Clear()
    14. Dim new_fields() As String
    15. For i As Integer = 0 To lines.GetUpperBound(0)
    16. ' Make sure the line isn't blank.
    17. If lines(i).TrimStart.Length > 0 Then
    18. ' Break the line into fields.
    19. new_fields = lines(i).Trim.Split(","c)
    20. ' Make the entry.
    21. MakeTreeViewPath(trv.Nodes, new_fields, 0)
    22. End If
    23. Next i
    24. End Sub
    25. Subroutine MakeTreeViewPath searches a particular level in the TreeView control to see if a node at that level has the needed text for this part of a path. If it finds such a node, MakeTreeViewPath recursively calls itself to find the next field for the path within that TreeView node's children.
    26. If it doesn't find a child with the needed text, subroutine MakeTreeViewPath makes a new child.
    27. ' Make a TreeView node using this CSV path.
    28. Private Sub MakeTreeViewPath(ByVal parent_nodes As _
    29. TreeNodeCollection, ByVal fields() As String, ByVal _
    30. field_num As Integer)
    31. ' Do nothing if we've used all of the fields.
    32. If field_num > fields.GetUpperBound(0) Then Exit Sub
    33. ' Search the parent_nodes for a child with this
    34. ' field as its name.
    35. Dim found_field As Boolean
    36. For Each child_node As TreeNode In parent_nodes
    37. If child_node.Text = fields(field_num) Then
    38. ' We found this field. Follow it.
    39. MakeTreeViewPath(child_node.Nodes, fields, _
    40. field_num + 1)
    41. found_field = True
    42. End If
    43. Next child_node
    44. ' See if we found the field.
    45. If Not found_field Then
    46. ' We didn't find the field. Make it here.
    47. Dim new_node As TreeNode = _
    48. parent_nodes.Add(fields(field_num))
    49. new_node.EnsureVisible()
    50. ' Make the rest of the path.
    51. MakeTreeViewPath(new_node.Nodes, fields, field_num _
    52. + 1)
    53. End If
    54. End Sub