ListBox w nowym wątku

0

Ostatnio miałem problem z dodwaniem elementów do ListBox-u. Odbywała się to dodatkowym wątku, więć standardowe polecenie ListBox1.Items.Add(...) dawało błąd:

Nieprawidłowa operacja między wątkami: do formantu 'listBox' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.

popowiedź dostałem od mykhaylo aby skorzystać z metody Invoke(). Zadziałało :)

Nie wiem tylko, jak czyścic ListBoxy. Dostaje nadal powyższy komunikat. Jak usunąć wszystkie elemety z ListBoxu?

0
k_i_d napisał(a)

Jak usunąć wszystkie elemety z ListBoxu?

Analogicznie.

0

ListBox.Items.Clear()

0
s_k napisał(a)

Analogicznie.

Tak też pomyślałem - ale nie miałem do czynienia z delegatami. Pomoc będzie przydatna ;-)

private Delegate addDelegate, clearDelegate;

public ParentForm()
        {
            InitializeComponent();
            ...
            addDelegate = new AddListItem(AddItemToListBox);
            clearDelegate = new   /* ??? co tutaj ??? */
        }

        private void AddItemToListBox(String item)
        {
            listBox.Items.Add(item);
        }

        // tu pewnie powinna pojawić się metoda

0
private delegate void AddListItem(String item);
private delegate void ClearList();
public partial class ParentForm : Form
{
private Delegate addDelegate;
private Delegate clearDelegate;
public ParentForm()
        {
            InitializeComponent();
            ...
            addDelegate = new AddListItem(AddItemToListBox);
            clearDelegate = new ClearList();
        }

        private void AddItemToListBox(String item)
        {
            listBox.Items.Add(item);
        }

        private void ClearList()
        {
            listBox.Items.Clear();
        }

Może coś gdzieś przekręciłem http://4programmers.net/Forum/viewtopic.php?id=147824&start=0 <- korzystałem z tego ;)

0

Ja używam delegacji w ten sposób, przez co z zewnątrz klasy nawet tego nie widać:

delegate void VoidSetter();
delegate void IntSetter(int i);
delegate void DoubleSetter(double d);

private void SetLiczba1(int i){
  //operacja na formie np. 
  label3.Text = i.ToString();
}

//to wywołuje użytkownik
public int Liczba1{
    set{
        this.Invoke(new IntSetter(SetLiczba1), new object[]{value});
    }
}

//i przykład z Clear
private void SetClearList(){
  //operacja na formie np. 
  listBox.Items.Clear();
}

//to wywołuje użytkownik
public int ClearList(){
        this.Invoke(new VoidSetter(SetClearList), new object[]{});
}

No a użytkownik robi tylko coś takiego:

From f1 = //cośtam

f1.Liczba1 = 4; //działa nawet w innym wątku
f1.ClearList(); //to też dziala w innym wątku
0

dzięki hubert twoja metoda podołałą zadaniu :-)

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