Odebírání z kolekce   zodpovězená otázka

Architektura, .NET

Dobrý den,

chtěl bych se zeptat jakým způsobem mohu odebírat z kolekce typu List of xxxx, když je tato kolekce uložena jako datasource listboxu.

Pokud odeberu objekt:

   kolekce.remove(listbox.selecteditem)

kolekce se změní, ale listbox se nepřekreslí. Resp. v něm je vydět i vymazaná položka. Když pak kliknu na jinou tak se vyvolá vyjímka: Chybí hodnota pro index 1.

Jak se správně zachází s kolekcemi (add, remove), které jsou datasource ovl. prvku?

Děkuji za odpověď

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak se mrkněte třeba přes msgbox, co vám listbox.selecteditem vrací. Podle mě něco jiného, než požaduje parametr funkce kolekce.remove()..., že?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nevyjadřujte se k něčemu, o čem víte prd. Kód M. P. je samozřejmě zcela korektní a metodě Remove předává přesně to, co metoda očekává (jen by se mohlo provést přetypování na konkrétní typ).

K problému samotnému: Kdysi dávno jsem toto řešil a dospěl jsem k tomu, že kolekce, kterou chcete databindovat musí mít implementované rozhraní INotifyněco (skutečně už si nepamatuju), což generická kolekce List(Of T) nemá. Pomocí tohoto rozhraní je pak upozorněn ovládací prvek, že v datech došlo ke změně a automaticky se změní jeho obsah.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi máte na mysli INotifyCollectionChanged.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Přesně tak, v .NETu by měla být kolekce ObservableCollection. I když nejsem si jistý, jestli není v nějaké assembly z WPF.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ve 3.x je to v System.Collections.ObjectModel.ObservableCollection(Of T) a skutečně je to součást WPF (nutné přidat referenci na WindowsBase).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpovědi

Přesto mi ani toto nějak nefunguje.

Udělal jsem jednoduchý test:

Imports System.Collections.ObjectModel

Public Class Form1

    Private colString As New ObservableCollection(Of String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.colString = New ObservableCollection(Of String)

        With Me.colString
            .Add("Test1")
            .Add("Test2")
            .Add("Test3")
        End With

        Me.ListBox1.DataSource = Me.colString

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If ListBox1.SelectedIndex < 0 Then Exit Sub

        Me.colString.Remove(DirectCast(Me.ListBox1.SelectedItem, String))

    End Sub

End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

((CurrencyManager)listBox1.BindingContext[listBox1.DataSource]).Refresh();

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji za odpověď

Tohle funguje i s List (Of ..).

Právě nějaký refresh jsem (neúspěšně) hledal.

Nicméně by mě zajímalo jak je to s tou ObservableCollection(of ?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback