ListView/DataGridView - szybkosc dzialania

0

Jestem w trakcie konczenia kalkulatora sieciowego na zaliczenie. Dla klasy C i B nie bylo problemu. Problem zaczal sie dla klasy A i bardzo duzej ilosci podsieci > 65534. Rozwiazalem to na dwa sposoby. Jednak zaden nie daje zadowalajacej szybkosci dzialania.

Sposob 1:

ListViewItem[] tablicaAdresow = new ListViewItem[iloscPodsieci];

for (int i = 0; i < iloscPodsieci; i++)
{
      ListViewItem adres = new ListViewItem(new string[] { i.ToString(), "1.0.0.0", "1.0.0.1 - 1.0.0.2", "1.0.0.3"});
      tablicaAdresow[i] = adres;
}

ListView1.BeginUpdate();
ListView1.Items.AddRange(tablicaAdresow);
ListView1.EndUpdate();

Sposob 2:

DataTable1.BeginLoadData();
DataTable1.BeginInit();

for (int i = 0; i < iloscPodsieci; i++)
{
     DataRow wiersz = DataTable1.NewRow();

     wiersz[0] = i.ToString();
     wiersz[1] = "1.0.0.0";
     wiersz[2] = "1.0.0.1 - 128.0.0.2";
     wiersz[3] = "1.0.0.3";
                        
     DataTable1.Rows.Add(wiersz);
}

DataTable1.EndLoadData();
DataTable2.EndInit();

DataGridView1.DataSource = DataTable1;

Sposob 2 jest owiele szybszy od 1. Jednak i tak uzywajac drugiego sposobu i ustawiajac liczbe podsieci na 4194302, moge sobie isc kawe zrobic i zjesc cos jeszcze. Przy uzywaniu obu sposob uzycie procesora skacze do 100% i program zaczyna tez pochlaniac coraz wiecej pamieci jak dodaje kolejne elementy.

Dla przykladu ponizej link do innego kalkulatora sieciowego, w ktorym nie ma tego problemu:
http://www.download.net.pl/1730/Advanced-IP-Address-Calculator/
Ustawiam w nim duza liczbe podsieci i nawet nie widac kiedy on to oblicza. Z tym, ze okno z lista adresow nie jest na glownym formularzu tylko na oddzielnym. U mnie wszystkie kontrolki umiescilem na jednym formularzu.

Jakies pomysly jak przyspieszyc proces dodawania duzej liczby elementow do ListView/DataGridView? Albo moze sa jakies inne kontrolki do tego przeznaczone? Bede wdzieczny za pomoc [browar]

0

Możesz wrzucać do listboxa dynamicznie tylko widoczne linijki. Musiałbyś położyć własny scroll bar obok list view i w zależności od położenia suwaka zmieniać zawartość list view.

0

Albo stworz wlasne przewijanie DataGrida/ListView. Zauwaz, ze na ekranie i tak nie pokaze sie naraz wiecej niz ok. 50-100 wpisow nawet dla duzej rozdzielczosci. Wpisz do datagrida mniejsza ilosc, powiedzmy 1000. Jak przy przewijaniu zblizysz sie do granicy to wczytujesz nastepny 1000. Po paru wczytanych tysiacach pierwszy tysiac usuwasz, zeby grid sie nie rozrosl, itp. Wczytywanie mniejszej ilosci jest zdecydowanie szybsze, wiec przy przewijaniu nie powinno byc widac roznicy. Jak bedzie problem z paskiem przewijania (np. przy szybkim przewijaniu + wielkosc paska mniejsza dla mniejszej ilosci) to zrob sobie osobne przyciski do przewijania a pasek wylacz.

//edit
heh, adf88 zmienil odpowiedz, to moja tak srednio pasuje ;)

0

Bardzo dobre rozwiazanie. Dziekuje za pomoc :-)

0

Tak na marginesie, komponent listview posiada cachowanie wynikow. Dynamiecznie pobiera dane z listy. Zamiast pisać od nowa dynamiczne pobieranie danych skozystaj z tego który jest juz zaimplementowany ( dopiero od wersji .NET 2.0 ).
Poczytaj sobie ogolnie o :

CacheVirtualItems
RetrieveVirtualItem

p.s
jak bedziesz kombinowal nie zapomnij wlaczyc w proparties opcji dla VirtualMode na wartosc true inaczej obie te metody nie beda chodzily.

1 użytkowników online, w tym zalogowanych: 0, gości: 1