Laden...

UI Elemente dynamisch aus Remote XML erzeugen

Erstellt von blizzard vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.724 Views
B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren
UI Elemente dynamisch aus Remote XML erzeugen

[Aktuelles Script]


<gameDatenbank>
  <Games>
    <spielName>Test1</spielName>
    <spielIcon>BILD</spielIcon>
    <spielBanner>BILD</spielBanner>
    <Dateigröße>20 GB</Dateigröße>
    <spielVersion>0.0.0.1</spielVersion>
    <spielPlattform
      name="Steam"      
      />
    <spielAddons
      Addon1 = ""
      Addon2 = ""
      Addon3 = ""/>
    <spielMods
      Mod1 =""
      Mod2 =""
      Mod3 =""/>
    <spielErweiterungen
      Erweiterung1=""
      Erweiterung2=""
      Erweiterung3=""
      />
  </Games>

   <Games>
    <spielName>Test2</spielName>
    <spielIcon>BILD</spielIcon>
    <spielBanner>BILD</spielBanner>
    <Dateigröße>20 GB</Dateigröße>
    <spielVersion>0.0.0.1</spielVersion>
    <spielPlattform
      name="Steam"      
      />
    <spielAddons
      Addon1 = ""
      Addon2 = ""
      Addon3 = ""/>
    <spielMods
      Mod1 =""
      Mod2 =""
      Mod3 =""/>
    <spielErweiterungen
      Erweiterung1=""
      Erweiterung2=""
      Erweiterung3=""
      />
  </Games>
</gameDatenbank>


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
using System.Net;

namespace WindowsFormsApp2
{
    public partial class newgame : UserControl
    {

        private static newgame _instance;

        public static newgame Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new newgame();
                return _instance;
            }
        }

        public string plattform = "Steam";

        public newgame()
        {
            InitializeComponent();
        }

        private void newgame_Load(object sender, EventArgs e)
        {
            // Kategorien Plattforms
            XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");

            var gameNameQuery = from game in gameDatenbank.Descendants("Games")
                                select game.Element("spielName").Value; 
                                


            foreach (string gameName in gameNameQuery)
            {

                //listBox1.Items.Add(name.Element("spielName").Value);

                Panel panel = new Panel();
                panel.BackColor = SystemColors.ButtonFace;
                panel.Location = new Point(18, 12);
                panel.Name = "panel1";
                panel.Size = new Size(200, 138);
                panel.TabIndex = 0;
                panel.BackColor = Color.Aqua;
                panel.BorderStyle = BorderStyle.Fixed3D;

                Label label = new Label();
                label.Location = new Point(0, 15);
                label.Text = (gameName);
                label.Size = new Size(35, 13);
                label.AutoSize = true;
                label.TextAlign = ContentAlignment.MiddleRight;


                Button button = new Button();
                button.Location = new Point(62, 112);
                button.Text = "Button Test";
                button.Size = new Size(75, 23);
                button.UseVisualStyleBackColor = true;


                flowLayoutPanel1.Controls.Add(panel);

                panel.Controls.Add(label);
                panel.Controls.Add(button);

            }
        }

        private void gameBackgroundBanner_Click(object sender, EventArgs e)
        {

        }


        public void test()
        {
            
        }
    }
}



Hallo Forum

Ich habe da ein kleines problem.

Ich möchte mir gerne einen eigenen kleinen server Browser schreiben
die daten dazu speicher ich mir in einer xml datei ab.

jetzt möchte ich jedoch das sich pro eintrag ein panel erstellt und wie genau ich das hinbekomme weiß ich nicht.


<gameDatenbank>
  <Game>
    <spielName>Fortnite</spielName>
    <spielIcon>BILD</spielIcon>
    <spielBanner>BILD</spielBanner>
    <Dateigröße>20 GB</Dateigröße>
    <spielVersion>0.0.0.1</spielVersion>
    <spielPlattform
      name="Steam"      
      />
    <spielAddons
      Addon1 = ""
      Addon2 = ""
      Addon3 = ""/>
    <spielMods
      Mod1 =""
      Mod2 =""
      Mod3 =""/>
    <spielErweiterungen
      Erweiterung1=""
      Erweiterung2=""
      Erweiterung3=""
      />
  </Game>
