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.
Tvůrce
Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Specifikuj blíže výraz "nešlape to" - nic to nedělá, padá to, nejde to zkompilovat?
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...
v
li.Subitems[2].Text
Máš něco, co asi není číslo.
Používáš celá nebo desetinná čísla?
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.
Možná by nebylo špatné zkusit u toho sloupce 2 použít metodu GetType, aby jsis potvrdil správnost typu.
A mohl bys mi prosím poradit jak to použít ? Ještě nikdy jsem to nepoužíval.
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...
Možná pro něj bude jednodušší MessageBox, když se jedná o string...
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)
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...
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...).
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)
V TryParse uvnitř interně žádný try-catch blok není a v případě nečíselného vstupu chyby je rychlejší o několik řádů.
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.Items[index].SubItems[2].Text)
Což mi může být šumafuk - když to v životě nebudu potřebovat... (Moc nepoužívám Formy - natož jeho Controly...)
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ší...
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
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ý.
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
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ě...
Dáváš to do správnýho textboxu (zkontroluj/zkopíruj název - vstup by ten textbox měl mít ok)?
nejakyTextBoX.Text = sum.ToString();
Tak už to funguje, měl jsem tam jen špatnej textBox.
Díky
Zobrazeno 25 zpráv z 25.