Autor Beitrag
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: Mo 22.03.10 12:46 
Zunächst wäre es hilfreich zu wissen, an welcher Stelle genau der Fehler auftritt. Auch weiß ich nach wie vor nichts zu deinem Vorgehen (das ist meine Schuld, nicht deine); aber mir fallen diese Punkte auf:

1. Die int-Variable id wird am Anfang des Blocks deklariert und bekommt eine Zuweisung durch das Attribut; und dann wird dieser Wert zur Abfrage des Value benutzt. Ist das so gewünscht?

2. Danach wird der Wert um 1 erhöht, und dann ist der Block zu Ende. Im nächsten Schleifendurchgang wird id wieder neu deklariert, wozu also id++?

3. Entweder id wird als zusätzliche Schleifenvariable benutzt; dann muss sie vor der Schleife deklariert werden und darf innerhalb der Schleife nur durch id++ geändert werden, aber sonst keinen neuen Wert zugewiesen bekommen. Oder du benutzt nur den Attribut-Wert. Oder du benutzt zwei verschiedene Variable.

Gruß 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: Mo 22.03.10 13:23 
Danke, ich habs raus.

Ich hab mit "1" bei ID zum zaehlen angefangen und nicht bei "0".
Ich wusste zwar, das man immer bei 0 anfaengt aber nicht, das
das auch bei ID festgelegt sein muss.
Allerdings werden mir nur 2 Questen per messagebox ausgegeben.

Zu 1)
Ja das ist so gewuenscht, da ich alle daten auf einmal haben moechte.
Allerdings aendert sich das noch, da es laut Danielf weniger elegant ist.

Mein Vorgehen habe ich doch erklaert oder?(Noch genauer kann ich es eigentlich
nicht beschreiben:)...bzw wuesste ich nicht, wie^^)
Ich hab auch vorher extra Bilder gemacht, damit es visuell verstandlich ist.

Zu 2)
Stimmt, aber ich bin kein schleifen profi:D...mir fehlt da noch etwas die Routine.

zu 3)
Ich wollte eigentlich nur ID hochzaehlen..<Quest ID="0">...
Und Danielf schrieb, ich soll sowas wie:
ausblenden C#-Quelltext
1:
 int id = (int)quest.Attribute("ID");					

nehmen..

Und das innerhalb der foreach schreiben.

Und was 1) angeht, nochmal ne kurzerklaerung.Denn ich brauch ja die Hilfe, nicht du;)

Den Inhalt von -> <Quest ID= "0"></Quest>, <Quest ID="1"></Quest>
will ich auslesen, und zwar nach dem Attribute ID am besten(reihenfolge egal).
Indem ich dann abfrage, welche ID(welcher node) selektiert wurde, kommt der jeweilige
Inhalt in die Textbox.

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:
<Chinaquesten>
  <Janganquestliste>
    <Quests>
      <Quest ID="0">
        <name>Weapon Dealer's Letter </name>
        <mission>Deliver weapons list </mission>
        <Reward>Exp 255, Gold 205 </Reward>
        <form>1 </form>
        <npc>Chulsan(Jangan blacksmith) / Jingyo </npc>
        <Monster>None</Monster>
      </Quest>
    </Quests>
    <Quests>
      <Quest ID="1">
        <name>Lost Child </name>
        <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>
      </Quest>
    </Quests>
   <Janganquestliste>
<Chinaquesten>



Und schon hab ich mein Fehler gefunden-.-

Ich hab ein Tag vergessen....
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        private void button1_Click(object sender, EventArgs e)
        {
            XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml");
            var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");

            int a = 0;
            foreach (var quest in quests)
            {              
                MessageBox.Show(quests.ElementAt<XElement>(a).Value);
                a++;
            }
        }
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: Mo 22.03.10 14:20 
user profile iconChiyoko hat folgendes geschrieben Zum zitierten Posting springen:
Danke, ich habs raus.

