Zdravím a prosím o radu. Na formuláři mám textbox sloužící pro zadávání čísla. Chtěl bych, aby se číslo zobrazilo ve formátu 999 999 999,99, nejlépe již v průběhu psaní. Jak se to dá ošetřit, jaké jsou metody (postupy)?
Děkuju
Petr Antoň
Zdravím a prosím o radu. Na formuláři mám textbox sloužící pro zadávání čísla. Chtěl bych, aby se číslo zobrazilo ve formátu 999 999 999,99, nejlépe již v průběhu psaní. Jak se to dá ošetřit, jaké jsou metody (postupy)?
Děkuju
Petr Antoň
Pokud dobře rozumím otázce, tak tu jde jen o doplnění mezer po třech znacích, počítaných od konce. To by nemělo být nijak obtížné. Myslím, že stojí za úvahu, jestli má to přidávání mezer při psaní vůbec smysl. Je to trochu pracnější a některé uživatele by tohle chování mohlo mást.
#5 LukoSS
Ono jde o to, že je to jediný vstup na formuláři, následuje už jen klik na tlačítko a vypsání výsledků. Takže TextBox vůbec nemusí ztratit focus (no, musí, ale to už bude pozdě). A jde o ošetření chyby, přečíst 66666 je horší než 66 666, pak se chyba v řádu udělá velmi lehce. Chtěl bych i ošetřit, když uživatel zadá desetinou čárku jako "." nebo "," . Navíc uživatelé, pro které tohle dělám, jsou na takové chování zvyklí z EIS.
#6 Chatař
Já bych tento problém řešil tak, že bych nejprve zkontroloval, zda ten textBox obsahuje pouze čísla + jednu tečku/čárku. Pak bych vzal část, ve které jsou celá čísla, a tu bych předal metodě, která jim přidá ty mezery. Ta metoda by mohla vypadat nějak takto (parametr charCount je počet znaků, po kterých to má rozdělovat řetězec, takže v tomto případě to bude 3):
private string AddSpaces(string text, int charCount)
{
string textWithSpaces = String.Empty;
int textLength = text.Length;
int firstSpace = textLength % charCount;
int lastSpace = 0;
for (int i = firstSpace; i < textLength; lastSpace = i, i += charCount)
textWithSpaces += text.Substring(lastSpace, i - lastSpace) + ' ';
textWithSpaces += text.Substring(lastSpace);
return textWithSpaces.Trim();
}
Po té úpravě je potřeba nějakým způsobem umístit kurzor na správné místo. Tuto metodu budeš muset volat asi v KeyUp eventu. Tahle metoda neřeší, jestli v textu už mezery jsou nebo ne, ale s tím si určitě poradíš.
To, jestli uživatel zadal tečku nebo čárku můžeš kontrolovat až po stisku toho tlačítka (stačí na tom textu zavolat metodu Replace a nahradit případnou čárku tečkou). Aby se to chovalo jako číslo, tak bude pak samozřejmě nutné odstranit i ty mezery.
No snad jsem tě nakopl správným směrem..
#8 Chatař
Událost KeyUp nastane po puštění klávesy. Pokud to budeš testovat po stisku tečky nebo čárky, tak si velmi usnadníš práci, nicméně je potřeba myslet na to, že se někdo splete a bude pak opravovat to číslo. Pak by se ta metoda nezavolala a bylo by to zformátované špatně. Stejně tak při stisku backspace nebo delete.
Ten problém je složitější než se zdá. Musíš totiž reagovat i na vložení textu přes schránku. A dále ti chvilku bude trvat než uděláš správnou reakci na delete a backspace. Musí to fungovat i v případě, že je kurzor za/před mezerou, tj. aby smazala nejenom mezera, ale i číslo .... No a pak tu máme výběr části textu a opět správná reakce na smazání, vyjmutí, přesunutí, nahrazení .... Ve skutečnosti to vede na něco, čemu se říkalo subclass komponenty. Všechno se dá, jen se to nevzdá bez boje :) .
Zasláno z mobilního telefonu.
#11 liborb
Při vložení textu přes Ctrl+V se zavolá KeyUp, takže se tam ty mezery vloží správně. Samozřejmě pokud se najde někdo, kdo klikne pravým a dá vložit, tak už nastane problém, ale z toho co jsem pochopil, tak se tam ty čísla budou zadávat ručně, takže to není nezbytně nutné řešit. Stejně tak různé úpravy částí textu, tedy kromě toho smazání čísla, pokud je kurzor na mezeře. Hlavně je ale důležité si správně pohlídat pozici kurzoru, protože ho po tom přidání mezer nelze jen vrátit zpátky na původní místo..
Ale souhlasím, že by bylo vhodné vytvořit si svoji komponentu, která bude dědit z TextBoxu. Něco takového se do budoucna může hodit.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku