Poradie prvku v kolekcii VB 2008   zodpovězená otázka

VB.NET

Zdravim

Prosim Vas ako zistim poradie prvku v kolekcii vo VB 2008? pretoze IndexOf nefunguje.

dik za odpoved.

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

IndexOf samozřejmě funguje, akorát ho patrně používáte špatně. Pošlete sem kód, kterým se snažíte zjistit pořadí, určitě najdeme, kde je problém.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Kolekcia As New Collection 'Deklarované v module
Dim fff As String = ListBox1.SelectedItem
Dim index As Integer = Kolekcia.IndexOf(fff)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jestli to chápu správně, tak vy si vytvoříte novou kolekci (která je na začátku prázdná). Pak si z ListBoxu vytáhnete aktuální položku do proměnné fff, a pak tu hodnotu hledáte v té nové kolekci, která je prázdná.

Poslal jste sem celý kód? Nevím, co je v kolekci Kolekcia, v kódu ji nikde neplníte žádnými daty. Pokud tam hodnota fff není, pak IndexOf vrátí -1. Pokud tam je, vrátí její index. Čeho přesně chcete dosáhnout?

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

sorry, celý kód vyzerá asi takto..

       Dim INIPole() As String = {"a", "b", "c", "d", "e", "f"}
       Dim Kolekcia As New Collection  'Deklarované v module
       Dim Hodnota As String

       '..Naplnenie premennej HracStrana

       For cislo As Integer = 1 To 6
            If INIPole(cislo - 1) = HracStrana Then
            Else
                Kolekcia.Add(INIPole(cislo - 1))
            End If
       Next


       Dim PocetPrvkov As Integer = Kolekcia.Count

       For cislo As Integer = 1 To PocetPrvkov
            ListBox1.Items.Add(Kolekcia(cislo))
       Next

       Dim fff As String = ListBox1.SelectedItem
       Dim index As Integer = Kolekcia.IndexOf(fff)

Mám počiatočné hodnoty v poli, prefiltrujem ich a uložím do kolekcie, obsah kolekcie uložím do listboxu. Prebehne udalosť, zistím čo bolo označené.

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

Tak to je jasné, vy to totiž špatně porovnáváte. Do fff si ukládáte SelectedItem, což je ListItem, a porovnáváte to se stringem.

Předposlední řádek změňte na toto:

Dim fff As String = ListBox1.SelectedValue.ToString()
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takhle to tuším funguje v ASP.NET, tam jsou prvky ListBoxu skutečně vždy a jen instance třídy ListItem. Ale v klasické WinForms komponentě může Listbox hostovat libovolný objekt, je to mimo jiné kvůli Object Bindingu přes BindingAdapter, což je celkem hezká věcička. SelectedItem by pak měl být ten objekt. ListBox pak zobrazí vlastnost objektu, kterou má definovanou ve vlastnosti DisplayMember a jako SelectedValue vrací vlastnost, kterou má nastavenou ve vlastnosti ValueMember. Pokud tyto vlastnosti nastavené nejsou, v ListBoxu se zobrazí výsledek volání ToString na daný objekt.

Při způsobu plnění dle zdrojáku jsou uvnitř skladované objekty typu String, tím pádem to hledání v kolekci by mělo být správné. Chybu bych hledal v tom, že aktuálně vybraný prvek v kolekci není (možná se to IndexOf v programu volá ještě před tím, než je kolekce naplněná).

Doporučuji program odkrokovat a před voláním IndexOf se podívat, co je v té kolekci a co v ní hledáte. To je asi nejjednodušší cesta, jak to zjistit.

nahlásit spamnahlásit spam 0 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