Prima, ich gratuliere! - Zum fehlenden Verständnis meinerseits:
user profile iconChiyoko hat folgendes geschrieben Zum zitierten Posting springen:
Mein Vorgehen habe ich doch erklaert oder?(Noch genauer kann ich es eigentlich nicht beschreiben:)...bzw wuesste ich nicht, wie^^)

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
...das ist meine Schuld, nicht deine
:mrgreen:

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: Mo 22.03.10 16:15 
aw^^

Aber ich hab noch eine Frage:

Wie kann ich nun mit vorhandenen Code auf den jeweiligen Value wert zugreifen?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml");
            var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");

            int a = 0;
            foreach (var quest in quests)
            {
                string questen = quest.Value;
                // hier greif ich per (a) auf index zu, ..wie mach ich das, wenn ich
das einzeln haben moechte?(siehe unten->Questzuweisung)
                //MessageBox.Show(quests.ElementAt<XElement>(a).Value);
                a++;
                switch (e.Node.SelectedImageIndex)
                {
                    //index 0- weise Quest 1 zu---->funktioniert
                    case 20: RTBclear(); if (a == 0){ richTextBox1.Text = questen; }break;              
                    //index 1- weise Quest 2 zu--_->funktioniert nicht
                    case 21: RTBclear(); if (a == 1) { richTextBox1.Text = questen; } break;
                }
            }
        }



EDIT:

Komisch....ueber switch/case kann ich den Index nicht durchschalten??!!...
Auskommentierte Zeilen gehen nicht, aber die if/else iretation funktioniert...


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:
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml");
            var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");

            for (int i = 0; i < quests.Count<XElement>(); i++)
            {
                string questen = quests.ElementAt<XElement>(i).Value;
                //switch (e.Node.SelectedImageIndex)
                //{
                //    case 20: 
                //        RTBclear(); 
                //        if (i == 0) 
                //        { 
                //            richTextBox1.Text = quests.
                //            break;
                //        } 
                //        break;
                //    case 21: 
                //        RTBclear(); 
                //        if (i == 1) 
                //        { 
                //            richTextBox1.Text = quests.ElementAt<XElement>(i).Value;
                //            break;
                //        } 
                //        break;
                //}
                if (e.Node.SelectedImageIndex == 20) {
                    if (i == 1) { richTextBox1.Text = questen; }
                }
                else if (e.Node.SelectedImageIndex == 21) {
                    if (i == 2) { richTextBox1.Text = questen; }
                }
            }
        }
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 24.03.10 00:19 
So genug gestresst:D...ich hab es auch so hinbekommen, wie Danielf das erklaert hatte.
Nur die formatierung fehlt noch aber die sollte np sein.

Danke fuer die ganze Hilfe.

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:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
        /// <summary>
        ///     Schalte Questen aus Xml durch
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            
            XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml");
            var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");

            // um an einzelne Elemente zu kommen
            foreach (var quest in quests)
            {
                // alle Elemente 
                for (int i = 0; i < quests.Count<XElement>(); i++)
                {
                    // Einzelzuweisung
                    string name = quest.Element("name").Value;
                    string mission = quest.Element("mission").Value;
                    string reward = quest.Element("Reward").Value;
                    string form = quest.Element("form").Value;
                    string npc = quest.Element("npc").Value;
                    string monster = quest.Element("Monster").Value;
                    string scenDE = quest.Element("ScenarioDeutsch").Value;
                    string scenENG = quest.Element("ScenarioEnglisch").Value;    

                    if (e.Node.SelectedImageIndex == 20)
                    {
                        if (i == 0)
                        {
                            RTBclear(); // Textbox text loeschen
                            richTextBox1.Text = questen;

                            // kann den Pfad leider nicht extra auslagern, viell. nehm ich spaeter eine String Klasse
                            // und lese die Strings per get und dem Index aus
                            pictureBox1.ImageLocation = Path.Combine(Application.StartupPath, @"Bilder\bigeyedghost.jpg");
                            // Hier reicht auch eine Variable...das ist nur ein Test
                            if (DE == true && ENG == false) { richTextBox2.Clear(); richTextBox2.Text = "!!!!!"; }
                            if (ENG == true && DE == false) { richTextBox2.Clear(); richTextBox2.Text = "???"; }
                        }
                    }
                    if (e.Node.SelectedImageIndex == 21)
                    {
                       //etc....
                    }
                }
            }
        }
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 24.03.10 00:36 
Hmm... so hab ich das nicht gesagt (wehr) ;)

