NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: Sečtení sloupce v listView

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Matyáš Černohous:20.8.2013 15:47

Zdravím, chtěl bych se zeptat jak by se dali sečíst hodnoty ve sloupci v listView. Mám listView se 3 sloupci a potřebuji sečíst ten poslední a vypsat do textboxu. Zkoušel jsem tohle:

int sum = 0;
foreach (ListViewItem li in listView1.Items)
  sum += int.Parse(li.Subitems[2].Text);

Ale nešlape to.
Díky za rady

 
Odpovědět
20.8.2013 15:47
Avatar
Odpovídá na Matyáš Černohous
Luboš Běhounek Satik:20.8.2013 16:06

Specifikuj blíže výraz "nešlape to" - nic to nedělá, padá to, nejde to zkompilovat? :)

Nahoru Odpovědět
20.8.2013 16:06
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Matyáš Černohous:20.8.2013 17:41

Zkompilovat to jde, ale když zmáčknu na button abych dostal ten součet, tak to hodí hlášku: Vstupní řetězec nemá správný formát. Mám ListView propojený s Db a datovýtyp toho sloupce je integer, tak nevím co tam je špatný formát...

 
Nahoru Odpovědět
20.8.2013 17:41
Avatar
Odpovídá na Matyáš Černohous
Luboš Běhounek Satik:20.8.2013 18:38

v

li.Subitems[2].Text

Máš něco, co asi není číslo.
Používáš celá nebo desetinná čísla?

Nahoru Odpovědět
20.8.2013 18:38
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Matyáš Černohous
Luboš Běhounek Satik:20.8.2013 19:28

Tak tam nemáš číslo.
Zkus si na ten řádek dát breakpoint (ve VS defaultně klávesou F9) a až se ti to tam zastaví na tom řádku, tak se koukni na obsah toho Textu.

Nahoru Odpovědět
20.8.2013 19:28
https://www.facebook.com/peasantsandcastles/
Avatar
Jakub Lásko[Saarix]:21.8.2013 11:10

Možná by nebylo špatné zkusit u toho sloupce 2 použít metodu GetType, aby jsis potvrdil správnost typu.

Nahoru Odpovědět
21.8.2013 11:10
Časem je vše možné.
Avatar
Odpovídá na Jakub Lásko[Saarix]
Matyáš Černohous:21.8.2013 12:59

A mohl bys mi prosím poradit jak to použít ? Ještě nikdy jsem to nepoužíval.

 
Nahoru Odpovědět
21.8.2013 12:59
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Matyáš Černohous
Jan Vargovský:21.8.2013 13:01

Debugoval jsi to jak ti řekl Satik ? Když si ten program na tom místě zastavíš, zjistíš kompletně co to je za typ, jestli tam nejsou nějaké špatné znaky atd...

 
Nahoru Odpovědět
21.8.2013 13:01
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Jan Vargovský
matesax:21.8.2013 16:14

Možná pro něj bude jednodušší MessageBox, když se jedná o string...

 
Nahoru Odpovědět
21.8.2013 16:14
Avatar
Odpovídá na Matyáš Černohous
Neaktivní uživatel:21.8.2013 19:00

Zkus tohle:

                int sum = 0;
                int x = 0;
                foreach (ListViewItem li in listView1.Items)
                {
                    if (int.TryParse(li.SubItems[2].Text.Trim(), out x))
                        sum += x;
                    else
                        MessageBox.Show(li.SubItems[2].Text.Trim());
                }
MessageBox.Show(sum);

Pro všechny neparsovatelný stringy v danym sloupci ti to hodí msgbox, kde se ti ukáže, čim vlastně ten sum chceš plnit (a na konci vyhodí sumu)

Editováno 21.8.2013 19:00
Nahoru Odpovědět
21.8.2013 19:00
Neaktivní uživatelský účet
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
matesax:21.8.2013 19:50

TryParse, out? Proč ne try catch?

for(int index = 0; index < listView1.Items.Count; index++)
    try
    {
        sum += int.Parse(listView1.Items[index].Text);
    }
    catch(FormatException e)
    {
        MessageBox.Show(e.Message + ", in " + listView1.Items[index].Text);
    }

Jinak geniální názvy...

 
Nahoru Odpovědět
21.8.2013 19:50
Avatar
Odpovídá na matesax
Neaktivní uživatel:21.8.2013 21:23

u názvů vycházim z toho, co tam má (u testování označení x nepovažuju za problém - přednější je objevit, kde je chyba). To co si psal, nepude (respektive vyhodí exception vždy) - v tomhle případě sou důležitý subitemy (jedno okýnko v tabulce), ne itemy (jeden řádek).

Jinak proč jo/ne TryParse/try catch? Máš skoro jedno + takle víš jestli ti to sečetlo aspoň něco (+ nováček bude spíš znát tryparse než try catch - i když bude házet msgbox při každym průběhu cyklem, tak kompilátor de stejně stopnout...).

Nahoru Odpovědět
21.8.2013 21:23
Neaktivní uživatelský účet
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
matesax:21.8.2013 21:31

Nechápeš OOP. Musíš dodržovat pojmenovávání OOP v C#... (TextBox.Text, ListViewItems­.Items[index]­.Text, ddd.ToString, ddd.ddd.ToString, ...) Názvy by se měly opakovat - tedy ve všech bodech Frameworku, které řeší obdobný problém najdeš vždy stejné pojmenování - liší se jen objekt, ve kterém se nachází...

Větvení je neřád. V tom TryParse je try blok, ale udělá největší prasárnu - out a výsledek převede do bool - pak se musí větvit. Když dáš try{parse}, nevětvíš, neoutuješ a navíc si můžeš odchytit libovolnou zprávu... catch(výjimka)

Editováno 21.8.2013 21:35
 
Nahoru Odpovědět
21.8.2013 21:31
Avatar
matesax
Tvůrce
Avatar
matesax:21.8.2013 21:36

A chyba:

ListView.Item­s[index].Text

 
Nahoru Odpovědět
21.8.2013 21:36
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:21.8.2013 21:55

V TryParse uvnitř interně žádný try-catch blok není a v případě nečíselného vstupu chyby je rychlejší o několik řádů.

Nahoru Odpovědět
21.8.2013 21:55
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na matesax
Neaktivní uživatel:21.8.2013 22:05

možná nerozumim OOP (psal sem to akorát proto, že není jasné, zda si matesak poradil s debugováním), ale ty asi nerozumíš listViewu (listView.Item­s[index].SubI­tems[2].Text)

Editováno 21.8.2013 22:06
Nahoru Odpovědět
21.8.2013 22:05
Neaktivní uživatelský účet
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
matesax:21.8.2013 22:15

Což mi může být šumafuk - když to v životě nebudu potřebovat... (Moc nepoužívám Formy - natož jeho Controly...)

Editováno 21.8.2013 22:16
 
Nahoru Odpovědět
21.8.2013 22:15
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na matesax
Jan Vargovský:21.8.2013 22:58

Raději použiju tryparse než zbytečný try-catch block, který zpomaluje tisickrát více program. Jak bys to vyřešil, kdyby to tam nebylo ? Každý si myslí, že vyřeší vyhození exception jen pomocí try-catch... Ale jaký dopad to má na výkon už nikdo neřeší...

 
Nahoru Odpovědět
21.8.2013 22:58
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Jan Vargovský:21.8.2013 23:04

Ještě doplňím, jednu moudrou hlášku, kterou mi dal kolega. Vždycky se dívej na ten program tak, jako bys ho měl denně používat. Věř mi, že kdybys měl vadné data a skákal by ti tam denně 500x textbox, že by ten program brzy letěl do koše :)

 
Nahoru Odpovědět
21.8.2013 23:04
Avatar
Luboš Běhounek Satik:21.8.2013 23:06

Já hlavně pořád nechápu, co mají všichni proti ref/out, přehlednost kódu to nijak nesnižuje, protože je to vidět v hlavičce metody i v kódu při jejím volání (té funkce).

I když to také skoro nepoužívám, tak si dovedu představit situace, kdy se to dá využít a hlavně při práci s nativníma knihovnama se bez toho člověk často neobejde, protože tam je tenhle přístup běžný.

Nahoru Odpovědět
21.8.2013 23:06
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Neaktivní uživatel
Matyáš Černohous:22.8.2013 1:20

Vidím že se tu to tady pořádně rozjelo.... zkusil jsem ten kód a jsem zmatenější víc než na začátku. V messageBoxu se objevila správná hodnota, ale už se to neobjevilo v textboxu. Viz: http://www.2i.cz/7a7785af7c
Jinak s tím debugováním jsem si moc neporozuměl :D

Editováno 22.8.2013 1:21
 
Nahoru Odpovědět
22.8.2013 1:20
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Jan Vargovský
matesax:22.8.2013 6:42

OOP také zpomaluje. Tady nejde o rychlost... V C# jde o správnost OOP návrhu, přehledný nezaujatý kód atd. Try blok je rozhodně lepší, než větvení. Tedy v místě, jako je toto - kde k pádu dojde výjimečně...

 
Nahoru Odpovědět
22.8.2013 6:42
Avatar
Odpovídá na Matyáš Černohous
Neaktivní uživatel:22.8.2013 7:47

Dáváš to do správnýho textboxu (zkontroluj/zko­píruj název - vstup by ten textbox měl mít ok)?

nejakyTextBoX.Text = sum.ToString();
Nahoru Odpovědět
22.8.2013 7:47
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Matyáš Černohous:22.8.2013 13:25

Tak už to funguje, měl jsem tam jen špatnej textBox.
Díky

 
Nahoru Odpovědět
22.8.2013 13:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.