Avatar billede hacked Nybegynder
03. marts 2006 - 16:37 Der er 11 kommentarer og
2 løsninger

TreeView Sort + Event helvede

Hej

Jeg har et treeview med diverse features: opret node, slet node, rediger node ect.
Når jeg opretter eller redigerer en node vil jeg gerne have mit TreeView til at sortere noderne.
TreeView.Sort() skal stå for sorteringen.
Jeg har derfor tilføjet en TreeViewNodeSorter til mit TreeView. Min TreeViewNodeSorter klasse implementere IComparer.
Jeg har prøvet at kalde Sort metoden i AfterLabelEdit når jeg opretter en Node men så kalder den en masse andre events - åbenbart nogle events som Sort automatisk inkludere.
Eksempler på hvordan det kan undgås at Sort kalder disse events ville være super. Har kigget lidt på BeginUpdate / EndUpdate men det virker ikke som om det er så smart at kalde disse i events.

Ps. Er det bare mig eller er der ingen Sorted Property i .Net 2.0? Alle skriver om den, selv msdn2, men jeg kan bare ikke finde den :(
På forhånd tak.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 16:59 #1
hvis det er på en hjemmeside findes der ikke nogen treeview sorted.
Her skal du sortere din datasource og efterfølgende databinde træet
Avatar billede hacked Nybegynder
03. marts 2006 - 17:03 #2
Det er ikke en hjemmeside.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:05 #3
hvad er det for nogle events som bliver kaldt ?
Avatar billede hacked Nybegynder
03. marts 2006 - 17:09 #4
Hvis jeg foreksempel kalder sort i afterlabeledit så går den i en uendelig løkke.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:11 #5
msdn skriver:
When Sorted is set to true, the TreeNode objects are sorted in alphabetical order by their Text property values. You should always use BeginUpdate and EndUpdate to maintain performance when adding a large quantity of items to a sorted TreeView. When the text of an existing node is changed, you must call Sort to resort the items.

fatter heller ikke rigtigt.
Hvorfor jeg ikke kan se sorted.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:16 #6
her er et eksempel på hvordan begin og endupdate bruges

// Create a new ArrayList to hold the Customer objects.
private ArrayList customerArray = new ArrayList();

private void FillMyTreeView()
{
  // Add customers to the ArrayList of Customer objects.
  for(int x=0; x<1000; x++)
  {
      customerArray.Add(new Customer("Customer" + x.ToString()));
  }

  // Add orders to each Customer object in the ArrayList.
  foreach(Customer customer1 in customerArray)
  {
      for(int y=0; y<15; y++)
      {
        customer1.CustomerOrders.Add(new Order("Order" + y.ToString()));   
      }
  }

  // Display a wait cursor while the TreeNodes are being created.
  Cursor.Current = new Cursor("MyWait.cur");
       
  // Suppress repainting the TreeView until all the objects have been created.
  treeView1.BeginUpdate();

  // Clear the TreeView each time the method is called.
  treeView1.Nodes.Clear();

  // Add a root TreeNode for each Customer object in the ArrayList.
  foreach(Customer customer2 in customerArray)
  {
      treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));
         
      // Add a child treenode for each Order object in the current Customer object.
      foreach(Order order1 in customer2.CustomerOrders)
      {
        treeView1.Nodes[customerArray.IndexOf(customer2)].Nodes.Add(
          new TreeNode(customer2.CustomerName + "." + order1.OrderID));
      }
  }

  // Reset the cursor to the default for all controls.
  Cursor.Current = Cursors.Default;

  // Begin repainting the TreeView.
  treeView1.EndUpdate();
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:19 #7
hmm jeg fandt treeView1.Sorted = true;
men det lader til at den ikke bliver fundet med intellisense.
mit program compilede fint uden nogen fejl.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:20 #8
også hvis jeg bare bruger:
TreeView t = new TreeView();
            t.Sorted = true;
Avatar billede hacked Nybegynder
03. marts 2006 - 17:38 #9
Ok så man må gå ud fra at Sorted findes.
Nu er problemet bare de uendelige løkker på grund af events. Jeg lader spørgsmålet stå til d. 4. ellers får du bare pointene.
Avatar billede dr_chaos Nybegynder
03. marts 2006 - 17:49 #10
har du mulighed for at se de events der bliver kaldt ?
Avatar billede hacked Nybegynder
04. marts 2006 - 01:05 #11
Har fundet ud af det :) Jeg bruger ikke Sorted eller BeginUpdate/EndUpdate. Da jeg afprøvede det updaterede og sorterede mit TreeView ikke ordentligt.

Jeg fandt noget info her: http://www.codeproject.com/csharp/begininvoke.asp

Løsning:

private delegate void TreeViewDelegate();

private void treeView1_AfterLabelEdit_1(object sender, NodeLabelEditEventArgs e)
{
  treeView1.LabelEdit = false;
  if(e.Label!=null) {
      treeView1.SelectedNode.Text = e.Label;
  }
  treeView1.BeginInvoke(new TreeViewDelegate(updateTreeView));
}

void updateTreeView()
{
  treeView1.MyTreeViewSort();
}

Jeg eksekverer min delegate asynkront på tråden som mit TreeView's handle er oprettet i. Pyha - dr chaos læg et svar så deler vi.
Avatar billede dr_chaos Nybegynder
04. marts 2006 - 10:29 #12
svar :)
Avatar billede hacked Nybegynder
04. marts 2006 - 12:24 #13
Super ;)
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