</gameDatenbank>

diese befindet sich auf einem webserver.

könntet ihr mir da villeicht helfen. ?

das ganze soll in etwa so aussehen.

Siehe Anhang

danke.

16.825 Beiträge seit 2008
vor 3 Jahren

Daten speichern und Dinge anzeigen sind zwei unabhängige Dinge.
[Artikel] Drei-Schichten-Architektur

wie genau ich das hinbekomme weiß ich nicht.

Was hast Du probiert? Wo kommst Du nicht weiter?

Im Endeffekt:

  • XML laden
  • XML lesen
  • Daten aus den XML deserialisieren (in ein Modell)
  • aus dem Modell die UI Elemente erzeugen
B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Ich Poste mal mein code.

Wie ich jetzt datein auslesen und einzelne panels hinzufügen kann habe ich verstanden. jedoch nicht wie ich die Panels so anordnen kann wie im ersten beispiel bild.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;

namespace WindowsFormsApp2
{
    public partial class newgame : UserControl
    {

        private static newgame _instance;

        public static newgame Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new newgame();
                return _instance;
            }
        }

        public string plattform = "Steam";

        public newgame()
        {
            InitializeComponent();
        }

        private void newgame_Load(object sender, EventArgs e)
        {
 
            
            // Nach Kategorien Soltieren
            XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");
            
            var gameName = from game in gameDatenbank.Descendants("Game") 
                           where game.Element("spielPlattform").Attribute("name").Value == plattform 
                           select game;

            foreach (var name in gameName)
            {

                Label label = new Label();
                label.Location = new Point(10, 10);
                label.Text = (name.Element("spielName").Value);
                label.Size = new Size(200, 30);


                FlowLayoutPanel dynamicPanel = new FlowLayoutPanel();
                dynamicPanel.Location = new Point(26, 12);
                dynamicPanel.Name = "Panel1";
                dynamicPanel.Size = new Size(200, 50);
                dynamicPanel.BackColor = Color.LightBlue;
                dynamicPanel.BorderStyle = BorderStyle.Fixed3D;
                dynamicPanel.Dock = DockStyle.Top;
                dynamicPanel.AutoSize = false;


                Button button = new Button();
                button.Location = new Point(10, 50);
                button.Text = "Test Button";
                button.Size = new Size(200, 30);
                dynamicPanel.Controls.Add(label);
                dynamicPanel.Controls.Add(button);
                Controls.Add(dynamicPanel);

            }

        }
    }
}

bei mir sieht das ganze jetzt so aus.

ich habe

dynamicPanel.Dock = DockStyle.Top;

dazugeschreiben weil man leider sonst nur 1 Panel sieht

4.938 Beiträge seit 2008
vor 3 Jahren

Du legst für jedes Element bisher ein eigenes FlowLayoutPanel an - möchtest du nicht eher nur genau eins haben und dadrin dann die SubPanels anlegen?

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Hallo Th69

