Avatar billede koppelgaard Praktikant
10. september 2010 - 11:54 Der er 31 kommentarer og
1 løsning

Get listbox index med baggrundstråd

Følgende eksempel viser, at det at hente index for en listbox med baggrundtråd ikke virker.
Er der et kvikt hoved er kan lave en metode, der kan returnerer index for mig?
private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
       
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            MessageBox.Show(getIndex().ToString());
        }
        private int getIndex()
        {
            return listBox1.SelectedIndex;
        }
Avatar billede Syska Mester
10. september 2010 - 12:05 #1
Får du nogen exceptions eller andre fejl ?
Avatar billede Bamma Nybegynder
10. september 2010 - 12:12 #2
langtid siden jeg har kigget på det og har ikke visual studio på denne computer,
men er det ikke under progresschanged at man skal have returneret det index?
Avatar billede koppelgaard Praktikant
10. september 2010 - 12:34 #3
Exception:

'Cross-thread operation not valid: Control 'listBox1' accessed from a thread other than the thread it was created on'

Barma jeg er ikke helt med på, hvad du mener?
Avatar billede koppelgaard Praktikant
10. september 2010 - 13:38 #4
Måske forstår jeg alligevel hvad du mener Barma.
Jeg bruger listboxen til at styre hvilket tryk, der skal bruges i en laboratorieopstilling.
Når visse forhold opstår, skifter jeg til en andet tryk.
Meddelsen, om disse nye forhold kommer serielt fra en trykmåler via en baggrundstråd.
Var det det du mente?

Michael
Avatar billede Bamma Nybegynder
10. september 2010 - 13:53 #5
den exception er meget almindelig at løbe ind i, jeg går ud fra du arbejder med visual studio, hvis du trykker hjælp til den exception du får, kommer du ind på microsofts forklaring, hvor der er nogle gode exempler på hvordan du kan løse problemet.
Det er fordi i winform og for den sags skyld osse wpf, køre det grafiske kun i en tråd. og hvis man har flere tråde og vil have informationer fra dem, skal de sendes over i den tråd der styre det grafiske tråd, hvorpå kan kalder in invoke, hvis jeg husker rigtigt, men prøv brug det exemple microsoft giver, det er rigtig godt. Ville gerne have linket direkte dertil, men igen jeg har ikke VS på denne computer.
Hvh
Bamma
Avatar billede Syska Mester
10. september 2010 - 13:54 #6
this.IsInvokeRequired
eller
this.InvokeRequired

Kan ikke huske hvilken en af dem ... men det er samme problem som i et af dine tidligere spørgsmål.

mvh
Avatar billede Bamma Nybegynder
10. september 2010 - 13:54 #7
Håber du forstår hvad jeg skrev, læste lige selv igennem det og virker lidt ulæseligt :)
Avatar billede lasserasch Juniormester
10. september 2010 - 18:22 #8
Og lige for at gøre det hele lidt mere forståeligt, så kommer her bare løsningen.



  private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            backgroundWorker1.ReportProgress(0);
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MessageBox.Show(getIndex().ToString());
        }

        private int getIndex()
        {
            return listBox1.SelectedIndex;
        }

Mvh.
Lasse
Avatar billede lasserasch Juniormester
10. september 2010 - 18:23 #9
Men det var bamma som kom med den i det første svar.
Jeg viser bare med et eksempel hvordan den implementeres i praksis.

/Lasse
Avatar billede koppelgaard Praktikant
10. september 2010 - 20:49 #10
Jeg er meget ked af det, men jeg tror jeg har udtrykt mig uklart.
Jeg bruger slet ikke backgroundWorker i mit projekt.
backgroundWorker blev bare brugt til at illustrere en baggrundstråd.
Avatar billede Syska Mester
11. september 2010 - 11:47 #11
Koppelgaard, se hvad jeg har skrevet, jeg er overbevist om det er samme problem du tidlgiere har oprettet et spm om, altså at det er ejer tråden af kontrollen der skal hive index ud ... og derfor skal du sprøge den kontrol, om "InvokeRequired" er true.

