Ostatnie moje pytanie dzisiaj, bo zostanę oskarżony o spamowanie. Które ze zdarzeń kontroli ListBox wykrywa zmianę zawartości, tzn dodanie bądź usunięcie wpisu? Nie mogę niczego dopasować;/.
Nie wierzę że nie idzie tego zrobić, jakoś musi się to robić. Próbowałem tak:
d_lb_listauzytk.TextChanged +=new EventHandler(d_lb_listauzytk_TextChanged);
No i zero efektu. Chciałbym dzisiaj jeszcze to napisać, ale pomysły mi się kończą...
Jak to nie działa...?
dodaj sobie w miejscu gdzie na pewno się wykona kod
textBox1.TextChanged += (e, sender) => { MessageBox.Show("A jednak..."); };
(wyrażenie lambda, dla przykładu. Równie dobrze może być tam eventHandler.)
To musi działać, w przeciwnym wypadku odwołujesz się na przykład nie do tego textboxa...
No niestety nie działa. Dodałem tą linię do pliku form1.designer.cs
this.d_lb_listauzytk.TextChanged += new System.EventHandler(this.d_lb_listauzytk_TextChanged);
Napisałem metodę obsługującą zdarzenie:
private void d_lb_listauzytk_TextChanged(object sender, EventArgs e)
Odwołuje się na 95% do właściwej kontrolki, tylko zaznaczam że mówimy o kontrolce ListBox a nie TextBox. I chodzi mi o efekt w którym ta metoda uruchamiana jest zdarzeniem a nie wywołaniem z programu typu:
d_lb_listauzytk_TextChanged(sender, e);
To nie może działaś bo właściwość tekst po prostu się nie zmienia przy dodawaniu w ten sposób:
d_lb_listauzytk.Items.Add(p);
czy usuwaniu w analogiczny sposób. Czyli nie ma zdarzenia które reagowałoby na zmianę właściwości Count czy dodanie lub usunięcie wpisu?
Ech, sorry, zrozumiałem textbox zamiast listboxa.
Cóż, programiści z Microsoftu najwyraźniej nie przewidzieli możliwości sprawdzenia czy jest dodawany obiekt do listboxa. W ramach ukarania siebie za nieumiejętność czytania postanowiłem jednak poszukać i znalazłem niby jakieś rozwiązanie... Tylko że IMO raczej nieładne...
Ogólny pomysł - zbindowanie zawartości listboxa do jakiejś kolekcji umożliwiającej reakcję na dodanie elementu.
Wykonanie:
public Form1()
{
InitializeComponent();
BindingList<string> bindlist = new BindingList<string>();
bindlist.ListChanged += new ListChangedEventHandler(bindlist_ListChanged);
listBox1.DataSource = bindlist;
bindlist.Add("kiepskie rozwiązanie, sed rozwiązanie"); // dodajemy do listy a nie do listbox.Items... :( (w przeciwnym wypadku otrzymamy niemiły wyjątek)
}
void bindlist_ListChanged(object sender, ListChangedEventArgs e)
{
MessageBox.Show("ala ma kota");
}
Cóż, i tak jest lepiej niż tworzenie klasy dziedziczącej z ListBoxa. Być może jeszcze znajdzie się ktoś mający pomysł na lepsze rozwiązanie... Jeśli nie to mam nadzieje że moje ci pomoże.
os_alfa, Microsoft proponuje napisanie klasy Listy dziedziczącej po ListBoxie: http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx ale w tym przypadku to niepotrzebne jak masz tylko jedną listę. MSM'a porada chyba najlepsza.
Nie umiem sobie wyobrazić do czego miałoby takie zdarzenie się przydać. Przecież elementy dodaje programista w kodzie, programista ma pełną nad tym kontrolę, więc programista wie, kiedy coś zostało dodane i programista może zrobić coś innego przy okazji. Po co tutaj zdarzenie?
Serdecznie dziękuje MSM za pomoc, nie mogę niestety przyznawać punktów, ale należałby Ci się;). Wiem, że takie elementy dodaje programista w kodzie, ale pomyślałem że skoro jest tyle różnych dziwnych zdarzeń to może i jest coś związanego z tym, bo to ułatwiłoby mi nieco życie. Nie zaciemniałbym sobie kodu i nie musiał o tym pamiętać. Zrobiłem ostatecznie to ,,ręcznie''. Dziękuje wszystkim za zainteresowanie;P.