Thread View: alt.pl.comp.lang.csharp
4 messages
4 total messages
Started by Netx
Sun, 12 Aug 2012 17:37
ListBox przewija się do góry przy zmianie zawartości.
Author: Netx
Date: Sun, 12 Aug 2012 17:37
Date: Sun, 12 Aug 2012 17:37
21 lines
2049 bytes
2049 bytes
Napisałem amatorsko program do obsługi wzmacniacza Onkyo i mam listę (ListBox) do której wpisuję pozycje (np. listę piosenek, albumów czy radii internetowych itp.). Czasami tych pozycji na liście jest kilkadziesiąt a nawet do około stu i wczytują się dobre kilka sekund. W tym czasie chciałbym przeglądać listę przesuwając myszą scrollbar (pozycje jeszcze nie wczytane prezentowane są napisem "Pending..."), jednak za każdym razem gdy wpisuję/aktualizuję "tytuł" nowej pozycji, lista jest przewijana do góry po instrukcji: lb.Items[pos] = nrScreen.ToString() + ". " + newName; Czy istnieje możliwość aby przy wykonywaniu powyższej linijki dla pozycji niewidocznych, lista nie przewijała się na ekranie automatycznie na samą górę? Nie wiem czy to ma znaczenie ale program ma kilka wątków i dodałem linijkę dla uproszczenia programowania: CheckForIllegalCrossThreadCalls = false; Mimo powyższej instrukcji wszystko w programie działa Ok, tylko jest ten problem który opisałem (no i jeszcze chciałbym aby lista była przezroczysta, ale to jak na razie znalazłem na sieci że jest b.trudne - gdy w tle aplikacji jest zdjęcie). Pozdrawiam, Marek
Re: ListBox przewija się do góry przy zmianie zawartości.
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 12 Aug 2012 19:28
Date: Sun, 12 Aug 2012 19:28
27 lines
1911 bytes
1911 bytes
On Sun, 12 Aug 2012 19:37:09 +0200, Netx wrote: > <snip> jednak za każdym razem gdy wpisuję/aktualizuję > "tytuł" nowej pozycji, lista jest przewijana do góry po instrukcji: > lb.Items[pos] = nrScreen.ToString() + ". " + newName; > Czy istnieje możliwość aby przy wykonywaniu powyższej linijki dla > pozycji niewidocznych, lista nie przewijała się na ekranie automatycznie > na samą górę? http://pastebin.com/RmcumkFT Nie udało mi się efektu odtworzyć. Może więcej szczegółów/minimalny kompilujący się proof-of-concept? Zawsze się możesz posrednio zbindować do kolekcji za pomocą DataSource, zmieniać kolekcję i tylko wymuszać odrysowanie Refresh'em. > Nie wiem czy to ma znaczenie ale program ma kilka wątków i dodałem > linijkę dla uproszczenia programowania: > CheckForIllegalCrossThreadCalls = false; To źle. Tak trudno jest zrobić Invoke zamiast polegać na "na chwilę obecną działa"? -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Re: ListBox przewija się do góry przy zmianie zawartości.
Author: Netx
Date: Sun, 12 Aug 2012 20:41
Date: Sun, 12 Aug 2012 20:41
49 lines
3064 bytes
3064 bytes
W dniu 2012-08-12 21:28, Łukasz 'Maly' Ostrowski pisze: > On Sun, 12 Aug 2012 19:37:09 +0200, Netx wrote: >> <snip> jednak za każdym razem gdy wpisuję/aktualizuję >> "tytuł" nowej pozycji, lista jest przewijana do góry po instrukcji: >> lb.Items[pos] = nrScreen.ToString() + ". " + newName; >> Czy istnieje możliwość aby przy wykonywaniu powyższej linijki dla >> pozycji niewidocznych, lista nie przewijała się na ekranie automatycznie >> na samą górę? > > http://pastebin.com/RmcumkFT Dziękuję za odpowiedź! Jakiego C# używasz? Mój kompilator tego nie rozumiał: new Thread(() => button2_Click(sender, e)).Start(); Mam Microsoft Visual C# 2010 (Express) i zrobiłem lekką modyfikację - podaję niżej. Jeśli masz nowsze C# to nie wiem czy mogę się przesiąść ponieważ program być może chciałbym udostępnić za darmo a więc musi być możliwość łatwego uruchomienia przez użytkowników (nie wiem czy nowsze środowisko uruchomieniowe C# jest dostępne dla wszystkich i darmowe). Jeśli dobrze użyłem tego narzędzia "pastebin.com" to tu jest kod: http://pastebin.com/0FAgJNxP Naciskam "button 1" program wypełnia ListBox OK Przewijam listę myszą na ekranie np. na sam koniec Naciskam "button 2" program zmienia jedną pozycję (OK) ale jednocześnie przewija mi listę na samą górę (tego chcę uniknąć). Generalnie chcę aby użytkownik mógł sobie przeglądać ten ListBox zanim jeszcze będzie on do końca wypełniony danymi (które się wolno ściągają ze wzmacniacza przez sieć). > Zawsze się możesz posrednio zbindować do kolekcji za > pomocą DataSource, zmieniać kolekcję i tylko wymuszać > odrysowanie Refresh'em. Dzięki za naprowadzenie. Ewentualnie spróbuję ten metody. >> Nie wiem czy to ma znaczenie ale program ma kilka wątków i dodałem >> linijkę dla uproszczenia programowania: >> CheckForIllegalCrossThreadCalls = false; > > To źle. Tak trudno jest zrobić Invoke zamiast polegać na "na chwilę > obecną działa"? Pozdrawiam, Marek
Re: ListBox przewija się do góry przy zmianie zawartości.
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 12 Aug 2012 22:37
Date: Sun, 12 Aug 2012 22:37
69 lines
3945 bytes
3945 bytes
On Sun, 12 Aug 2012 22:41:07 +0200, Netx wrote: > W dniu 2012-08-12 21:28, Łukasz 'Maly' Ostrowski pisze: >> On Sun, 12 Aug 2012 19:37:09 +0200, Netx wrote: >>> <snip> jednak za każdym razem gdy wpisuję/aktualizuję >>> "tytuł" nowej pozycji, lista jest przewijana do góry po instrukcji: >>> lb.Items[pos] = nrScreen.ToString() + ". " + newName; >>> Czy istnieje możliwość aby przy wykonywaniu powyższej linijki dla >>> pozycji niewidocznych, lista nie przewijała się na ekranie automatycznie >>> na samą górę? >> >> http://pastebin.com/RmcumkFT > > Dziękuję za odpowiedź! > Jakiego C# używasz? Mój kompilator tego nie rozumiał: > new Thread(() => button2_Click(sender, e)).Start(); C# 3.0, .NET Framework 3.5 jest targetem. Visual Studio 2010. To czego kompilator nie zrozumiał to "Lambda Expression": http://msdn.microsoft.com/en-us/library/bb397687.aspx > Mam Microsoft Visual C# 2010 (Express) i zrobiłem lekką modyfikację - > podaję niżej. Jeśli masz nowsze C# to nie wiem czy mogę się przesiąść > ponieważ program być może chciałbym udostępnić za darmo a więc musi być > możliwość łatwego uruchomienia przez użytkowników (nie wiem czy nowsze > środowisko uruchomieniowe C# jest dostępne dla wszystkich i darmowe). Twój Express 2010 też powinien to skompilować bez problemu. Wszystko jest darmowe, ale to nie jest kwestia wersji środowiska. > Jeśli dobrze użyłem tego narzędzia "pastebin.com" to tu jest kod: > http://pastebin.com/0FAgJNxP > > Naciskam "button 1" > program wypełnia ListBox OK > Przewijam listę myszą na ekranie np. na sam koniec > Naciskam "button 2" > program zmienia jedną pozycję (OK) ale jednocześnie przewija mi listę > na samą górę (tego chcę uniknąć). Udało mi się powielić, to jest ficzer ListBox'a. Jeżeli interesują Cię szczegóły to wystarczy zdekompilować System.Windows.Forms. (Spowodowane jest to tym, że ListBox "nie aktualizuje" istniejącej pozycji, tylko usuwa i wstawia nową pozycję przy zmianie etykiety i to wymusza odświeżenie zaznaczenia/przesunięcie scrolli: http://pastebin.com/WZsXtBMS ) > Generalnie chcę aby użytkownik mógł sobie przeglądać ten ListBox zanim > jeszcze będzie on do końca wypełniony danymi (które się wolno ściągają > ze wzmacniacza przez sieć). >> Zawsze się możesz posrednio zbindować do kolekcji za >> pomocą DataSource, zmieniać kolekcję i tylko wymuszać >> odrysowanie Refresh'em. > > Dzięki za naprowadzenie. Ewentualnie spróbuję ten metody. Tej, albo pójdź na łatwiznę i zastąp ListBox'a za pomocą ListView z ListView.View = List, tam się nic takiego nie dzieje. Pozatym, poważnie, zrób to porządnie, bez tego: CheckForIllegalCrossThreadCalls = false; ...bo nagle uderzysz w jakiś specyficzny stan i przestanie działać z losowymi efektami ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://l3v.pl/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads