Ok, to jak teraz wiem co chcesz zrobić, to sugerowane rozwiązanie jest trochę inne. Tu jest sugerowany sposób aktualizowania listy:
private void UpdateList()
{
Process[] ProcessList = Process.GetProcesses();
// Add new
foreach (Process CurrentProcess in ProcessList)
{
String label = String.Format(
"Process: {0} ({1})",
CurrentProcess.ProcessName,
CurrentProcess.Id);
if (MainList.Items.IndexOf(label) == -1)
{
MainList.Items.Add(label);
}
}
// Remove old
int Length = MainList.Items.Count;
for (int i = 0; i < Length; ++i)
{
String s = MainList.Items[i].ToString();
bool ProcessFound = false;
foreach (Process CurrentProcess in ProcessList)
{
String label = String.Format(
"Process: {0} ({1})",
CurrentProcess.ProcessName,
CurrentProcess.Id);
if (s == label)
{
ProcessFound = true;
break;
}
}
if (!ProcessFound)
{
MainList.Items.RemoveAt(i);
--Length;
--i;
}
}
}
Najłatwiej jest się pozbyć częstego mrugania przez nie zmienianie tego, co nie uległo zmianie. Masz jak najbardziej możliwość to zrobić, bo lista procesów w systemie nie zmienia się aż tak często. Jak to działa? MainList to oczywiście kontrolka-lista. Co wywołanie zegara wykonywane jest UpdateList, które wykonuje dwie operacje: najpierw dodaje, później odejmuje elementy z listy.
Dodawanie: dla każdego procesu, który uruchomiony jest w systemie, sprawdź, czy znajduje się już na liście. Jeśli nie, dodaj go. Jeśli tak - nie rób nic.
Usuwanie: dla każdego wpisu na liście, jeśli nie istnieje już taki proces w systemie - usuń element listy.
To połowa rozwiązania, którego szukasz. Druga połowa to “przewijanie” listy, jeśli zmieni się na niej ilość wpisów, tak, aby zawsze było widoczne to co chcesz. Zwracam uwagę, że przy usuwaniu nie użyłem foreach. Przyczyna jest prosta: zewnętrzna pętla operuje na elementach listy a ja z tej listy usuwam elementy. Foreach sobie nie poradzi, jeśli “pod nim” coś podbierzemy.
A co do wcześniejszej propozycji - przyczyna przeciągłego i drażniącego mrugania to wynik wykonywania Lista.Items.Add(…) – za każdym razem kiedy to robisz, WinForms renderuje od nowa kontrolkę (mruganie). Jeśli możesz stworzyć zmienną ListBox.ObjectCollection i do niej dodać elementy po czym całą kolekcję przypisać do Lista.Items, będziesz miał tylko pojedyncze renderowanie. Jest to szczególnie przydatne przy wypełnianiu drzew (TreeView). Jeśli zależy Ci na absolutnie zerowym mruganiu - musisz wyrzeźbić własną kontrolkę, przykro mi.