Avatar billede mr_falle Nybegynder
17. september 2008 - 21:38 Der er 10 kommentarer og
1 løsning

Linq to XML + TreeView

Hej Ekspterter.

Jeg har et problem med noget Linq to XML sammen med et treeview.

Jeg har dette stykke kode onLoad, og det virker også fint, men hvis jeg åbner et andet vindue, og så åbner denne igen, får jeg ikke nogle noder i mit treeview.

Håber I kan hjælpe og på hurtigt svar.

Kode:

XDocument ShippingXML = XDocument.Load(path + "Shipping.xml");

var shipping = from shippingcost in ShippingXML.Descendant("Type")
              select new
              {
                  weight = shippingcost.Element("Vægt").Value,
                  price = shippingcost.Element("Pris").Value,
                  type = shippingcost.Attribute ("Betalings_type").Value,
              };

int parent = 0;
int child = 0;

foreach (var ship in shipping)
{
    foreach (TreeNode node in tvShippingCost.Nodes)
    {
        if (node.Text == ship.type.ToString())
              found = true;
    }

    if (!found)
    {
      TreeNode node = new TreeNode();
      node.Text = ship.type.ToString();
      tvShippingCost.Nodes.Add(node);
    }

    foreach (TreeNode node in tvShippingCost.Nodes)
    {
        if (node.Text == ship.type.ToString())
        {
            TreeNode newnode = new TreeNode();

          newnode.Text = "Vægt: " + ship.weight.ToString() + " g";

            tvShippingCost.Nodes[parent].Nodes.Add(newnode);
        }

        parent++;
  }

parent = 0;

foreach (TreeNode node in tvShippingCost.Nodes)
{
  child = 0;
  foreach (TreeNode childnode in tvShippingCost.Nodes[parent].Nodes)
{
  if (childnode.Text == "Vægt: " + ship.weight.ToString() + " g" && node.Text == ship.type.ToString())
  {
      TreeNode newnode = new TreeNode();

      newnode.Text = "Pris: " + ship.price.ToString() + " kr";

      tvShippingCost.Nodes[parent].Nodes[child].Nodes.Add(newnode);                                                       
    }
  child++;
}

  parent++;                       
}

parent = 0;
child = 0;
}
Avatar billede Syska Mester
18. september 2008 - 09:27 #1
asp.net må jeg formode ?

Hvad mere har du i din OnLoad ?

Har du kørt det i Debug og set om din OnLoad bliver kaldt igen ?
Avatar billede mr_falle Nybegynder
18. september 2008 - 09:46 #2
Sorry, ikke onLoad, form_Load så det en Win Applikation.

I debugmode springer den alle mine foreach over, så den kommer godt nok i form_load igen.
Avatar billede Syska Mester
18. september 2008 - 10:00 #3
Der må simpelten være noget kode du ikke viser mig, kode opfører sig ikke random og på forskellig måde, så der er noget som går galt ...

Hvad mener du også med at det ikke loader når du åbner et nyt vindue ? Hvad hedder din Form class ? Hvordan åbner du det nye vindue ? Hvordan viser du det ?

Du må også kunne se i Debug om dit "XDocument" reelt kommer til at indeholde noget efter det har loaded dit xml dokument ... ?
Avatar billede mr_falle Nybegynder
18. september 2008 - 10:16 #4
Koden ligger i en usercontrol i form_load. Når jeg første gang viser denne usercontrol, med panel.Controls.Add(new usercontrol()), viser den fint noderen i mig treeview, åbner jeg så en anden usercontrol f.eks panel.Controls.Clear; panel.Controls.Add(new usercontrol2()); og derefter åbner den første igen panel.Controls.Add(new usercontrol()) får jeg ikke vist nogle noder, når jeg debugger mig gennem koden, springer den simpelthen over foreach løkkerne når jeg åbner usercontrolen anden gang. endvidere kan jeg se at mit XDocument indeholder de korrekte data både første og anden gang.
Avatar billede Syska Mester
18. september 2008 - 13:37 #5
Hvad siger debuggeren din LINQ Query indeholder, er den også tom ? Den må jo være tom så eller ?

Kan det måske skyldes at du ikke får lukket dit XDocument ? ( Dispose/Close)

Virker som en meget mærkelig fejl.
Avatar billede mr_falle Nybegynder
18. september 2008 - 17:37 #6
Her kommer hele koden i form_load:

path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\App\\tmp_data\\";
                System.Threading.Thread download = new System.Threading.Thread(new System.Threading.ThreadStart(this.DownloadFile));
                download.Start();

                XDocument ShippingXML = XDocument.Load(path + "Shipping.xml");
               
                var shipping = from shippingcost in ShippingXML.Descendants("Type")
                        select new
                        {
                            weight = shippingcost.Element("Vægt").Value,
                            price = shippingcost.Element("Pris").Value,
                            type = shippingcost.Attribute("Betalings_type").Value,
                        };

                int parent = 0;
                int child = 0;
               
                foreach (var ship in shipping)
                {
                    foreach (TreeNode node in tvShippingCost.Nodes)
                    {
                        if (node.Text == ship.type.ToString())
                            found = true;
                    }

                    if (!found)
                    {
                        TreeNode node = new TreeNode();
                        node.Text = ship.type.ToString();
                        tvShippingCost.Nodes.Add(node);
                    }

                    foreach (TreeNode node in tvShippingCost.Nodes)
                    {
                        if (node.Text == ship.type.ToString())
                        {
                            TreeNode newnode = new TreeNode();

                            newnode.Text = "Vægt: " + ship.weight.ToString() + " g";

                            tvShippingCost.Nodes[parent].Nodes.Add(newnode);
                        }

                        parent++;
                    }

                    parent = 0;

                    foreach (TreeNode node in tvShippingCost.Nodes)
                    {
                        child = 0;
                        foreach (TreeNode childnode in tvShippingCost.Nodes[parent].Nodes)
                        {
                            if (childnode.Text == "Vægt: " + ship.weight.ToString() + " g" && node.Text == ship.type.ToString())
                            {
                                TreeNode newnode = new TreeNode();

                                newnode.Text = "Pris: " + ship.price.ToString() + " kr";

                                tvShippingCost.Nodes[parent].Nodes[child].Nodes.Add(newnode);                                                       
                            }
                            child++;
                        }

                        parent++;                       
                    }

                    parent = 0;
                    child = 0;
                }   

ShippingXML har ikke nogle lukke/dispose.

Og det virker som sagt første gang funktionen bliver kaldt.

LINQ Query indeholder korrekt data, hver gang...!!!

Underligt
Avatar billede Syska Mester
18. september 2008 - 21:42 #7
Hvor er "tvShippingCost" fra ?

og hvor er "found" henne ?

Hvis tvShippingCost er tom ... og "found" er true anden gang, så vil den ikke tilføje noget ....

// ouT
Avatar billede mr_falle Nybegynder
18. september 2008 - 21:51 #8
doohh... Havde stirret mig blind på found, så nu er problemet løst. Smid svar og 1000 tak for hjælpen :)
Avatar billede Syska Mester
18. september 2008 - 22:50 #9
haha ... men glad for at jeg kunne hjælpe, derfor det altid er rart med hele koden :-)

Men hvor kommer "found" fra ... ?

Jeg kan ikke helt se hvordan det løser det, men den må jo huske forige value eller ?

// ouT
Avatar billede mr_falle Nybegynder
19. september 2008 - 09:24 #10
Det er en global variabel, da jeg bruger den til at måle på senere.
Avatar billede mr_falle Nybegynder
19. september 2008 - 09:24 #11
Og ja, det ser ud som om at den husker den sidste value, selv om det virker noget underligt.
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