Avatar billede mcardle Nybegynder
27. december 2008 - 23:56 Der er 6 kommentarer og
1 løsning

Lidt LINQ, XML, Klasser hvad er smartest?

Hej eksperter.

Jeg er newbie i C# og jeg vil gerne vide det hele :oP

Jeg er i gang med at lave et program, der har en xml-fil med nogle mysql adresser i, som jeg gerne vil loade ind i en lisrBox og når jeg vælger en værdi, så skal nogle textbox'e udfyldes med værdierne fra xml-dokumentet.

Mit spørgsmål er så, skal jeg tage værdierne ud af xml-dokumentet og gemme i en klasse? (Det er den måde jeg har gjort det på nu, dog er der enkelte ting der ikke virker)

Eller:

Skal jeg hive de rigtige værdier ud hver gang med LINQ (Jeg har prøvet denne mulighed, med havde svært ved at sammenligne min streng fra listBox, i den WHERE sætning jeg lavede.)

Struktur:

<Database>
    <Name>mit_databasenavn</Name>
    <Server>serveren_databasen_ligger_på</Server>
    <Username>Brugernavn</Username>
    <Password>Kodeord</Password>
</Database>

Min kode indtil videre:

XDocument xmldoc = XDocument.Load("Databases.xml");
var xmlDBS = from db in xmldoc.Descendants("Database")
            select new
            {
                Name = db.Element("Name").Value,
                Server = db.Element("Server").Value,
                Username = db.Element("Username").Value,
                Password = db.Element("Password").Value
            };

foreach (var db in xmlDBS)
{
  lb_account_databaseList.Items.Add(new databaseObjHolder(db.Name, db.Server, db.Username, db.Password));
}

Håber ikke jeg har misforstået hele konceptet i C# :o)

//mcardle
Avatar billede mcardle Nybegynder
27. december 2008 - 23:59 #1
Det kan være jeg lige skal nævne, at det virker det kode jeg har skrevet, men jeg ved ikke hvordan jeg får det ud af min klasse igen.

Her er klassen:

public class databaseObjHolder
{
    private string DatabaseName;
    private string DatabaseDB;
    private string DatabaseUser;
    private string DatabasePass;

    public databaseObjHolder(string Name, string Database, string User, string Pass)
    {
        // Sets all the values of the obj.
        this.DatabaseName = Name;
        this.DatabaseDB = Database;
        this.DatabaseUser = User;
        this.DatabasePass = Pass;
    }

    public string Name
    {
      get { return DatabaseName; }
      set { DatabaseName = value; }
    }

    public string Database
    {
      get { return DatabaseDB; }
      set { DatabaseDB = value; }
    }

    public string User
    {
      get { return DatabaseUser; }
      set { DatabaseUser = value; }
    }

    public string Pass
    {
      get { return DatabasePass; }
      set { DatabasePass = value; }
    }

    public override string ToString()
    {
      return DatabaseName;
    }
}

//mcardle
Avatar billede arne_v Ekspert
28. december 2008 - 04:25 #2
Jeg har lavet et lille eksempel som viser 3 forskellige måder at gøre det på:

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

namespace E
{
    public class Database
    {
        public string Name { get; set; }
        public string Server { get; set; }
        public string User { get; set; }
        public string Password { get; set; }
        public override string ToString() { return "[" + Name + "," + Server + "," + User + "," + Password + "]"; }
    }
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            string xml = @"<?xml version='1.0'?>
<alldatabases>
    <database>
        <name>Foo</name>
        <server>foo.xxx.dk</server>
        <user>root</user>
        <password></password>
    </database>
    <database>
        <name>Bar</name>
        <server>bar.xxx.dk</server>
        <user>root</user>
        <password></password>
    </database>
    <database>
        <name>Local</name>
        <server>localhost</server>
        <user>root</user>
        <password></password>
    </database>
</alldatabases>";
            // parse XML
            XDocument doc = XDocument.Parse(xml);
            // XML -> anonymous class -> Database class -> ListBox
            var dbq1 = from db in doc.Element("alldatabases").Elements("database")
                      select new
                      {
                          Name = db.Element("name").Value,
                          Server = db.Element("server").Value,
                          User = db.Element("user").Value,
                          Password = db.Element("password").Value
                      };
            foreach(var db in dbq1)
            {
                listBox1.Items.Add(new Database
                                  { Name = db.Name,
                                    Server = db.Server,
                                    User = db.User,
                                    Password = db.Password
                                  });
            }
            // XML -> Database class -> ListBox
            var dbq2 = from db in doc.Element("alldatabases").Elements("database")
                      select new Database
                      {
                          Name = db.Element("name").Value,
                          Server = db.Element("server").Value,
                          User = db.Element("user").Value,
                          Password = db.Element("password").Value
                      };
            foreach(var db in dbq2)
            {
                listBox2.Items.Add(db);
            }
            // XML -> anonymous class -> ListBox
            var dbq3 = from db in doc.Element("alldatabases").Elements("database")
                      select new
                      {
                          Name = db.Element("name").Value,
                          Server = db.Element("server").Value,
                          User = db.Element("user").Value,
                          Password = db.Element("password").Value
                      };
            foreach(var db in dbq3)
            {
                listBox3.Items.Add(db);
            }
            // setup listboxes
            listBox1.DisplayMember = "Name";
            listBox1.SelectedIndex = 0;
            listBox2.DisplayMember = "Name";
            listBox2.SelectedIndex = 0;
            listBox3.DisplayMember = "Name";
            listBox3.SelectedIndex = 0;
        }
        void Button1Click(object sender, EventArgs e)
        {
            MessageBox.Show(listBox1.SelectedIndex + " " +    listBox2.SelectedIndex + " " +    listBox3.SelectedIndex);
            MessageBox.Show(listBox1.SelectedItem + " " +    listBox2.SelectedItem + " " +    listBox3.SelectedItem);
            MessageBox.Show(listBox1.SelectedItem.GetType().Name + " " + listBox2.SelectedItem.GetType().Name + " " + listBox3.SelectedItem.GetType().Name);
        }
    }
}

Jeg vil anbefale metode #2, fordi der kan du bruge det selected objekt som Database.
Avatar billede mcardle Nybegynder
28. december 2008 - 16:31 #3
Jeg kigger lige på det senere... Tak Arne
Avatar billede mcardle Nybegynder
28. december 2008 - 23:03 #4
Jeg ved ikke helt om det er mig der ikke fatter det helt, men jeg har en listBox og fire textBoxes. Når formen loader, så skal mit xml loades og når jeg vælger en database pålisten skal alle textBoxes udfyldes med de tilhørende data.

Jeg ved ikke hvordan jeg skal få data'erne ud af min listBox og ud i felterne. Jeg vil gerne vide metoden for at hente, splitte data op i variabler, så de kan bruges uafhængigt af hinanden.

//mcardle
Avatar billede arne_v Ekspert
28. december 2008 - 23:10 #5
hvis du bruger #1 eller #2 kan du:

Database db = (Database)listBox.SelectedItem;
textBox1.Text = db.Name;
textBox2.Text = db.Server;
...
Avatar billede mcardle Nybegynder
28. december 2008 - 23:24 #6
Haha, it works. Det var det jeg ville vide... Kanon Arne...

Smid et svar og du skal få nogle points.

//mcardle
Avatar billede arne_v Ekspert
28. december 2008 - 23:32 #7
svar
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