Autor Beitrag
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 00:51 
huhu und sorry fuer den verwirrenden Titel.

Mein Problem ist folgendes:

Ich moechte ein neues projekt starten, in dem ich sehr viel Text verarbeiten
werde.
Es handelt sich um einen Guide...

Formaufbau:
- links treeview, rechts ein gleich aussehendes Layout, was sich theoretisch nicht
aendert.(Nur der text, dieser Steuerelemente)

- das wiederum verleitet mich, textdateien zum auslesen zu verwenden
oder waere es sinnvoller, alles als code zu schreiben?
Denn wenn der spaetere Benutzer doch mal was am text aendert, ist man angearscht.

Wenn mich nicht alles taeuscht, sind das weit ueber 10 MB an textdaten.
Ich frage mich das auch, wegen der Uebersichtlichkeit.

Eine Update funktion waere auch gut, aber das ist nebensaechlich.

Ok, hab mich fuer textdateien entschieden, frage mich aber gerade...
wie am besten auslesen, wenn man die Zeilenummern nicht kennt?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 16.03.10 09:28 
Hallo,

ich vermute der Treeview soll zur Navigation dienen und rechts das "gleich aussehendes Layout" als Platzhalter für die Darstellung (soweit mein Résumé).

Eine Datei kannst du mit File.ReadAllLines("filename") zeilenweise als Array einlesen. Auf die jeweilige Zeile kannst du dann mit dem Array Index zugreifen.

Stehen die Informationen den schon? Was meinst du mit Textdatei? Ich denke Xml wäre als Textdatei mit Xml-Format geeigneter, weil du dann zum Beispiel auch Einträge suchen kannst etc.

Gruß Daniel
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 10:02 
Hier mal ein Bsp zur besseren Vorstellbarkeit.

[url=imgbox.de/?img=v37112b134.jpg]user defined image[/url]

linke Seite des Buches:
- 5 label, 1 textbox
rechte Seite des Buches:
- 1 Textbox , 1 label

aber ist es sinnvoll, ueber 200 mal Texte all diesen Steuerelementen zuzuweisen?
Da hab ich ja sonst uebel viel code...


www.tsql.de/csharp/csharp_textdatei
->Hiermit lese ich *.txt daten ein, allerdings fehlen mir die Nummmern.

Das mit dem Array waere eine Idee, und/oder ein Strukturierter Aufbau
der textdatei.<Mhm...

Aufbau bisher als bsp. :

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

Questname: Weapon Dealer's Letter
Mission : Deliver weapons list
Reward : Exp 255 / GOLD 205
Form : Available once
NPC : Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan
Monster : None

Scenario : Please get the list of weapons that the soldiers need from Jingyo, He is guarding the south gate of Jangan.
Perhaps you don't know where that gate is? Click on the globe icon to open a local map of Jangan and find it.
Hurry.
-------------------------------

Und davon mehrere 100^^...darum auch die Frage der Strukturierung.


EDIT: Xml, d.h. online steht erstmal nicht zur debatte.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 16.03.10 10:31 
Aufbau bisher? Heißt das nun die Textdateien (die 10Mb) sind so aufgebaut und werden so weiter aufgebaut? Oder heißt das, das ist eine Idee und die Struktur steht noch zur Frage?

Mit XML könntest du halt sowas tun:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<quests>
   <quest name="Weapon Dealer's Letter>
      <mission>Deliver wapons list</mission>
      <rewards>
        <reward type="
Expt" Value="255"/>
        <reward type="
Gold" Value="205"/>
      </rewards>
     ....
</quests>


Die Zuordnung machst du natürlich dynamisch und nicht über den Code.

Du würdest hingehen und sagen
1) ließ Xml ein
2) zeige Quests an
3) bei klick auf ein Quest, lade Quest in "Buch anzeige"

Das müsstest du dann einmal implementieren...

Aber vlt. hab ich dein Problem ja noch nicht genau verstanden :(/

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 10:51 
Erstmal danke fuer die Antworten von dir^^

Die Textdaten werden alle so aufgebaut sein, ich kann sie aber beliebig anpassen.
Zumal es noch deutsch / englisch geben wird(also 2 Text daten, die ich dementsprechnend einem Index zuweise...als bsp)

Naja, ich wollte das schon spaeter als exe und online eingebunden haben, drum
wuerde sich erstmal auslesen von *.txt daten besser eignen.

z.b mit string.compare....ich weis nur nicht, welche Methode der streamreader/writer klassen die am besten geeignete waere.

In stichpunkten mal mein visueller Ablauf:

- Textdatei oeffnen
- Text einlesen
- Text vergleichen?
- wenn node angeklickt, setze auf label 1 ->string 1, label 2 ->string 2(oder eben eine array adresse

...so meinte ich das^^
Es ist auch nicht so einfach zu erklaeren, sorry...
Was XML angeht, wuerde ich gern erstmal drauf verzichten...das hatte ich nur 2 Monate und wurde mich lieber 100% auf C# konzentrieren, das Ganze offline:)


EDIT: ja, die Textdaten werden weiter aufgebaut, sind allerdings nach Level, Region oder sonstwas geordnet.(Also spaeter soll noch mehr hinzugefuegt werden)

EDIT 2: Hier mal eine Online version, was ich sozusagen uebernehme..

[url=imgbox.de/?img=k13202b134.jpg]user defined image[/url]
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 16.03.10 11:11 
Hallo,

ich habe mit Xml auch noch nicht soviel gemacht (mehr mit richtigen Datenbanken). Aber nach deiner ganzen Beschreibung empfehle ich dringend: Mach es mit Xml und nicht mit einfachen Textdateien! Dir geht es um inhaltlich strukturierte Daten, und dafür ist Xml richtig vorbereitet. Bei Txt musst du alles Drumherum, jeden Zeilenaufbau, jedes Element, jeden Datentyp selbst analysieren und konvertieren. Bei Xml wird dir (fast) alles abgenommen, und du kannst dich auf die Verarbeitung der Inhalte konzentrieren.
Zitat:
wurde mich lieber 100% auf C# konzentrieren, das Ganze offline

Xml ist nur ein bestimmtes Datenformat und hat nichts (überhaupt nichts!) mit der Frage online/offline zu tun. (Das verwechselst du mit Html, aber auch das kann offline benutzt werden.) Xml kann mit 100% C# arbeiten, beginnend bei der XmlDocument-Klasse. Daniel hat sicher noch bessere (aktuellere) Empfehlungen.

Jürgen
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 11:16 
Oh ok, danke schoen...wieder was gelernt^^
Ja wie gesagt, hatte mich nicht lange damit beschaeftigt aber das hol ich
nach und versuch mich mit XML.

Denn Rest moechte ich mal alleine versuchen.
Wenn es geklappt hat(oder auch nicht) schreib ich es:)
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 12:31 
So nun habe ich folgendes versucht:


ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<?xml version="1.0" encoding="utf-8" standalone ="yes" ?>

<TESTXML>
  <questen NAME ="TEST1" ID="1" />
  <questen NAME ="TEST2" ID="2" />
  <questen NAME ="TEST3" ID="3" />
</TESTXML>


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
using System;
using System.Collections.Generic;
using System.Xml;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Silkroad_quest_guide
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Xml_auslesen();
        }
        private void Xml_auslesen()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"c:\XMLFileVersuch1.xml");
            XmlElement root = doc.DocumentElement;
            foreach (XmlNode @questen in root.ChildNodes)
            {
                listBox1.Items.Add(@questen.Attributes["NAME"].InnerText);
                listBox1.Items.Add(@questen.Attributes["ID"].InnerText);
            }
        }

    }
}


[url=imgbox.de/?img=j22654w134.jpg]user defined image[/url]


Ist das so richtig?
Oder gibt es noch was zu beachten?


EDIT: Ansonsten vielen Dank euch beiden, es ist gewoehnungsbeduerftig aber
vereinfacht mein Unterfangen doch sehr:)

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 16.03.10 14:40 
Funktional kannst es dir ja selber beantworten ;)

Hinzufügen könntest du eine Validierung mittels Xml Schema. Aber das ist Erstmal nicht so wichtig.

