Avatar billede MikkelNielsen Nybegynder
20. juli 2009 - 13:08 Der er 7 kommentarer og
1 løsning

Spørgsmål vedr. data binding

Hej eskperter!

Jeg har en .xml fil, der bl.a. beskriver hvilke features, der skal være med i et produkt, hvilken platform produktet skal kompileres til og hvilke resourcefiler, der skal indgå i kompileringen. Opgaven lyder nu på at lave en C# applikation, der indlæser denne .xml fil og på en pæn måde præsenterer indholdet, således at brugeren kan ændre diverse attributter og senere gemme den ændrede .xml fil.

Jeg kan godt skrive noget kode, der indlæser filen og parser den ved hjælp af .NET's System.Xml. Jeg skal i så fald manuelt scanne efter diverse tags i .XML filen, pakke dem ind i datastrukturer, som jeg så præsenterer for brugeren (jeg havde tænkt mig at bruge et property grid). Jeg er fuldstændigt nybegynder på dette område, men har på fornemmelsen af der må være en smartere måde. Måske noget med det xsd.exe tool, der følger med Visual Studio?

Jeg ved godt, det er et meget åbent spørgsmål, som ikke er særligt præcist formuleret. Derfor håber jeg på lidt input og idéer til at komme i gang. :)
Avatar billede bvli Praktikant
20. juli 2009 - 13:29 #1
Er formatet på din xml fil fast, eller kan du selv definere det?
Avatar billede MikkelNielsen Nybegynder
20. juli 2009 - 13:39 #2
Xml-formatet ligger fast.
Avatar billede bvli Praktikant
20. juli 2009 - 13:51 #3
Okay..

Der er flere måde at komme i gang på. Xsd.exe kan generere klasser og du vil også kunne bruge binding på dem.

Men hvis du selv vil have fuld kontrol med din(e) klasse(r) som du vil bruge til bindingen, kan du lave en binding-klasse som du annoterer med Xml-Serialiserings-Attributter. Og så kan du bruge XmlSerializer'en til at hente og skrive xml-filen.

Hvis det er en rimelig simpel konfigurationsklasse, kan du evt. binde den op på et PropertyGrid og så har du næsten allerede lavet din applikation. (men i virkeligheden er det sjældent så nemt)

Kig evt. her hvis du vælger selv at lave konfigurationsklassen:
http://msdn.microsoft.com/en-us/library/83y7df3e%28VS.71%29.aspx
Avatar billede MikkelNielsen Nybegynder
20. juli 2009 - 16:03 #4
Tak for dit input. Nu prøvede jeg at bruge Xsd.exe til at generere en klasse (lad os kalde den NewDataSet.cs) ud fra min xml-fil. Den klasse har jeg føjet til mit projekt, og det kompilerer fint. Jeg havde så håbet, at jeg blot kunne gøre følgende:

System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer( typeof(NewDataSet) );

Idéen var, at så havde jeg alle mine xml-data i et objekt, som jeg kan gøre ting og sager med. Jeg får imidlertid en exception:

System.InvalidOperationException was unhandled
  Message="Unable to generate a temporary class (result=1).\r\nerror CS0030: Cannot convert type 'rule[]' to 'rule'\r\nerror CS0030: Cannot convert type 'rule[]' to 'rule'\r\nerror CS0030: Cannot convert type 'rule[]' to 'rule'\r\nerror CS0030: Cannot convert type 'packageTypefacePaletteReplace[]' to 'packageTypefacePaletteReplace'\r\n osv. osv

Hvad gør jeg forkert?
Avatar billede MikkelNielsen Nybegynder
21. juli 2009 - 10:17 #5
Okay, jeg overvejer en anden fremgangsmåde:

Indlæse xml-filen og manuelt parse den og dernæst vise indholdet til brugeren vha. et propertygrid. Når nu brugeren ændrer data og evt. tilføjer nye data, så skal de ændringer være indeholdt i xml-filen, når han gemmer den. Du nævner en bindings-klasse, men jeg beklager at måtte indrømme, at jeg ikke er helt med. :( Kan du komme med et konkret, simpelt eksempel?

På forhånd tak.
Avatar billede bvli Praktikant
21. juli 2009 - 12:15 #6
Der findes en million-millard attributer du kan smide på din konfigurationsklasse for at fortælle grid'et hvordan det skal interagere med den.

Men her er et simpelt eksempel. Du kan jo så selv fylde ud hvor du parser og gemmer din xml.

---

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Xml.Serialization;
using System.IO;

namespace B.Testing
{
    public class Configuration
    {
        string someText;
        public string SomeText {
            get { return someText; }
            set { someText = value; }
        }

        DateTime buildDate;
        public DateTime BuildDate {
            get { return buildDate; }
            set { buildDate = value; }
        }

        public void SaveAsXml(string fileName) {
            //TODO: Verify input.
            XmlSerializer s = new XmlSerializer(typeof(Configuration));
            using (Stream stream = File.OpenWrite(fileName)) {
                stream.SetLength(0);
                s.Serialize(stream, this);
            }
        }

        public static Configuration CreateFromXml(string fileName) {
            //TODO: Verify input.
            XmlSerializer s = new XmlSerializer(typeof(Configuration));
            using (Stream stream = File.OpenRead(fileName)) {
                return s.Deserialize(stream) as Configuration;
            }
        }
    }


    public class MainForm : Form {
        Configuration config;
        string fileName = "configuration.cfg";

        public MainForm() {
            PropertyGrid grid = new PropertyGrid();
            grid.Dock = DockStyle.Fill;           
            if (!File.Exists(fileName)) {
                new Configuration().SaveAsXml(fileName);
            }
            config = Configuration.CreateFromXml(fileName);
            grid.SelectedObject = config;
            this.Controls.Add(grid);
        }
       
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e) {
            DialogResult result = MessageBox.Show(this, "Should we save your changes?", "Save changes?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
            switch (result) {
                case DialogResult.Yes:
                    config.SaveAsXml(fileName);
                    break;
                case DialogResult.Cancel:
                    e.Cancel = true;
                    break;
                default:
                    break;
            }
            base.OnClosing(e);
        }

        static void Main() {
            Application.Run(new MainForm());
        }
    }
}
Avatar billede MikkelNielsen Nybegynder
21. juli 2009 - 13:45 #7
Okay, jeg tror jeg har nok idéer nu til at komme videre. Ellers smider jeg et nyt indlæg. :) Du skal i hvert fald have tak. Hvis du laver et Svar, skal jeg nok acceptere det, så du kan få dine points.
Avatar billede bvli Praktikant
21. juli 2009 - 13:57 #8
Værsgo :)
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