VB2008 - TextBox.TextChanged a převod na integer   zodpovězená otázka

VB.NET

Dobrý večer, měl bych dotaz:

mám 2 textboxy do kterých zapisuji vstup v číselné hodnotě, při události TextChanged měním 3 textbox jako násobky prvních dvou.

Pokud použiji button a událost click, tak je vše v pořádku, ale pokud použiji události TextChanged, tak mi to hlásí chybu:

conversion on string ' (asi prázdný řetězec), to type integer.

Vypadá to jako kdyby to bralo pořád jako string, zkusil jsem to přetypovat, ev. dosadit před spuštěním debugu čísla, ale pořád mi to nejde.

Nejde mi do hlavy, proč to na button funguje a na textchanged obou polí jen když jde o sloučení

textbox3.text=textbox1.text & textbox2.text

Díky za tip.

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

Podle mne je jediný problém v samotné události textbox.textchanged. Protože ta je volána po každé změně v textboxu. Předpokládám tedy, že při spuštění programu máte oba vstupní textboxy prázdné. Jenža jakmile začnete zadávat do textbox1 prvního činitele (třeba "2"), ihned po zadání první číslice je vyvolána událost a vy se snažíte vynásobit "2" * prázdný řetězec (která je zatím v textboxu2). Pokud provádíte slučování, není žádný problém (sloučením řetězce "2" a prázdného řetězce dostanete regulérně řetězec "2"), ale pokud chcete matematicky násobit, řetězce násobit nelze, musí proběhnout konverze na číslo (v tomto případě na int) a je jedno, jestli tuto konverzi provádíte Vy, nebo sám program, ale zkonvertovat prázdný řetězec na číslo nelze-proto to vyhodí chybu.

(v případě verze s Buttonem jste zřejmě mačkal až ve chvíli, kdy jste měl vyplněné oba činitele).

Kdysi jsem si něco podobného dělal a z nedostatku času jsem to vyřešil jednoduše - zachycením případné chyby, čímž jsem ošetřil i například nechtěné vložení písmena místo číslice. Vypadalo to asi takto:

 Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged
        Try
            Label1.Text = (TextBox1.Text * TextBox2.Text).ToString

        Catch ex As Exception
            Label1.Text = "vstupem musí být čísla"
        End Try
    End Sub

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

Díky za tip...

Prázdným řetězcem to bohužel není, hrál jsem si s tím asi 3 hodiny a vyzkoušel jsem i to nastavit defaultně předem hodnoty, jedině, že by se to chovalo jinak když je defaultně 2 a bralo by to jako řetězec, ale i tak jsem to zkusil konvertovat do integru a pořád stejná chyba.

Co se týká button, tak při defaultně zadané hodnotě 2 do obou polí to funguje.

Zkusím to Try ...

uvidím co to bude dělat.

Zatím díky...

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

Visual Basic má krásnou funkci Val, která převádí text na číslo a pokud se to nepovede, vrátí nulu. To je asi to, co potřebujete.

Label1.Text = Val(TextBox1.Text) * Val(TextBox2.Text)

Jinak upozorňuji, že tato funkce je přežitek z VB6. Správně by se mělo použít Integer.TryParse.

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

Díky funkce Val opravdu pomohla, nicméně funkce integer.tryparse bohužel ne, jaksi nefunguje při defaultním vstupu, kdy jsou již hodnoty zadány...

Také jsem měl problém s desetinnou čárkou, resp. s tečkou, vyřešil jsem to takto, myslíte, že je to správné řešení?

TextBox_nasobek.Text = Val(TextBox_sirka.Text.Replace(",", ".")) * Val(TextBox_vyska.Text.Replace(",", ".")) 

Diky

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

Nezapomínejte prosím označovat odpovědi. Napomůžete tak přehlednosti diskuzních fór.

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

Zkoušel sjem doporučenou funkci (přece se učíme, tak proč začínat s pohrobky starých systémů ;-)) a mně to tryparse funguje k plné spokojenosti. Jenom trochu nerozumím Vašemu textu : integer.tryparse nefungovala,... ... a dále jsem měl potíže s desetinnou čárkou. Přece integer žádnou desetinnou čárku nezná. Zkusil jsem si jednoduchý příklad a tam to funguje (včetně desetinné čárky):

 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged
  Dim cislo1, cislo2 As Single

  If Not (Single.TryParse(TextBox1.Text, cislo1) And _
          Single.TryParse(TextBox2.Text, cislo2)) Then
            Label2.Text = "Chyba zadání"
  Else
      Label2.Text = "OK"
  End If
  Label1.Text = cislo1 * cislo2

End Sub

Ten "složitý" rozhodovací výraz IF tam, samozřejmě, vůbec nemusí být, ale pokud mi to Tryparse umožňuje, proč bych uživatele neupozornil na skutečnost, že nula ve výsledku není správná nula, ale někde má blbé zadání.

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

Zdravím,

už jsem díky Vám přišel na to proč mi to nefungovalo, já hloupý jsem použil typ integer, takže tam čárka ani fungovat nemohla :)

Po zadání single už to jde. Správně tedy Single.TryParse(...

Díky

PS: označení, že je otázka zodpovězena, bych rád udělal, ale nikde se mi nezobrazuje nějaká volba a jsem přihlášen.

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