🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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.
#22419
Author: Netx
Date: Sun, 12 Aug 2012 17:37
21 lines
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.
#22420
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 12 Aug 2012 19:28
27 lines
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.
#22421
Author: Netx
Date: Sun, 12 Aug 2012 20:41
49 lines
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.
#22422
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 12 Aug 2012 22:37
69 lines
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