Avatar billede smsng Nybegynder
29. august 2005 - 15:13 Der er 24 kommentarer og
1 løsning

ListBox control

Heysa..
Jeg har to xml doc. som jeg indlæser.
Jeg har to XMlNodeList (nodeList1 og nodeList2).
Jeg lister dem i to listbox´es.
Hvis node´ene IKKE er ens, vil jeg have dem skrevet ud i fx. rød farve, men hvordan gør jeg det???

for(int i=0; i<nodeList1.Count; i++)
{
if(nodeList1[i].Name == nodeList2[i].Name)
{
listBox1.Items.Add(nodeList1[i].Name);
listBox2.Items.Add(nodeList2[i].Name);
}
else
{
listBox1.Items.Add(nodeList1[i].Name);
listBox2.Items.Add(nodeList2[i].Name);
//men her skal skriften være rød
}
}
Avatar billede anadan Nybegynder
29. august 2005 - 15:33 #1
Der er jeg bange for at du er nødt til at tegne override OnPaint i ListBox
Avatar billede smsng Nybegynder
29. august 2005 - 15:34 #2
øv..det var netop det jeg håbede på jeg kunne undgå :)
Avatar billede anadan Nybegynder
29. august 2005 - 15:36 #3
det er ikke så svært.

Din egne control skal extende ListBox, og dens DrawMode sættes til OwnerDraw.

Jeg var faktisk lidt hurtig, det er DrawItem der skal overrides:

private void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
  // Set the DrawMode property to draw fixed sized items.
  listBox1.DrawMode = DrawMode.OwnerDrawFixed;
  // Draw the background of the ListBox control for each item.
  e.DrawBackground();
  // Create a new Brush and initialize to a Black colored brush by default.
  Brush myBrush = Brushes.Black;

  // Determine the color of the brush to draw each item based on the index of the item to draw.
  switch (e.Index)
  {
      case 0:
        myBrush = Brushes.Red;
        break;
      case 1:
        myBrush = Brushes.Orange;
        break;
      case 2:
        myBrush = Brushes.Purple;
        break;
  }

  // Draw the current item text based on the current Font and the custom brush settings.
  e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush,e.Bounds,StringFormat.GenericDefault);
  // If the ListBox has focus, draw a focus rectangle around the selected item.
  e.DrawFocusRectangle();
}
Avatar billede anadan Nybegynder
29. august 2005 - 15:40 #4
Nej, nu er jeg da fuld... Din ListBox skal bare have tilknyttet en event OnDrawItem, metoden er den ovenstående ^^

public Form(){
  listBox box = new ListBox();
  box.OnDrawItem+=new DrawItemEventHandler(box_DrawItem);
}
Avatar billede smsng Nybegynder
29. august 2005 - 15:53 #5
hvordan er det nu jeg skal kalde

private void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{}

fra min
private void btn_Click(object sender, EventArgs e)
{}
Avatar billede anadan Nybegynder
29. august 2005 - 15:57 #6
den skal du ikke kalde..
du skal bare programmere noget logik i din DrawItem metode. Du får fat i indexet i din ListBox med e.Index. Dette index kan du så bruge til at tjekke din XML filer med. Hvis XMl filerne er ens på et givent index, tegn med sort, ellers tegn med rød.

Jeg vil dog anbefale at du læser din XML ind i dit btn_click, da det vil tage alt for lang tid at læse xml ind for hver gang drawitem metoden skal kaldes.
Avatar billede anadan Nybegynder
29. august 2005 - 15:58 #7
DrawItem metoden bliver kaldt automatisk når du kalder listbox.Refresh() efter du har fyldt den op med items
Avatar billede smsng Nybegynder
29. august 2005 - 16:17 #8
Jeg er ikke helt med på hvad du mener med
"Du får fat i indexet i din ListBox med e.Index. Dette index kan du så bruge til at tjekke din XML filer med. Hvis XMl filerne er ens på et givent index"

Hvordan det??
Avatar billede anadan Nybegynder
29. august 2005 - 16:23 #9
Brush b;
if(nodelist1[e.index].name==nodelist2[e.index].name){
  b = Brushes.Black;
}
else b = Brushes.Red;

//tegn her
Avatar billede smsng Nybegynder
29. august 2005 - 16:38 #10
jeg er med på at det sidste du skrev skal stå i listBox1_DrawItem

men hvordan får jeg den til at tegne umiddelbart efter at jeg har aktiveret min btn_Click??

Og hvordan får jeg den til at tegne på listbox´en??
Avatar billede smsng Nybegynder
29. august 2005 - 16:40 #11
hvordan vil du loade xmlfilerne i btn_Click, og kalde nodelist1 i listBox1_DrawItem??
Det kan da ikke lade sig gøre??
Avatar billede anadan Nybegynder
29. august 2005 - 16:40 #12
jeg går ud fra at din btn_Click loader noget xml?