Die Verwendung von XElement laut Kha schon, weil es schneller ist. Ebenso würde ich die Struktur anpassen (siehe vorherigen post von mir). Um dann so etwas zu machen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            System.Xml.Linq.XDocument doc = XDocument.Load("blub.xml");
            var quests = doc.XPathSelectElements("quests/quest");

            foreach (var quest in quests)
            {
                string questName = quest.Attribute("name").Value;
                string mission = quest.Element("mission").Value;

                var rewards = quest.Element("rewards").Elements();
            }


bzw.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
            System.Windows.Forms.ListView lv = new System.Windows.Forms.ListView();

            System.Xml.Linq.XDocument doc = XDocument.Load("blub.xml");
            var quests = doc.XPathSelectElements("quests/quest");

            foreach (var quest in quests)
            {
                System.Windows.Forms.ListViewItem lvi = new System.Windows.Forms.ListViewItem();

                lvi.Tag = quest;
                lvi.Text = quest.Attribute("name").Value;
                lv.Items.Add(lvi);
            }


Bei Click auf das ListView kannst du dann über das TAG-Property auf das entsprechende Xml-Tag zugreifen und es so dem "Buch bzw. der rechten Seite" übergeben wo dann die "Details" angezeigt werden.
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 16.03.10 15:44 
Mhm interessant, danke:D

Das listview element war nurn bsp, ich verwende eine richtextbox
wo ich alles in einem habe.

Sozusagen 2 richtextboxen(rechts und links).

Ich werd zwar ne Weile brauchen aber nach einigen tests habs ich es bestimmt raus:)


EDIT: Eine allgemeine Frage haett ich dennoch:

ausblenden XML-Daten
1:
<quest name="Weapon Dealer's Letter"></quest><mission>Deliver Weapons list</mission>					


Was ist der unterschied zwischen "name" und ohne name?


Nun noch ein Problem

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        private void Form1_Load(object sender, EventArgs e)
        {
            Xml_auslesen();
        }
        private void Xml_auslesen()
        {
            System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml");
            var quests = doc.XPathSelectElements("quest");

            foreach (var quest in quests)
            {
                string questName = quest.Attribute("name").Value;
                string mission = quest.Element("mission").Value;
                var rewards = quest.Element("rewards").Elements();

                richTextBox1.Clear();
                richTextBox1.Text = mission;
            }
        }

funktioniert nicht...keinerlei Fehlermeldungen.
Ich zieh mal ein tutorial zu Rate.
Denn i-wie versteh ich auch die Zeile "var quests = doc.XPathSelectElements("quest");" nicht ganz..

EDIT: habs raus^^

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mi 17.03.10 16:03 
Mhm, kann mir bitte noch jemand beantworten, wie ich auf die ID zugreife?

Bsp:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
<Janganquestliste>
  <Quests ID="1">
    <name>Weapon Dealer's Letter</name>
    <mission>Deliver weapons list</mission>
    <Reward>Exp 255, Gold 205</Reward>
    <form>1</form>
    <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan</npc>
    <Monster>None</Monster>
    <Scenario>
      <ScenarioDeutsch>
        Bitte besorge die Waffenliste, welche die Soldaten von Jingyo benoetigen.Er verteidigt das Suedtor von Jangan.
        Vielleicht weisst du nicht, wo das Tor ist?Klicke auf das Erd-icon um eine Karte von Jangan zu oeffnen und finde es.
        Schnell!
      </ScenarioDeutsch>
      <ScenarioEnglisch>
        Please get the list of weapons that the soldiers need from Jingyo,He is guarding the south gate of Jangan.
        Perhaps you don't know where that gate is? Click on the globe icon to open a local map of Jangan and find it.
        Hurry.
      </ScenarioEnglisch>
    </Scenario>
  </Quests>

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Janganquestliste">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Quests">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" />
              <xs:element name="mission" type="xs:string" />
              <xs:element minOccurs="0" name="reward" type="xs:string" />
              <xs:element minOccurs="0" name="Reward" type="xs:string" />
              <xs:element name="form" type="xs:string" />
              <xs:element name="npc" type="xs:string" />
              <xs:element name="Monster" type="xs:string" />
              <xs:element name="Scenario">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="ScenarioDeutsch" type="xs:string" />
                    <xs:element name="ScenarioEnglisch" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="ID" type="xs:unsignedByte" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Ich will erreichen, das "name","mission", "reward","form","npc","monster" in einer
