VB.NET problém s indexy (načítané z XML) u ComboBoxu   zodpovězená otázka

VB.NET, Algoritmy, XML

Přeji hezký večer,

Podařilo se mi po pár hodinách konečně pochopit čtení/zápis z/do XML souboru. Tahám si z něho údaje do Comboboxu. Ale nastal mi problém, když v něm potřebuji najít a předat nějaký údaj a nikde se nemůžu dopídit ani žádného nakopnutí kupředu.

mám soubor family.xml:

<?xml version="1.0" encoding="UTF-8"?>

<plemena>

<plemeno id="100">

<ces>Americky kokrspanel</ces>

<orig>American cocker</orig>

</plemeno>

<plemeno id="101">

<ces>Anglicky kokrspanel</ces>

<orig>English cockerapniel</orig>

</plemeno>

<plemeno id="207">

<ces>Border kolie</ces>

<orig>Border collie</orig>

</plemeno>

</plemena>

Výsledek by měl být (bez těch čísel vepředu):

100 | Americky kokrspanel (American cocker)

101 | Anglicky kokrspanel (English cockerapniel)

207 | Border kolie (Border collie)

Toto ještě problém není, ovšem mám problém, jak určit nad jednotlivýma položkama index, tj. aby Americky kokrspanel měl index 100, Anglicky kokrspanel měl index 101 a Border kolie aby měla index 207.

Tj. když si vyberu z comboboxu třeba Anglicky kokrspanel, diplním další údaje a dám uložit do DB, potřebuji uložit do sloupce IDP hodnotu 101. Ale jak tu hodnotu mám vzít?

Celý den zkouším rlzné pokusy, gůglím a stále nic nenacházím a byl bych vděčý za jakýkoliv nástřel.

Na výpis používám tohle (ale nevytváří to indexy)

Try
Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode

'Create the XML Document
m_xmld = New XmlDocument()

'Load the Xml file
m_xmld.Load("C:\xml\family.xml")

'Get the list of name nodes
m_nodelist = m_xmld.SelectNodes("/plemena/plemeno")

'Loop through the nodes
For Each m_node In m_nodelist
'Get the Gender Attribute Value
Dim id = m_node.Attributes.GetNamedItem("id").Value
'Get the firstName Element Value
Dim ces = m_node.ChildNodes.Item(0).InnerText
'Get the lastName Element Value
Dim orig = m_node.ChildNodes.Item(1).InnerText

'Write Result to the Console
cmbPlemeno.Items.Add(id & " | " & ces & " | " & orig)
Next

Catch errorVariable As Exception
Console.Write(errorVariable.ToString())
End Try

Být nejlepší znamená chybovat, ale jít dál.

- Ernest Hemingway -

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

Dobrý den,

co takhle si vytvořit ještě jeden seznam ve kterém budou indexy z XML?

Do deklarací v rámci formuláře:

Dim IndexList As New Generic.List(Of Integer)

Při přidávání do ComboBoxu bude přidávat i do seznamu indexů aktuální index:

...
cmbPlemeno.Items.Add(id & " | " & ces & " | " & orig)
IndexList.Add(id)
...

A pokud budete pak chtít získat index, jen si ho zjistíte ze seznamu IndexList(číslo řádku z ComboBoxu). Respektive IndexList(cmbPlemeno.SelectedIndex) pro aktuálně vybraný index.

Snad to pomůže.

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

Děkuju za odpověď, vyzkouším to až budu doma (tady v práci nemám VS 2005).

Akorát mi vrtá hlavou a to jsem nikde nemohl a nemůžu najít, co znamená:

Dim IndexList As New Generic.List(Of Integer)

Přesněji spíš, nevím proč to tam je. Deklaruji si novou proměnou IndexList jako nový objekt (a dál už nevím, co je to Generic.List)

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

Pokud máte normální ComboBox, není možné si u něj zapamatovat pro každou položku speciílní údaje. Proto se daným řádkem, kterému nerozumíte, vytvoří objekt List, což je seznam (ne vizuální, jen v paměti). Musí se mu ještě sdělit, jaký datový typ položek bude uchovávat, to je to Of Integer.

Když přidáváte položku do ComboBoxu, musíte její ID přidat metodou Add i do tohoto virtuálního seznamu, jak již napsal kolega v kódu.

ID aktuálně vybrané položky najdete takto:

IndexList(cmbPlemeno.SelectedIndex)

Ten seznam (List) se chová de facto jako pole, ale jeho velikost není předem určena a novou položku můžeme na konec přidat kdykoliv zavoláním metody Add, třeba:

IndexList.Add(mojeID)

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

Díky, takže je to jako ArrayList v Jave :-)

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

Přesně tak. Jde jen o to si někde vedle uchovávat indexy, které získáte při načtení XML. Pak do nich přistupujete jako do pole a načtete si z nich položku která odpovídá pořadovému číslu vybraného záznamu z ComboBoxu.

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

Ano. Ono koneckonců .NET Framework má také ArrayList, který se chová podobně, jako List, akorát že není silně typovaný. To znamená, že u ArrayListu nevíte a většinou vás ani nezajímá, jaký datový typ do něj budete ukládat. Můžete si do něj uložit čísla a objekty zároveň, samozřejmě to je pomalejší. List je naproti tomu typově silný, již v době kompilace programu víte, jaký datový typ bude uchovávat. Tím pádem se mohou provést různé optimalizace a program je výrazně rychlejší. Tento rozdíl je dobré znát, pokud má být seznam pouze na jeden konkrétní datový typ, je lepší použít List.

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