10. september 2010 - 11:54Der 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(); }
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?
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?
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
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.
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.
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;
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.'
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;
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 ...
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.
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
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
....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.
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.
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?
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.
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.