vbnet viewtree - Pomoc   zodpovězená otázka

VB.NET

Ahoj

Mám jeden program, který je téměř hotový

Ale mě napadlo udělat takovou změnu.

Pro ti, co mi chtějí pomoct to budou mít obtížné.

mám listview, ve kterém mám Jméno a Třída

Dim soubor As New IO.StreamReader(_Cesta2)
        While Not soubor.EndOfStream
            Dim jmeno As String = soubor.ReadLine
            Dim trida As String = soubor.ReadLine
            Dim polozka As New ListViewItem

            polozka.Text = jmeno
            polozka.SubItems.Add(trida)
            ListView1.Items.Add(polozka)

        End While

        soubor.Close()
        RadioButton1.Select()
        RadioButton3.Select()

Tohle je kód, který čte z txt databáze a ukládá do listview

Jak jste si už všimli v txt je

jmeno

trida

jmeno

trida

A co bych potřeboval.

Listview přeměnit na viewtree. Proč? Protože ve škole je přes 300 žáků a lépe se v viewtree vyhledává jméno

Potřeboval bych to takhle (obrázek) http://prntscr.com/1kj3ja

Aby se z txt souboru načetli jména a podle abecedy se zařadili tam, kam patří

Vím, že si říkáte, že po vás chci moc, ale s viewtree pracuji poprvé.

Naoplátku přidám do programu label s odkazem sem, slibuji

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

Vytvořte třeba takhle dvě třídy. Do třídy Zak budete načítat jednotlivé žáky s jejich třídou z té txt databáze (jenom upravíte ten Váš cyklus, aby při každém průchodu instancoval jednoho žáka a uložil ho někam do Listu).

Class Zak
	Public Property Jmeno() As String
		Get
			Return m_Jmeno
		End Get
		Set
			m_Jmeno = Value
		End Set
	End Property
	Private m_Jmeno As String
	Public Property NazevTridy() As String
		Get
			Return m_NazevTridy
		End Get
		Set
			m_NazevTridy = Value
		End Set
	End Property
	Private m_NazevTridy As String
End Class

Potom vytvořte třídu Trida, ktera bude obsahovat jeji nazev a enumeraci zaku.

Class Trida
	Public Property Nazev() As String
		Get
			Return m_Nazev
		End Get
		Set
			m_Nazev = Value
		End Set
	End Property
	Private m_Nazev As String
	Public Property Zaci() As IEnumerable(Of Zak)
		Get
			Return m_Zaci
		End Get
		Set
			m_Zaci = Value
		End Set
	End Property
	Private m_Zaci As IEnumerable(Of Zak)
End Class

Ty žáky načtené z txt souboru si ukládejte do nějakého List<Zak>. Na tento List potom udělejte jednoduchý LINQ dotaz (udělal jsem ho na testovacích datech):

Dim zaci = New Zak(5) {New Zak() With { _
	Key .Jmeno = "Petr Vomacka", _
	Key .NazevTridy = "A" _
}, New Zak() With { _
	Key .Jmeno = "Franta Patocka", _
	Key .NazevTridy = "A" _
}, New Zak() With { _
	Key .Jmeno = "Lenka Mala", _
	Key .NazevTridy = "B" _
}, New Zak() With { _
	Key .Jmeno = "Jarmila Velka", _
	Key .NazevTridy = "C" _
}, New Zak() With { _
	Key .Jmeno = "Jakub Vysoky", _
	Key .NazevTridy = "A" _
}, New Zak() With { _
	Key .Jmeno = "Honza Dlouhan", _
	Key .NazevTridy = "C" _
}}

Dim tridy = (From trida In From zak In zaciGroup zak By zak.NazevTridyNew Trida() With { _
	Key .Nazev = trida.Key, _
	Key .Zaci = trida _
}).ToList()

V proměnné tridy teď budete mít jednotlivé třídy s jejich názvem a enumeraci všech žáků, kteří do ni patří. Procházet to potom můžete třeba takto:

For Each trida As var In tridy
	For Each zak As var In trida.Zaci
		Console.WriteLine("{0} : {1}", zak.Jmeno, zak.NazevTridy)
	Next
Next

Tu proměnnou třída už potom můžete nasázet do toho viewtree.