mvh
Avatar billede koppelgaard Praktikant
13. september 2010 - 10:49 #12
Undskyld min sene svar. Weekenden har været travl.

Buzzzz : bare for at du ikke skal tro, at jeg her helt idiot: jeg var godt klar over, at det var det, jeg skulle gøre. Men får bare en fejl.
Koden returner aldrig det rigtige index. Jeg får -1 tilbage.
Se koden her:

delegate int DelegateGetIndex();
public int getIndex()
        {
            if (listBox1.InvokeRequired)
            {
                listBox1.Invoke(new DelegateGetIndex(getIndex));
                return -1;
            }
            else
                return listBox1.SelectedIndex;

        }

eller download den:
http://www.mediafire.com/?xpz44bu5lcck4


Til Bamma og Lasse:
Mener I at jeg kan bruge backgroundworker til at løse mit problem.
Altså får returnet index ved at sætte en backgroundworker på sagen?
Når jeg køre din kode Lasse får jeg følgende fejl:
‘This BackgroundWorker states that it doesn't report progress. Modify WorkerReportsProgress to state that it does report progress.'
Avatar billede Syska Mester
13. september 2010 - 11:09 #13
Alt efter hvordan data er blevet bound ... så kan det ske du skal kigge på: http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.selecteditems.aspx
eller
http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.selectedindices.aspx

Da jeg ikke er klar over hvordan selectedindex virker, når man kan have flere selected ...

mvh
Avatar billede koppelgaard Praktikant
13. september 2010 - 11:35 #14
Hej Buzzzz
Jeg ved ikke, om du mener jeg kan bruge eksemplet i
http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.selectedindices.aspx

Det kan jeg desværre ikke fordi jeg har flere items med sammen værdi.
listboxen er en række af tryk som skal gennemløbes
f.eks. 10, 50, 100, 500, 100, 50, 10.
Indexet skal gemmes og genskabes hvis programmet af en eller anden årsag går ned. 50 index 1 er ikke det samme som 50 index 5.

Jeg kan dog ændre metoden til en void:

int index;
public void getIndex()
        {
            if (listBox1.InvokeRequired)
            {
                listBox1.Invoke(new DelegateGetIndex(getIndex));
               
            }
            else
                index= listBox1.SelectedIndex;

        }
Synes bare det andet burde virke.
Det er som metoden aldrig kommer til
  return listBox1.SelectedIndex;
Avatar billede Syska Mester
13. september 2010 - 11:47 #15
Du burde kunne bruge overstående.

En listbox kan indeholde flere SelectedItems ... derfor den måske vil virke. Du kan jo bare stoppe efter første selected. Jeg ved ikke hvordan SelectedIndex opfører sig ... kun en ide, mener jeg engang har været i samme problem.

hvis du har et kode eksemple som ikke virker ... så vil jeg gerne kigge på det i aften ...

mvh
Avatar billede koppelgaard Praktikant
13. september 2010 - 12:18 #16
Tja jeg har jo http://www.mediafire.com/?xpz44bu5lcck4
Det virker ikke.
Meget fint hvis du vil kikke i aften.
Avatar billede Syska Mester
13. september 2010 - 13:41 #17
Jeg kan intet se på det link. Ligesom mappen er tom.

mvh
Avatar billede koppelgaard Praktikant
13. september 2010 - 14:21 #18
Avatar billede Bamma Nybegynder
14. september 2010 - 14:27 #19
Undskyld, men troede det var noget der var nødvendigt at bgworker på, men hvis du bare vil have en messagebox frem når du vælger noget ny skal du bare smide en eventhandler på med SelectedIndexChanged.

Har forresten kigget i koden du sendte. Det der sker i den er at background workeren render igennem dit get index 1 gang. Hvis invoke ikke er required, så vil den køre ned i det return listbox1.SelectedIndex; og da der ikke er noget valgt når programmet starter vil den returnere -1 da der ikke er valgt noget.

Når du vælger noget nyt har BackGroundWorkeren gjordt sit arbejde, og vil derfor ikke tjekke op på hvad der er blevet lavet om.
Avatar billede koppelgaard Praktikant
15. september 2010 - 18:19 #20
Bamma 1000 tak for dine råd.
Den nævnte eventhandler kender jeg godt. Jeg undre mig over at e ikke ikke kan returnere indexet.
Jeg har prøvet at sætte indexet til noget og derefter via af en commandbutton kalde      backgroundWorker1.RunWorkerAsync();
Samme resultat.
Får stadig -1

Underligt
Avatar billede Syska Mester
15. september 2010 - 19:28 #21
Hvem er det som skifter input i den listbox?

Tror det hele bliver grebet an på den forkerte måde.
Avatar billede koppelgaard Praktikant
15. september 2010 - 21:02 #22
Jeg vil bare vise brugeren, hvor langt programmet er i listen af trin den skal gennemløbes.
Listboxen ændres med en baggrundtråd, som sættes i gang af data som kommer til serielporten
Avatar billede koppelgaard Praktikant
15. september 2010 - 21:10 #23
....men du har nok ret i det du antyder.
Jeg skal selv holde styr på hvilket index listboxen skal have og IKKE aflæse dens index. Index skal holdes i en intern variabel.
Men det undre mig alligevel at det ikke er muligt at aflæse indexet bare fordi det et en baggrundstråd der sætter aflæsningen igang.
Avatar billede Syska Mester
15. september 2010 - 21:24 #24
Jo, det kan også lade sig gøre ... men det hele lugter bare mere af en måske knap så  hensigt mæssig måde at gøre det på.

Jeg ville jo nok lave noget databinding ... og binde til en liste som du så holde styr på ... og deraf lader frameworket holde styr på resten. Ved ikke hvordan det gøres i WinForms, men WPF er det i hvert fald nemmere som jeg lige har forstået det. Da det ligesom er indbygget.

Men det må også kunne lade sig gøre i WinForms.

mvh
Avatar billede koppelgaard Praktikant
15. september 2010 - 21:53 #25
Ja det lyder rigtig smart!!!
Sig til hvis du falder over noget. Men hvis du ikke ved det, tror du så man kan?
Avatar billede Syska Mester
15. september 2010 - 22:00 #26
Skal nok sige til ... men håber lidt en anden finder en smart svar :-)

WinForms har jo mange år på bagen efter hånden, så hvis du har tiden er WPF ... næsten det hele værd, men den har en høj lærings kurve ... øv øv øv.
Avatar billede koppelgaard Praktikant
16. september 2010 - 08:39 #27
og det er en del af .NET Framework kan jeg se.
Uha hvis det ikke er lige til at gå  til må jeg hellere holde mig til at få styr på C# i første omgang. Der mangler jeg vist en hel del :-)

Men men men vil I ikke alle BAMMA BUZZZZ OG LASSE have noget for jeres hjælp?
Jeg opretter lige et ekstra spørgsmål. 10 pr person er næsten for lidt.
Sender I svar?
Avatar billede koppelgaard Praktikant
16. september 2010 - 08:42 #28
Avatar billede Bamma Nybegynder
16. september 2010 - 09:59 #29
Selv, jeg synes nu du skal prøve at kigge på WPF, det er jo stadig C# der ligger bagved, og jeg tror det er meningen af wpf skal erstatte winforms over tid. Desuden mener jeg, kan godt ske jeg tager fejl, men jeg mener WPF skulle lige tæt op af Silverlight.
Avatar billede koppelgaard Praktikant
16. september 2010 - 11:38 #30
Jamen det må jeg så prøve..
Avatar billede Syska Mester
16. september 2010 - 15:56 #31
klart ... og husk på ... vi er jo stadig herinde til at hjælpe dig :-)
Avatar billede koppelgaard Praktikant
17. september 2010 - 09:23 #32
100 tak.
Husk point for din hjælp denne gang
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