Die zweite (// alle Elemente) Schleife ist total unnütz, bzw. doppelte gemoppelt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach (var quest in quets)
{
    // Einzelzuweisung
    string name = quest.Element("name").Value;
    string mission = quest.Element("mission").Value;
    string reward = quest.Element("Reward").Value;
    ...
}

reicht völlig aus. Ich würde dir auch einen QuestWrapper vorschlagen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public class QuestWrapper
{
    public XElement Quest { get; set; }

    public string Name { get { return Quest.Element("name").Value; } }

    public string Mission { get { return Quest.Element("mission").Value; } }

    ....

    public QuestWrapper()
    {

    }

    public QuesetWrapper(XElement quest)
    {
        Quest = quest;
    }
}


Dann wäre dein Code nicht nur wiederverwendbar sondern auch "eleganter".

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
QuestWrapper questObj = new QuestWrapper();
foreach (var quest in quests)
{
   questObj.Quest = quest;

   // Zugriff
   lQuestName.Text = questObj.Name;
   lQuestMission.Text = questObj.Mission;
   ....
}


Dann könntest du auch bequem dein Sprach-Handling damit abhacken:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class QuestWrapper
{
    public XElement Quest { get; set; }

    public string Language { get; set; }

    public string Name { 
       get { return Quest.XPathSelectElement(string.Format(
                 "name[@language={0}]", Language)); }
    }
}


Aber das nur als Ausblick ;)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 24.03.10 01:02 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde dir auch einen QuestWrapper vorschlagen:
...und spätestens dann würde ich ausprobieren, ob man über XML-Serialisierung nicht schneller ans Ziel kommt ;) .

_________________
>λ=
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 24.03.10 03:05 
Ihr seid mir 2...:D:..
Herzlichen Dank, (das ich da auch nich selber drauf gekommen bin-.-)

Hatte das schon mit einer String klasse gemacht

ausblenden 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:
    public class getStrings
    {
        /// <summary>
        ///  instanziere Array
        /// </summary>
        string[] getstrings = 
        { 
            "Bilder\bigeyedghost.jpg"
            
        };

        /// <summary>
        ///  get array
        /// </summary>
        public string[] Elements
        {
            get { return getstrings; }
        }

        /// <summary>
        ///  indexer
        /// </summary>
        public string this[int index]
        {
            get { return getstrings[index]; }
        }
    }


aber die mochte mich nicht so ganz:D...am ende lag der Fehler ganz woanders.
Naja ich schau morgen nochmal drueber, gute nacht:)
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 24.03.10 12:48 
Die 2te Schleife mag unnutz sein, aber ich komm damit wenigstens einfach an
den index.Mit deinen Methoden klappte das nie wirklich...(dank meines unwissens;))
Darum hab ich jetzt einfach noch <id>x</id> hinzugefuegt
und greife dann ueber den namen anstatt ueber die ID darauf zu.

Nun, ich hab das jetzt mit der Klasse getestet-...und bekomm einen Error.

ausblenden C#-Quelltext
1:
2:
3:
4:
 public QuesetWrapper(XElement quest)
 {
     Quest = quest;
 }

Nicht alle codePfade geben einen Wert zurueck(?)
using direktive sind alle definiert, ansonsten wuesste ich jetzt nicht,
was da noch fehlen koennte oO...
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 24.03.10 13:25 
Ist es korrekt geschrieben? Das sollte ein überladener Konstruktor sein...
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 24.03.10 15:15 
[url=imgbox.de/?img=i51731v218.jpg]user defined image[/url]