Textbox (also in einem String) ausgegeben werden und
ich diese per ID zuweisen kann(treeview selected node etc).

attribute("ID").Value?
Die Logoik ist mir nicht ganz klar.

Des Weiteren noch ScenarioEnglisch/ScenarioDeutsch einzeln selektieren(befhel ist mir bekannt).

Es ginge mir nur um die ID zuweisung.
Sozusagen will ich ja nicht 200 foreach schleifen benutzen, sondern nur eine einzige,
die alles ausliest, was in "Janganquesten" enthalten ist, bis auf das Scenario.

(Per Xpath die Bereiche waehlen?)

Ein schema hab ich auch erstellt, und versuche da gerade durchzusteigen.
Wenn ich ein Xml format habe, wo ist dann Xsd gespeichert oO?

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 17.03.10 16:24 
Mir ist die Frage nicht ganz klar.

Attribute("ID").Value hast du ja schon gefunden.

Auch wenn ich mich wiederhole, aber du kannst auch gleich das ganze Node (Quests) ins Treeview als Tag Element packen. Dann brauchst du kein Suchen mehr und es geht dadurch natürlich viel schneller... der Speicherbedarf ist Minimal (nur die Referenz)... also nur Vorteile ;)

Wenn du da die ID hast kannst du mittels XPath dir das ID entsprechende Element aus deinem Xml holen.
ausblenden C#-Quelltext
1:
XElement quest = doc.Root.XPathSelectElement("Quests[@ID=1]");					

oder du nimmst Linq
ausblenden C#-Quelltext
1:
2:
3:
var quest = (from q in doc.Root.Descendants("Quests")
   where (int) q.Attribute("ID") == 1
   select q).FirstOrDefault<XElement>();
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 17.03.10 16:35 
Wäre cool, wenn du deine Beiträge gleich richtig machst und nicht fünf mal editierst ;) Sonst gibt das ganze ja keinen Sinn im Nachhinein.

Über alle Quests kannst du mit:
XPath:
ausblenden C#-Quelltext
1:
var quests = doc.Root.XPathSelectElements("Quests");					

XElement:
ausblenden C#-Quelltext
1:
var quests = doc.Root.DescendantNodes("Quests");					

Iteration:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
foreach(var quest in quests)
{
    int id = (int) quest.Attribute("ID");
    string name = quest.Element("name").Value;
    ...
}
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mi 17.03.10 18:56 
Danke euch beiden, das langt als Info:)

Ja, und sorry wegen der verworrenden Editierung, aber mir faellt im Nachhinein immer
noch was ein:D..ich denk dran.

EDIT: Ups, i-was stimmt wohl mit meinen Augen nicht.Du bist ja nur eine PErson;)
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mi 17.03.10 23:59 
1)
Sorry, wenn ich nochmal nerve aber ich versteh das
mit der Uebergabe vom Tag-prop nicht.Im Internet
exestiert nicht gerade viel Info-material dazu.

2)
Und mein Problem, alles aufzulisten, hab ich endlich geloest...hat etwas gedauert aber
wenigstens gehts:D

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void Xml_auslesen()
        {
            System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml");
            var quests = doc.Root.XPathSelectElements("Quests1");

            foreach (var quest in quests)
            {
                richTextBox1.Text = quest.Value;
            }
        }


Ausserdem muss ich die Untergruppe <Quests> Nummerieren, sonst erhalte ich immer den
letzten Node und das will ich ja nicht.

3)
Wie formatiert man Text innerhalb der Nodes?...Denn wenn ich das wie oben auflisten
moechte , hab ich natuerlich Text ohne Formatierung.

Ich versuch mich mal weiter, eine Loesung gibt es immer:D...



EDIT zu 3) &#xD;->erledigt^^
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 18.03.10 10:25 
Zitat:
ich versteh das mit der Uebergabe vom Tag-prop nicht

Mit Tag kann bei jedem Control ein Element von beliebigem Typ angehängt werden. Problem ist lediglich, dass Tag wegen der Beliebigkeit als object deklariert werden musste. Beim "Abfragen" dieses Wertes musst du deshalb prüfen, ob es sich wirklich um den gewünschten Typ handelt. Beispiel für TreeNode (ob ich jetzt das richtige Beispiel von Daniel für dich herausgeholt habe, weiß ich nicht, aber das Prinzip sollte klar werden):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
// als Tag für node registrieren
XElement quest = doc.Root.XPathSelectElement("Quests[@ID=1]");
node.Tag = quest;

// später den Tag abrufen und benutzen
XElement quest = node.Tag as XElement;
if (quest != null) ...


Zitat:
EDIT zu 3) &#xD;->erledigt^^

Als "Formatierung" meinst du nur Zeilenumbrüche? Dann benutze in WinForms (also innerhalb der RTF-Box) lieber Environment.NewLine. Die RTF-Box hat übrigens auch eine Methode AppendText; ich könnte mir vorstellen, dass du gerne damit arbeiten würdest.

Gruß Jürgen
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 18.03.10 10:35 
zu 1) welches Control hast du den nun? Ich meinte auf der linken Seite wo du die Element zur Auswahl anbietest in einem ListBox oder ListView. Die beiden Controls haben ein Tag Property (MSDN). Dem kannst du dann das Node zuweisen
ausblenden C#-Quelltext
1:
2:
3:
ListViewItem lvi = new ListViewItem(quest.Element("name").Value);
lvi.tag = quest;
listView1.Items.Add(lvi);

Beim klick Event dann:
ausblenden C#-Quelltext
1:
2:
3:
4:
XElement quest = (XElement) listView.SelectedItem.Tag;
string mission = quest.Element("mission").Value;
string reward  = quest.Element("reward").Value; 
...


zu 2) Nein du musst die Untergruppe nicht Nummerieren. Das wäre total.. autsch :) Per XPath kannst du auch auf das x-te Element zugreifen:
ausblenden C#-Quelltext
1:
quests.XPathSelectElement("quest[x]");					


Ich hoffe das hilft dir ein bisschen, den wirklich verstanden habe ich deine Probleme nicht :/
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Do 18.03.10 13:00 
Erstmal herzlichen dank:)

Nun, ...

Mein Vorhaben:

- ich habe links ein Treeview(keine Listvew und auch keine Listbox^^) und rechts eine richtextbox
- jeder Node auf der linken Seite represaentiert eine Quest
- beim Klick auf einen Node soll auf der rechten Seite in die richtextbox der Inhalt mit der jeweiligen Quest gefuellt werden.D.h.
ich moechte <Quests></Quests> ->nur "diesen" Inhalt haben, und das pro ID..

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
<Janganquestliste>
  <Quests NAME="Weapon Dealer's Letter" ID="1">
    <mission>Deliver weapons list </mission>
    <Reward>Exp 255, Gold 205 </Reward>
    <form>1 </form>
    <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan </npc>
    <Monster>None</Monster>
  </Quests>
  <Quests NAME="Lost Child" ID="2">
    <mission>Find one of the shoes of the child taken by one eyed monsters </mission>
    <Reward>Exp 375, Gold 475 </Reward>
    <form>1</form>
    <npc>Hwangno, village chief of Jangan</npc>
    <Monster>Small-eyed ghosts/big-eyed ghosts</Monster>
  </Quests>
  <Quests NAME="Weasel Battle" ID="3">
    <mission>Hunt 40 Weasels </mission>
    <Reward>Exp 1900, Gold 1000 </Reward>
    <form>1</form>
    <npc>Iyang,a guard at the east gate of Jangan</npc>
    <Monster>Old Weasel/ Weasel</Monster>
  </Quests>
</Janganquestliste>


[url=imgbox.de/?img=w8285e7.jpg]user defined image[/url]