Genau das war mein Plan 😃
danke dafür ich war wohl gestern nacht nicht mehr auf der höhe xD
jetzt funktioniert es.

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Entschuldigung für diesen doppel post jedoch habe ich noch eine abschließende frage.


        private void newgame_Load(object sender, EventArgs e)
        {
            // Kategorien Plattforms
            XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");

            var gameNameQuery = from game in gameDatenbank.Descendants("Games")
                                select game.Element("gameName").Value;
                           



            string _gameName = gameNameQuery.ToString();
            label1.Text = _gameName;

wie bekomme ich das in einen string mit dem richtigen inhalt covertiert ?
denn wenn ich es so mache erhalte ich im label nur dies

System.Linq.Enumerable+WhereSelectnumerablelterator'2[Systeam.Xml.Linq.XElement.System.String]

bzw. wie kann ich in meiner foreach mehrere strings verpacken ?

sodass ich zb die labels ( gameName , gameBanner, gameServerAdresse usw. ) mit dem inhalt verknüpfen kann.


// Kategorien Plattforms
            XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");

            var gameNameQuery = from game in gameDatenbank.Descendants("Games")
                                select game.Element("spielName").Value; 
                                


            foreach (string gameName in gameNameQuery)
            {

                //listBox1.Items.Add(name.Element("spielName").Value);

                Panel panel = new Panel();
                panel.BackColor = SystemColors.ButtonFace;
                panel.Location = new Point(18, 12);
                panel.Name = "panel1";
                panel.Size = new Size(200, 138);
                panel.TabIndex = 0;
                panel.BackColor = Color.Aqua;
                panel.BorderStyle = BorderStyle.Fixed3D;

                Label label = new Label();
                label.Location = new Point(0, 15);
                label.Text = (gameName);
                label.Size = new Size(35, 13);
                label.AutoSize = true;
                label.TextAlign = ContentAlignment.MiddleRight;


                Button button = new Button();
                button.Location = new Point(62, 112);
                button.Text = "Button Test";
                button.Size = new Size(75, 23);
                button.UseVisualStyleBackColor = true;


                flowLayoutPanel1.Controls.Add(panel);

                panel.Controls.Add(label);
                panel.Controls.Add(button);

            }

J
61 Beiträge seit 2020
vor 3 Jahren
  1. Ist der Schnipsel aus dem ersten Post noch ein gültiges Beispiel eines Game-Knotens? Da gibt es weder „spielname“ noch „gameName“.

  2. Entferne das select aus deiner Linq-Abfrage und werte die einzelnen Game-Knoten in der foreach-Schleife aus.

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Hallo Jompikumpi und danke für deinen Hinweis.

Ich werde denn ersten Beitrag mal Aktualisieren damit, das auf dem Aktuellen stand ist.
Ich habe leider nicht mehr so weit gedacht.

J
61 Beiträge seit 2020
vor 3 Jahren

Sollte in Descendants nicht „Game“ statt „Games“ stehen?

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Ja sollte es hab ich warscheinlich vergessen abzuändern 😉
aber irgendwie bekomme ich es nicht hin so wie du es geschreiben hast. meintest du es so ?
ich habe in diese richtig kein peil 😛

            List<string> Games = new List<string>()
            {
                "spielName","Dateigröße"
            };

            IEnumerable<string> enumerable()
            {
                foreach(string _games in Games)
                {
                    XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");
                    var gameNameQuery = from game in gameDatenbank.Descendants("Games")
                                     
                                        

                }
                yield break;
            }
J
61 Beiträge seit 2020
vor 3 Jahren

Ein Schleifendurchlauf pro Game-Knoten.

Falls dich nur ein bestimmter Spielename interessiert, dann filtere einfach.

     
                    XDocument gameDatenbank = XDocument.Load(@"C:\Users\toxic\source\repos\WindowsFormsApp2\gameDatenbank.xml");
                    foreach (var game in gameDatenbank.Descendants("Game"))
{
 // Auswertung der verschiedenen Elemente des Game-Knotens
}
                                     
             
B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

vielen lieben dank 😃
Ich glaube jetzt habe auch ich das verstanden 😉
und Vielen Dank für deine code lösung jedoch warum schreibst du var und nicht string ?
ich habe das var jetzt in string umbenant damit ich die labels.text füllen kann 😃

J
61 Beiträge seit 2020
vor 3 Jahren

warum schreibst du var und nicht string ?

Wenn du mehr als nur den Spielenamen brauchst, wirst du meine Lösung bevorzugen. 😉

16.825 Beiträge seit 2008
vor 3 Jahren

var ist implizit und gilt als Syntaktischer Zucker; hat nichts mit Funktionalität oder inhaltlicher Bevorzugung zutun.
var (C# Reference)