Laden...

For Schleife (Array) Zeigt alles 4-fach an

Erstellt von xKushGene vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.972 Views
X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren
For Schleife (Array) Zeigt alles 4-fach an

Guten Abend,

Ich habe Daten aus einer XML Datei gelesen und in ein Array gepackt.
Die XML sah wie folgt aus:

<texture>
    <name>Block 1</name>
    <description>Das ist Block 1</description>
</texture>
<texture>
    <name>Block 2</name>
    <description>Das ist Block 2</description>
</texture>

Im Array sieht das nun wie folgt aus:

Array[0] = Block 1 (Name)
Array[1] = Das ist Block 1 (Description)
Array[2] = Block 2 (Name)
Array[3] = Das ist Block 2 (Description)

Nun habe ich ein Panel erstellt was nur Name und Description anzeigen soll.
Allerdings macht er kein Panel mit:
Name: Block 1
Description: Das ist Block 1.

Sondern er macht
Name. Block 1
Description: Block 1

  1. Panel
    Name : Das ist Block 1
    Description: Das ist Block 1

usw.....

Irgendwas muss in meiner For-Schleife falsch sein, und ich weiß nicht wie ich das richtig machen soll.


TexturesOut hXML = new TexturesOut();
            string[] myarr = hXML.test().ToArray();
            int laenge = hXML.test().Length;

            for(int i = 0; i < laenge; i++)
            {
                Panel pan = new Panel();
                pan.Name = "paneltest" + i;
                pan.Size = new Size(239, 73);
                this.Controls.Add(pan);
                for(int j = 0; j < 2; j++)
                {
                    Label LblName = new Label();
                    LblName.Name = "lblname" + j;
                    LblName.Text = myarr[i];
                    LblName.AutoSize = true;
                    LblName.Location = new Point(73, 3);
                    LblName.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                    LblName.Size = new System.Drawing.Size(39, 13);
                    this.Controls.Add(LblName);
                    pan.Controls.Add(LblName);

                    Label Description = new Label();
                    Description.Name = "lbldesc" + j;
                    Description.Text = myarr[i];
                    Description.Location = new Point(73, 21);
                    Description.AutoSize = true;
                    this.Controls.Add(Description);
                    pan.Controls.Add(Description);
                }
                flowLayoutPanel1.Controls.Add(pan);

So war jetzt meine idee dahinter. Allerdings funktioniert das nicht, ich weiß auch wieso, aber ich weiß nicht, wie ich das Problem lösen kann.
Hoffentlich kann mir hier jemand helfen.

4.939 Beiträge seit 2008
vor 7 Jahren

LblName.Text = myarr[i];
// ...
Description.Text = myarr[i];

Fällt dir was auf?

Und wie in deinem anderem Thema XML Array als Rückgabewert und 3 Schichten Frage von MrSparkle schon angesprochen solltest du eine Datenklasse anlegen, z.B.


class Texture
{
  public string Name { get; set; }
  public string Description {  get; set; }
}

Und dann davon eine Liste (oder Array) anlegen:


List<Texture> textures;

Dann kommst du auch nicht mit den Indizes beim Zugriff darauf durcheinander.

PS: Die erste Zeile bei


this.Controls.Add(LblName);
pan.Controls.Add(LblName);

ist überflüssig, da ein Control nur zu einem Container hinzugefügt werden kann (immer genau einen Parent hat), d.h. die 2. Zeile überschreibt wieder die Auswirkung der 1. Zeile.

X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren

Das Ding ist, dass ich, wenn ich die Liste ausgeben muss sie auch mit einer for-schleife ausgeben muss.

Das heißt, dass das Problem dann doch immer noch da ist.

Edit:

Und wie in deinem anderem Thema
>
von MrSparkle schon angesprochen solltest du eine Datenklasse anlegen, z.B.

  
class Texture  
{  
  public string Name { get; set; }  
  public string Description {  get; set; }  
}  
  

Verstehe ich nicht so ganz.

Ich habe da eine Liste angelegt:


public string[] ReadTextureFromXml()
        {
            XDocument textures = XDocument.Load(@"C:\Users\Kevin\Documents\Visual Studio 2015\Projects\Minecraft Customizer\Minecraft Customizer\textures\textures.xml");

            List<string> textureList = new List<string>();

            foreach (var texture in textures.Descendants("texture"))
            {
                textureList.Add(texture.Element("name").Value);
                textureList.Add(texture.Element("description").Value);
            }
            string[] array = textureList.ToArray();
            return array;

Sie dann als ein Array übergeben.

5.658 Beiträge seit 2006
vor 7 Jahren

Verstehe ich nicht so ganz.

Genau da liegt das Problem. Deswegen wurde dir ja auch schon mehrmals der Tip gegeben, dich erstmal mit den Grundlagen zu beschäftigen. Wenn man nicht weiß, wie man mit Listen oder Klassen umgeht, und sich auch noch nicht mit Objektorientierter Programmierung beschäftigt hat, dann hat es auch keinen Zweck, eine Anwendung nach dem Drei-Schichten-Modell zu erstellen.

Daher nochmal der Hinweis auf [FAQ] Wie finde ich den Einstieg in C#? und das OpenBook vom Rheinwerk-Verlag: 🛈

Weeks of programming can save you hours of planning

X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren

Das lese ich ja. Ich bin jetzt bei Methoden und Parametern und so n kram. Das mit den Listen kam noch gar nicht.

F
10.010 Beiträge seit 2004
vor 7 Jahren

Das kommt davon wenn man nie gelernt hat wie man Grundlagen erlernt.

Hör erst mal auf mit dem gefrickel und lies das Buch bis zum Schluss einmal durch.
Du musst dabei bei weitem nicht alles verstehen, aber wenn du dann beim zweiten Durchlauf
anfängst die Sachen auszuprobieren, hast du die anderen Grundlagen ( wie eben klassen und co ) schon erlesen.

Glaube uns endlich das erst Grundlagen erlesen deutlich weniger Frust bedeutet und dann auch deutlich schneller geht.

S
23 Beiträge seit 2016
vor 7 Jahren

Also ich finde schon das es sinn macht das angelesene in kleineren Programmen zu testen, denn sonst wird man sehr sehr schnell die Lust verlieren.

In der Schule hast du ja auch nicht das Alphabet von A - Z gelesen und erst dann angefangen deine ersten Wörter zu schreiben. Das ist ein fließender Prozess, wie das Programmieren auch. Erst wenn man Fehler macht lernt man wirklich dazu.

Wenn du der Typ dafür bist empfehle ich dir von Rheinwerk das Videotraining zu verwenden kostet zwar knapp 40 Euro aber so hast du einen guten und Praxisorientierten Einstieg.

Oder was auch etwas spezieller aber sehr gut ist sind die Bücher Schrödinger Programmiert.

F
10.010 Beiträge seit 2004
vor 7 Jahren

In der Schule hast du ja auch nicht das Alphabet von A - Z gelesen und erst dann angefangen deine ersten Wörter zu schreiben. Das ist ein fließender Prozess, wie das Programmieren auch. Erst wenn man Fehler macht lernt man wirklich dazu.

Du hast also mit Grammatik angefangen bevor du schreiben konntest?

99% des Frusts entsteht dadurch das man zu viele Fehler macht und dadurch überhaupt nichts versteht.

Nach über 30 Jahren in dem Job und wirklich hunderten von einsteigenden Kollegen kann ich dir sagen das deine Herangehensweise die langsamere und frustrierendere ist.

Aber es ist eure Zeit und eure Lust.

S
23 Beiträge seit 2016
vor 7 Jahren

In der Schule hast du ja auch nicht das Alphabet von A - Z gelesen und erst dann angefangen deine ersten Wörter zu schreiben. Das ist ein fließender Prozess, wie das Programmieren auch. Erst wenn man Fehler macht lernt man wirklich dazu.
Du hast also mit Grammatik angefangen bevor du schreiben konntest?){gray}

Du lernst die Grammatik wie die Syntax einer Sprache durch das praktische Anwenden und nicht nur durch das theoretische lernen.
Wäre es so einfach, müsste man ja im Grunde nur ein Fachbuch lesen und schon hat man alles intus was man benötigt.

Anschauen, nachmachen und verstehen. Und ja Fehler machen gehört dazu.
Stichwort Didaktische Prinzipien durch Anwenden des gelernten, verstehen und festigen.