PS. konvertoval jsem to přes online konvertor ze C#, tak snad to půjde normálně zkompilovat.

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

Ještě jste to chtěl seřadit vzestupně podle abecedy, takže ten LINQ by vypadal takhle:

Dim tridy = (From trida In From zak In zaciGroup zak By zak.NazevTridyOrder By trida.Key AscendingNew Trida() With { _
	Key .Nazev = trida.Key, _
	Key .Zaci = trida _
}).ToList()
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jů, tak toho je docela dost nového.

Ještě nemám takové zkušenosti.

Prosím, zkus vytvořit ty program z těch kódu, který si napsal a pošli to v raru.

Takhle to lépe pochopím.

Protože tohle je taky pro mě novinka

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

Nakonec ten konvertor byl dost tragický (nebo byla chyba ve mně?). Takže jsem to musel přepsat ručně. Tady je to v projektu.

http://leteckaposta.cz/150795943

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

Tomuhle fakt nerozumi, otatni tak nejak chapu

'Tuhle část si ve svém projektu nahraďte načítáním z toho txt souboru a jednotlivé žáky dejte do instancí třídy Zak, kdyby jste fakt nevěděl, tak ještě

'napište, snad bych to mohl napsat

Dim zaci() As Zak =
            {
                New Zak() With {.Jmeno = "Franta Kratky", .NazevTridy = "A"},
                New Zak() With {.Jmeno = "Pavel Dlouhy", .NazevTridy = "A"},
                New Zak() With {.Jmeno = "Ludmila Vysoka", .NazevTridy = "B"},
                New Zak() With {.Jmeno = "Pepa Maly", .NazevTridy = "C"},
                New Zak() With {.Jmeno = "Lenka Akorat", .NazevTridy = "B"},
                New Zak() With {.Jmeno = "Zuzana Malinka", .NazevTridy = "A"}
                }

Já jsem načítal takhle z toho souboru

listview, ve kterém mám Jméno a Třída

soubor As New IO.StreamReader(_Cesta2)
        While Not soubor.EndOfStream
            Dim jmeno As String = soubor.ReadLine
            Dim trida As String = soubor.ReadLine
            Dim polozka As New ListViewItem
 
            polozka.Text = jmeno
            polozka.SubItems.Add(trida)
            ListView1.Items.Add(polozka)
 
        End While
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pardon za chyby ktere jsem pravopisne napsal, litala kolem me vosa a tak jsem vynechal par pismen :D

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

Nahraďte Vaše načítání tímhle:

        Dim zaci As New List(Of Zak)

        Dim soubor As New System.IO.StreamReader(_Cesta2)
        While Not soubor.EndOfStream
            zaci.Add(New Zak() With {.Jmeno = soubor.ReadLine(), .NazevTridy = soubor.ReadLine()})
        End While

Pokud bude vše v pořádku a nic dalšího potřebovat nebudete, nezapomeňte to označit jako odpověď, aby se tím nemusel zabývat někdo další.

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

Prosím pošli mi skype, nebo icq, uděláme to přes něj.

Výsledek sem napíšeme :)

Já jsem na skypu luky.ch

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

Já to za Vás ale dělat celé nebudu (i když jsem to už vlastně udělal). To, co jsem Vám poslal by mělo stačit pro řešení celého problému, stačí to tam nakopírovat. Jestli něco nejde, tak napište co, nebo kde to hází chybu.

Pokud tomu nerozumíte jako celku, tak doporučuji začít základy, nejlépe nějakým zdejším seriálem o programování.

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

Vše ostatní jsem doupravil.

Nemůžu to spustit, kvůli jednomu problému

For Each item As listviewitem In
            listView1.Selecteditem

            If item.Selected = True Then
                Label1.Text = item.SubItems(0).Text
                Label2.Text = item.SubItems(1).Text
            End If
        Next

Potřebuji tohle předělat a nevím jak na to

To je snad poslední problém

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

Co to má dělat, na čem to háže chybu a jakou? Pokud tahle část nejde, tak ji zakomentujte a zkuste to spustit bez toho.

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

Když jsem měl listview1, tak to dělalo to, že když jsem klikl na jméno v listview, tak se mi jméno, které jsem označil zobrazilo v label1 (jméno) a v label2 (třídu)

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

