Zdarzenie zmiany zawartości listbox

0

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ć;/.

0

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ą...

1

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...

0

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);
0

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?

2

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.

1

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.

0

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?

0

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.

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