Mein Problem war sozusagen, alle (im beispiel oben 3) Questen anzuwaehlen
ausblenden C#-Quelltext
1:
var quests = doc.Root.XPathSelectElements("Quests1/Quests2/Quests3");					

und sie dann zuzuweisen...:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            #region Janganquesten zuweisen
            System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml");
            var quests = doc.Root.XPathSelectElements("Quests1/Quests2/Quests3");

            foreach (var quest in quests)
            {
                switch (e.Node.SelectedImageIndex)
                {
                    case 0: richTextBox1.Text = quest.; break
                }
                richTextBox1.Text = quest.Value;
            }
            #endregion


Zitat:

Als "Formatierung" meinst du nur Zeilenumbrüche? Dann benutze in WinForms (also innerhalb der RTF-Box) lieber Environment.NewLine. Die RTF-Box hat übrigens auch eine Methode AppendText; ich könnte mir vorstellen, dass du gerne damit arbeiten würdest.


Danke, appendtext kenne ich schon...ich hatte vor diesem Projekt hier noch ein
groesseres, um so verschiedene Moeglichkeiten kennenzulernen.
Das Problem ist ehr, dass ich die Zeilenumbrueche direkt im XML brauche.
Sonst stell dir mal vor, wieviel Text das waere.

Grob gerechnet 6 Codezeilen, a 300 Questen...das ist zuviel^^


EDIT:

Ich bin jetzt soweit:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml");
            var quests = doc.Root.XPathSelectElements("Quests[@ID=1]/Quests[@ID=2]/Quests[@ID=3]");

            foreach (var quest in quests)
            {
                int id = (int)quest.Attribute("ID");

                string q1 = quest.Value;
                switch (e.Node.SelectedImageIndex)
                {
                    case 20:
                        richTextBox1.Clear();
                        if (id == 1) { richTextBox1.Text = q1;  }
                        break;
                }
            }
        }


keine Fehlermeldung, aber es wird auch keine Textbox gefuellt.
Wenn das ginge, waer mein Problem geloest.

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 18.03.10 13:34 
Ich verstehe nicht woran es happert :( Du hast doch alle Bauteile zusammen und im Code brauchst du nur einmal alles Definieren.
Zitat:
Grob gerechnet 6 Codezeilen, a 300 Questen...das ist zuviel^^
Verwirrt mich ... ???

Ob ListView, ListBox oder TreeView.. ist auch egal :(
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            XDocument doc = XDocument.Load("Janganquest.xml");

            treeView1.Nodes.Add("Quests");

            foreach (var quest in doc.Root.Descendants("Quests"))
            {
                TreeNode tr = new TreeNode(quest.Attribute("NAME").Value);
                tr.Tag = quest;
                treeView1.Nodes[0].Nodes.Add(tr);
            }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Tag != null)
            {
                XElement quest = (XElement)e.Node.Tag;

                ShowQuest(quest);
            }
        }

        private void ShowQuest(XElement quest)
        {
            richTextBox1.Text = string.Format("Mission: {1}{0}Reward:{2}",
                Environment.NewLine,
                quest.Element("mission").Value,
                quest.Element("Reward").Value);
            
        }


Die Zeilenumbrüche kannst du direkt ins Xml machen:
ausblenden XML-Daten
1:
2:
3:
    <Reward>
Exp 375
Gold 475</Reward>


Aber das würde ich dir nicht raten, weil es ja deine Datenquelle ist. Formatierung gehört da nicht hin!

Die machst du einmal in deiner ShowQuest Methode. Deshalb hatte ich dir auch geraten die Rewards zum Beispiel in Xml so darzustelen:
ausblenden XML-Daten
1:
<rewards><reward><name>Gold</name><value>475</value></reward></rewards>					


Dann kannst du im Code die Logik machen mit:
foreach (var reward in blah.XPathSelectElements("rewards/reward"))
{
whatever = reward.Element("name").Value + ": " + reward.Element("value").Value + Environment.NewLine ;
}

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 18.03.10 13:57 
Kurze Zwischenbemerkung: Es gibt im Forum XML-Tags, wäre schön wenn Ihr die benutzen würdet. Danke! :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".