zakomentoval jsem to a funguje, ale asi jste mě trošku špatně pochopil

Nechtěl jsem, aby se to řadilo podle tříd, ale podle jmen

http://prntscr.com/1kj3ja

seřadit jména podle abecedy

A

--Adélka IO2

--Aneta IO2

B

--Barbora HT1

--Bohuslav IN3

C

--Cecil HT4

A když označím třeba --cecil HT4 tak do labelu1 se napíše jméno (cecil) a do labelu2 Třída (HT4)

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

Ano, na ten obrázek jsem kouknul jen letmo. Nicméně počítejte s tím, že se Vám v té databázi nesmí objevovat žádné jméno dvakrát stejně, jinak by to způsobilo kolizi. Ten upravený kód pošlu za chvíli, teď nemám moc času.

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

Ono by se to řadilo né podle jména ale podle příjmení, bude to jistější :)

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

Jenom změníte ten dotaz na tento:

        Dim tridy As Trida() = (From zak In zaci
                                      Group zak By key = zak.Jmeno(0) Into Group
                                      Order By key Ascending
                                      Select New Trida() With {.Nazev = key, .Zaci = Group}).ToArray()

Hodilo by se v tomto případě taky změnit název třídy a proměnných, aby to víc odpovídalo tomu, co to teď dělý, ale to už si zvolte jak chcete. Nicméně doufám, že to jen nějaký hobby/školní projekt, protože jinak je to vážně špatně řešené. Nemůžete se u databáze spoléhat na to, že "příjmení bude jistější".

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

Ano, takhle jsem si to představoval.

Poslední 2 malé věci

For Each item As listviewitem In
            listView1.Selecteditem
 
            If item.Selected = True Then
                Label1.Text = item.SubItems(0).Text
                Label2.Text = item.SubItems(1).Text
            End If
        Next

Když jsem měl listview1, tak to dělalo to, že když jsem klikl na jméno v listview, tak se mi jméno, které jsem označil zobrazilo v label1 (jméno) a v label2 (třídu). TO bych potřeboal změnit na treeview

2.

Aby se zobrazilo vedle těch jmén třída v treeview

A to už bude doopravdy všechno, pracuji s treeview poprvé :)

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

Je tam přidaná událost na ten treeview, která Vám pak zobrazí jméno a třídu nakliklého žáka.

http://leteckaposta.cz/566551490

Znovu ale říkám, že tohle řešení je pouze nouzové a může sloužit tak maximálně pro nějaké osobní využití, protože je to náchylné na spousty chyb. Pro Vaše účely by to ale mělo stačit.

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

Co tím myslíte "nouzové a náchylný"? Je to do školy program, kde je celkem cca 300 žáků

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

No myslím tím to, že celý ten návrh je trochu podivný. Zkrátka ta databáze by měla obsahovat i nějaký sloupec v ID, ideálně při tomhle počtu záznamu být třeba ve formátu XML. Načítání by se pak dalo lépe ošetřit a data lépe udržovat.

Například si vemte, jak byste teď řešit změnu jména, nebo třídy jednoho žáka. Musel byste to procházet v tom načteném poli a celé to pak znova ukládat = neefektivní. V XML byste si našel konkrétní záznam a upravil mu pouze jeho atributy.

Vůbec tam vlastně není ošetření pro vstup z té txt databáze, ale pokud jste si jistý, že opravdu bude obsahovat validní data (na každém řádku student se třídou), tak to v takovémhle případě snad ani nevadí.

Pokud budete chtít do budoucna přidávat další funkce, bude to obtížnější a bude s tím čím dál tím víc práce. Proto doporučuji, pokud máte v plánu s aplikací dále pracovat, abyste se zaměřil na správný OOP návrh a radši si ji přepsal.

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

Ano, vím že je to trošku podivné, ale ono to tolik na tom nezáleží.

S databází zatím moc neumím a tak jsem začal s txt.

Nemá mě kdo učit a tady z toho webu jsem dosáhl jen základů, ale tak pokročile tady nedosáhnu.

Mám o to velký zájem, knížku si nemohu dovolit (mám jen knížku visual basic 6).