i din btn_Click metode skal du så bare loade din xml ind i dine nodelist's og så kalde listBox.Refresh()
Avatar billede smsng Nybegynder
29. august 2005 - 16:49 #13
Jeg loader xml filerne i btn_Click metoden.

De nodelist´s jeg har i denne metode, kan jeg da ikke kalde fra listBox1_DrawItem eventet til at lave den her

Brush b;
if(nodelist1[e.index].name==nodelist2[e.index].name){
  b = Brushes.Black;
}
else b = Brushes.Red;

//tegn her
Avatar billede anadan Nybegynder
29. august 2005 - 16:50 #14
gør dem private for klassen eller noget
Avatar billede smsng Nybegynder
29. august 2005 - 16:53 #15
jeg tror jeg dropper det, men tak for hjælpen.
smid et svar hvis du vil have pointene
Avatar billede anadan Nybegynder
29. august 2005 - 16:54 #16
lav en kommentar med to xml docs, så laver jeg det lige
Avatar billede anadan Nybegynder
29. august 2005 - 16:55 #17
-hvis du altså stadig er interesseret
Avatar billede smsng Nybegynder
29. august 2005 - 17:13 #18
Hvis du har tid, må du da gerne ligge på det.

Her er den ene xml fil:

  <?xml version="1.0" encoding="utf-8" ?>
- <Diagram>
- <navn>
  <navn>Personlige info</navn>
  </navn>
- <version>
  <versionsnr>1</versionsnr>
  <ejer>Mig</ejer>
  </version>
- <personer>
- <person>
  <fornavn>Allan</fornavn>
  <efternavn>Mortensen</efternavn>
  <alder>25</alder>
  <adresse>abcvej 1</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
- <person>
  <fornavn>Lone</fornavn>
  <efternavn>Mortensen</efternavn>
  <alder>24</alder>
  <adresse>abcvej 5</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
- <person>
  <fornavn>Kristian</fornavn>
  <efternavn>Johansson</efternavn>
  <alder>19</alder>
  <adresse>abcvej 25</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
  </personer>
  </Diagram>

Og her er den anden:

  <?xml version="1.0" encoding="utf-8" ?>
- <Diagram>
- <navn>
  <navn>Personlige info</navn>
  </navn>
- <version>
  <versionsnr>2</versionsnr>
  <ejer>En anden</ejer>
  </version>
- <personer>
- <person>
  <fornavn>Hans</fornavn>
  <efternavn>Andersen</efternavn>
  <alder>60</alder>
  <adresse>abcvej 1</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
- <person>
  <fornavn>Helle</fornavn>
  <efternavn>Knnudsen</efternavn>
  <alder>52</alder>
  <adresse>Pladsen 5</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
- <person>
  <fornavn>Kristian</fornavn>
  <efternavn>Johansson</efternavn>
  <alder>19</alder>
  <adresse>abcvej 25</adresse>
  <postnr>0000</postnr>
  <by>ABC</by>
  <land>Danmark</land>
  </person>
  </personer>
  </Diagram>

Det jeg gerne vil have vist i listbox´en er <navn>, <version>, <person>
Avatar billede anadan Nybegynder
29. august 2005 - 17:16 #19
navn, version, person?
Der er da kun et navn/version for en hel liste personer?
giv lige et eksempel
Avatar billede smsng Nybegynder
29. august 2005 - 17:19 #20
ja..det er også meningen.

navn
version
person

Når man trykker på et af dem, vises indholdet i en datagrid ved siden af.
Jeg har lidt på fornemmelsen at det ikke kan lade sig gøre, hvis man tegner nodes´ene, men jeg er ikke sikker..
Avatar billede anadan Nybegynder
29. august 2005 - 17:21 #21
Jeg laver et eksempel for listen af personer, så kan du selv rette den til, er ikke lige med på hvad du mener...
Avatar billede smsng Nybegynder
29. august 2005 - 17:21 #22
ok...
Avatar billede burningice Nybegynder
30. august 2005 - 19:12 #23
smsng>> jeg tror du roder lidt rundt i at listBox1_DrawItem er en metode du skal kalde... dette er IKKE tilfældet.

på samme måde som du at du heller ikke selv kalder btn_Click, men at den automatisk bliver udført når du klikker på din knap, på samme måde skal du heller ikke selv kalde listBox1_DrawItem. Den bliver automatisk kaldet af din listbox, hver gang der er et item der skal tegnes.
Avatar billede smsng Nybegynder
30. august 2005 - 19:14 #24
det har jo fundet ud af, tak.
Avatar billede anadan Nybegynder
30. august 2005 - 19:41 #25
hvad skal der ske i det tilfælde hvor der ikke er lige mange elementer?
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