Avatar billede f-bs Nybegynder
28. september 2009 - 13:57 Der er 9 kommentarer og
1 løsning

Generere knapper ud fra XML fil

Hej,

Jeg har en XML fil med nogle indstillinger i, fx:

<Settings>
    <item>nr1</item>
    <item>nr2</item>
</Settings>

Dem ønsker jeg at lave til Buttons i mit program når dette "loades".
Dvs. den laver knapperne:
Nr1
Nr2

Hvis jeg fx. tilføjer <item>nr3</item>, skal den generere:
Nr1
Nr2
Nr3

Jeg _tror_ jeg har styr på at hente XML informationerne, men hvordan generere jeg knapperne?
Og yderligere hvordan får jeg dem til at stå i kolonner, således de ikke vælter rundt i min Form?
Avatar billede bvli Praktikant
28. september 2009 - 14:24 #1
Måske noget a'la:

[...]
FlowlayoutPanel panel = new FlowLayoutPanel();
panel.SuspendLayout();
foreach (XmlNode node in DenNodelisteDuHarSelectedMedItemsI) {
  Button b = new Button();
  b.Text = node.InnerText;
  b.Clicked += DynamicButtonClicked;
  panel.Controls.Add(b);
}
panel.ResumeLayout(false);
[...]

private void DynamicButtonClicked(object sender, EventArgs e) {
  Button b = sender as Button;
  if (b != null) {
    //Find ud af hvad du vil lave når der klikkes på din knap.
  }
}
Avatar billede bvli Praktikant
28. september 2009 - 14:25 #2
Hov.. Man skal nok også Add'e panel til sin form, så hvis vi regner med at ovenstående kode ligger i din form skal du nederst i den første kodesektion tilføje:

this.Controls.Add(panel);
Avatar billede f-bs Nybegynder
28. september 2009 - 15:18 #3
Jeg tror idéen er rigtig nok :)

Men umiddelbart får jeg ingen knapper frem?

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

namespace App
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }

        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            loginForm LoginForm = new loginForm();
            LoginForm.Show();
        }

        private void mainForm_Load(object sender, EventArgs e)
        {

            XmlDocument settings = new XmlDocument();
            settings.Load(@"D:\Settings.xml");

            XmlNodeList getItems = settings.GetElementsByTagName("item");


            FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();
            flowLayoutPanel1.SuspendLayout();
           
            foreach (XmlNode item in getItems)
            {
              Button btn = new Button();
              btn.Text = item.ChildNodes[0].FirstChild.Value;
              flowLayoutPanel1.Controls.Add(btn);
            }
            flowLayoutPanel1.ResumeLayout(false);

        }

            private void DynamicButtonClicked(object sender, EventArgs e)
            {
              Button btn = sender as Button;
              if (btn != null)
              {
                  MessageBox.Show("Hello");
              }
            }
        }
}

Jeg har med success fået udtrækket til at virke fra XML filen vha:
            foreach (XmlNode item in getItems)
            {
                string name = item.ChildNodes[0].FirstChild.Value;
                MessageBox.Show(name);
            }


Nogle idéer?
Avatar billede f-bs Nybegynder
28. september 2009 - 15:29 #4
Ah got it working =)
Knappen var bare så lille jeg slet ikke kunne se den, så den fik lige en .height og .width på, så kunne jeg.

Det er lige hvad jeg søger - mange tak...

smider du et svar?
Avatar billede bvli Praktikant
28. september 2009 - 15:35 #5
Ok - nu var det nok mest ment som inspiration. Jeg havde ikke lige kørt det gennem en compiler.

Det her burde dog virke. (igen - som inspiration)

using System;
using System.Xml;
using System.Windows.Forms;

namespace B.Testing
{

    class Program : Form
    {
        const string xml = "<stuff><item>item 1</item><item>item 2</item><item>item 3</item></stuff>";

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            FlowLayoutPanel p = new FlowLayoutPanel();
            p.Dock = DockStyle.Fill;
            this.Controls.Add(p);

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            XmlNodeList nl = doc.SelectNodes("/stuff/item");
            p.SuspendLayout();
            foreach (XmlNode n in nl)
            {
                Button b = new Button();
                b.Text = n.InnerText;
                p.Controls.Add(b);
            }
            p.ResumeLayout();
        }

        static void Main()
        {
            Program p = new Program();
            Application.Run(p);
        }
    }
}
Avatar billede bvli Praktikant
28. september 2009 - 15:36 #6
ah - vi krydsede vist hinanden.

Anyway - her er et svar :)
Avatar billede f-bs Nybegynder
28. september 2009 - 15:41 #7
Hehe...

Jeg acceptere lige, men ved du hvordan jeg kan få flowpanelet til at flyte hele formen?
Så straks der kommer flere knapper, så kan jeg kun se halvdelen af knap 2, men knap 1 vises helt.
Hvordan kan det være?
Avatar billede bvli Praktikant
28. september 2009 - 16:21 #8
FlowLayoutPanel p = new FlowLayoutPanel();
p.Dock = DockStyle.Fill;

Det er Dock-property'en der laver magien.

Kig i øvrigt på FlowLayoutPanel-dokumentationen. Den kan en masse omkring flowdirection og en meget andet lækkert.
Avatar billede f-bs Nybegynder
29. september 2009 - 09:01 #9
Ja det er noget der dur :)

Nu har jeg så en anden udfordring, med at knappen skal starte en funktion ud fra nogle infos som står i XML filen, og selve udtrækket ligger i for løkken. Men den må jeg se om jeg ikke kan løse på en eller anden spøjs måde :)

Jeg takker herfra!
Avatar billede luctatic Nybegynder
30. september 2009 - 16:55 #10
Du kan også vælge at placere dine knapper direkte på formen, men så skal du huske at sætte placeringen af knappen via Location, fx:

btn.Location = new Point(50, 50);

Og hvis du nu skal have flere knapper, alle sammen placeret pænt under hinanden:

btn.Location = new Point(50, this.Controls.Count*50);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester