Avatar
Matyáš Černohous (Matesak):

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  -2 20.8.2013 15:47
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Luboš Běhounek (Satik):

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
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Matyáš Černohous (Matesak):

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 (Matesak)
Luboš Běhounek (Satik):

v

li.Subitems[2].Text

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

Nahoru Odpovědět  +1 20.8.2013 18:38
:)
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Luboš Běhounek (Satik):

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  +2 20.8.2013 19:28
:)
Avatar
Jakub Lásko[Saarix]:

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 (Matesak):

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ý
Redaktor
Avatar
Odpovídá na Matyáš Černohous (Matesak)
Jan Vargovský:

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
Redaktor
Avatar
Odpovídá na Jan Vargovský
matesax:

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

 
Nahoru Odpovědět 21.8.2013 16:14
Avatar
hanse
Člen
Avatar
Odpovídá na Matyáš Černohous (Matesak)
hanse:

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
Avatar
matesax
Redaktor
Avatar
Odpovídá na hanse
matesax:

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
hanse
Člen
Avatar
Odpovídá na matesax
hanse:

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
Avatar
matesax
Redaktor
Avatar
Odpovídá na hanse
matesax:

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  ±0 21.8.2013 21:31
Avatar
matesax
Redaktor
Avatar
matesax:

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):

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
:)
Avatar
hanse
Člen
Avatar
Odpovídá na matesax
hanse:

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
Avatar
matesax
Redaktor
Avatar
Odpovídá na hanse
matesax:

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  -1 21.8.2013 22:15
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na matesax
Jan Vargovský:

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ý
Redaktor
Avatar
Odpovídá na Jan Vargovský
Jan Vargovský:

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):

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  +1 21.8.2013 23:06
:)
Avatar
Odpovídá na hanse
Matyáš Černohous (Matesak):

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
Redaktor
Avatar
Odpovídá na Jan Vargovský
matesax:

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  ±0 22.8.2013 6:42
Avatar
hanse
Člen
Avatar
Odpovídá na Matyáš Černohous (Matesak)
hanse:

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
Avatar
Odpovídá na hanse
Matyáš Černohous (Matesak):

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.