Eigentlich ja...
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 24.03.10 15:24 
:((

Der Screenshot und den Code den du geposted hast unterscheiden sich.

1) FALSCH geschrieben !
2) Kein Konstruktor, sondern du hast eine Methode drauß gemacht!

Reg mich grad echt auf, weil diese Fehler kannst du verhindern :((

und bitte schau dir die Grundlagen von OOP an (C# Kapitel 2).
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 24.03.10 15:48 
Sorry aber ohne den zusatz von string bekam ich auch ein Fehler.
ist ja nicht so, das ich mir nicht anschau, was ich da mache.

Was die Grundlagen angeht, schau ich zwar oft drueber aber man merkt sich ja nicht
alles gleich.

Und jetzt weis ich wenigstens, wieso der Fehler auftrat^^Ich hab deinen
Schreibfehler uebersehen, bzw gedacht...es ist beabsichtigt.
(Beim 2ten Konstruktor)

EDIT: Mit Klassen hat ich noch nicht viel zu tun.
ich lese mir mal das Galileo Kapitel durch.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    public class QuestWrapper
    {
        public XElement Quest { get; set; }

        public string Name { get { return Quest.Element("name").Value; } }

        public QuestWrapper()
        {

        }

        public QuestWrapper(XElement quest)
        {
            Quest = quest;
        }
    }
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 25.03.10 13:22 
Naechstes Problem:

Auf einmal heisst es, ich haette keine Instanz festgelegt(?).

Kann nicht sein, weil ich an der Klasse nichts mehr geaendert hatte.

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

Ich habe mehrfach die Xml datei geprueft, stimmt alles.
Ueber die Instanzierung und eine Messagebox dann versucht, auf die Daten
zuzugreifen.(Was vorher ja auch noch funktionierte)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 private void button1_Click(object sender, EventArgs e)
        {
            XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml");
            var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");

            QuestWrapper tester = new QuestWrapper();
            
            foreach (var quest in quests)
            {
                string test = tester.REWARD;
                MessageBox.Show(test);
            }
        }
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 25.03.10 14:41 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
QuestWrapper tester = new QuestWrapper();
            
   foreach (var quest in quests)
   {
      tester.Quest = quest;
      string test = tester.REWARD;
      MessageBox.Show(test);
   }
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 25.03.10 15:54 
Danke abermals, ..aber wieso muss man das nochmal deklaieren, wenn
man das schon im konstruktor hat?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 25.03.10 15:58 
Weil der Konstruktor nur eine Hülle (Wrapper) um das XElement ist. Mit dem Konstruktor erstellst du eben nur die besagte Hülle ohne Inhalt. Den Weißt du nun in der For-Schleife zu und kannst mit den Wrapper-Methoden "bequem" auf den Inhalt zugreifen.
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 25.03.10 16:15 
Merk ich mir.Herzlichen dank.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 25.03.10 17:09 
user profile iconChiyoko hat folgendes geschrieben Zum zitierten Posting springen:
Danke abermals, ..aber wieso muss man das nochmal deklaieren, wenn
man das schon im konstruktor hat?
Wenn du einen Konstruktor hast, dann nutz ihn doch auch ;) ?
ausblenden C#-Quelltext
1:
MessageBox.Show(new QuestWrapper(quest).REWARD);					

Die paar zusätzlichen Instanzen dürften sich im Vergleich zu I/O nicht bemerkbar machen.

PS: WARUM SCHREIEN DEINE PROPERTY-NAMEN SO :D ?

_________________
>λ=
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 25.03.10 17:38 
Viele Wege fuehren nach Rom:D
Danke^^

Ich habe diese Namen gros geschrieben, weil ich alle Fehler ausschliessen wollte.
Und da ich genau weis, das ich Namen normalerweise nie auf die Art deklariere,
waere das so ein moeglicher Fehler weniger:p


Und hier mal eine geupdatete Version:
(Es wird sich nicht mehr allzuviel aendern.)
[url=imgbox.de/?img=m37738l214.jpg]user defined image[/url]

Fehlt noch die Formatierung des Textes, aber sonst funktioniert es einwandfrei:)