Na webu jsou buď pro úplné začátečníky, nebo už jsou tam odborné kódy.

Byl bych rád, kdyby mě někdo po kouskách učil, trávil třeba 30 minut studování atd.

Musím prostě někoho vyhledat

Jinak moc děkuji za vše, jsi vážně talent a nevím, jak to označit jako za vyřešené. :D nový web :D

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

Já se přiznám, že zdejší články jsem moc nečetl, ale určitě tu je o XML, takže ten bych doporučil. Třeba Vám to nebude jasné hned na první přečtení, ale podruhé, nebo potřetí už na tom budete líp. Do toho si vyhledávejte nějaké praktické ukázky kódu a zkuste si pak tu svoji txt databázi předělat do XML.

Dost se tím naučíte a bude se Vám to hodit.

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

Hm pokusím se.

Jenom ještě malá drobnost, zapomněl jsem tam dát kód pro řazení podle abecedy

Dim tridy = (From trida In From zak In zaciGroup '''__zak__''' By zak.NazevTridyOrder By trida.Key AscendingNew Trida() With { _
    Key .Nazev = trida.Key, _
    Key .Zaci = trida _
}).ToList()

TO co je silně podtržená hází chybu

')' expected

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

Nevím teď, co máte na mysli, protože to, co jsem posílal já řazení podle abecedy mělo. Pokud Vám to háže ')' expected, tak Vám někde chybí ukončená závorka. Někde v oblasti podtržení ji budete muset najít :-).

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

Mě se to neřadí podle abecedy, viz http://prntscr.com/1kwbha

A když jsem tam přidal ten kód, který jste mi poslal viz nahoře, tak to dopadlo takto

http://prntscr.com/1kwc8x

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

Já jsem totiž podle abecedy třídil pouze ty písmena, na která začínají jednotlivá jména. Pokud chcete, aby se třídily i jména v jednotlivých písmenech, tak to nahraďte tímto:

        Dim tridy As Trida() = (From zak In zaci
                                      Group zak By key = zak.Jmeno(0) Into Group
                                      Order By key Ascending
                                      Select New Trida() With {.Nazev = key, .Zaci = Group.OrderBy(Function(x) x.Jmeno).ToArray()}).ToArray()
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak, teď je vše hotové, díky :), ale nwm jak mám tenhle theader označit jako za vyřešené :D

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

Jenom ještě malá drobnost http://prntscr.com/1kwm1m

Začáteční Příjmení s háčkem (č, ř,..) jsou dole.

Nedalo by je dát třeba č pod c?

aby to bylo

a

b

c

č

d

ď

...

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

To byste si nejspíš musel napsal vlastní komparátor, který by implementoval rozhraní IComparer a to si myslím, že je momentálně nad Vaše schopnosti.

Na příklady se můžete podívat tady:

http://msdn.microsoft.com/en-us/library/...

Potom ten komparátor předáte jako další parametr do metody:

Group.OrderBy(Function(x) x.Jmeno, Váš komparátor)

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

No.. tak to jsem v háji, na tohle nemám :((, ale potřeboval bych to :(

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

Pomůžeš mi s tím prosím? To snad bude poslední věc

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

Co to tu proboha řešíte, string samozřejmě když se neuvede jinak tak při řazení respektuje nastavenou culcure tj. pokud je česká tak řadí správně c, č, d...

Problém je v tom, že ve výše uvedeném linq dotazu ze stringu vyrábíte char a ten řadí jinak.

Takže by mělo stačit dotaz změnit na:

Dim tridy As Trida() = (From zak In zaci
Group zak By key = CStr(zak.Jmeno(0)) Into Group
Order By key Ascending
Select New Trida() With {.Nazev = key, .Zaci = Group.OrderBy(Function(x) x.Jmeno).ToArray()}).ToArray()

(nemám celý VB projekt abych to odzkoušel ale myslím si že je to takhle mělo stačit)

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

jop funguje bezvadně, děkuji.

Chci se jenom zeptat, nechtěl by jste mě někdo učit?

Stačí 15 minut denně :(

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

No vidíte, úplně jsem zapomněl, že z toho vlastně beru jen ten char. To bude tou divnou syntaxí Visual Basicu :-).

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