[ bigguy @ 20.11.2008. 18:40 ] @
Imali neko ideju kako da formatiram TextBox tako da u njega mogu da se ukucavaju samo slova i space, a da je sve ostalo zabranjeno. Takodje, interesuje me da li bi bilo moguce, i kako, da se automatski bez obzira da li su slova ukucana mala ili velika, na izlazu iz TextBoxa dobije uvek ista forma stringa gde je pocetno slovo veliko i slovo koje se nalazi nakon space. Npr, ukucam "MiLAn miSKoviC", a na izlazu kada se taj string upisuje u bazu da e automatski konvertuje u string oblika "Milan Miskovic". Malo je zapetljano, ali se nadam da sam bar delimicno uspeo da objasnim sta mi tacno treba :)
[ deerbeer @ 21.11.2008. 00:18 ] @
Napravis dve odvojene nasledjene klase :
1,) Jedna za formatiranje obicnog teksta i ne-brojeva npr. (FormatStringTextBox )
2.) Jedna za formatiranje imena i malih i velikih slova npr. (FormatNameTextBox )
i za svaku overajdujes OnTextChanged ili OnKeyPress koji se poziva pre samog ispisa u TextBox
Code:

class FormatStringTextBox : TextBox 
 {
      
   protected override void OnTextChanged (EventArgs e)
   {
      base.OnTextChanged (e);
   }
   protected override void OnKeyPress(KeyPressEventArgs e)
   {
       // base.OnKeyPress(e); ili handlujes dalje na OntextChanged znaci ispis se tamo zavrsava 
        //e.Handled = true; ili odustajes od ispisa u text box tj. ne poziva se OnTextChanged 
   }
}
class FormatNameTextBox : TextBox 
{
    protected override void OnTextChanged (EventArgs e)
    {
        //// 
    }
   protected override void OnKeyPress(KeyPressEventArgs e)
   {
       // base.OnKeyPress(e); 
        //    e.Handled = true; 
   }
}
[ Igor Gajic @ 21.11.2008. 08:25 ] @

A mozes samo da obradis KeyPress event u "obicnom" text box-u, tako da prihvata samo odredjene karaktere.

Code:

       void tb_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsLetter(e.KeyChar) || char.IsWhiteSpace(e.KeyChar))) 
                e.Handled = true;
        }


[ bigguy @ 21.11.2008. 08:54 ] @
Hvala svima, ali DeerBeer tvoj predlog mi je malo zbunjujuci, dok mi je Igorov dosta prijenciv i lako primenjiv. Ali Igore imasli neku slicnu ideju kako bi mogao realizovati na slican nacin onaj problem oko velikih slova na pocetku unosa i kod unosa nakon space?
[ sallle @ 21.11.2008. 12:45 ] @
prilikom unosa u bazu, odradis sledece:
- string.Split tog stringa
-za svaki string u dobijenom nizu, string[0] = Char.ToUpper(string[0])
-ponovo od toga generesise string i upises ga
ili
mozes da nadjes indexe karaktera " " unutar stringa, i onda karaktere iza da kapsujes...
ili
Prilikom handlovanja novog karaktera, gledas da li se postojeci text u textboxu zavrsava na " " ili je prazan. ako jeste, kapsujes taj novi karakter
ili
regularni izrazi

[ bigguy @ 22.11.2008. 15:28 ] @
Mozeli jos malo objasnjenje oko dela koji se odnosi konkretno na:
"
mozes da nadjes indexe karaktera " " unutar stringa, i onda karaktere iza da kapsujes...
ili
Prilikom handlovanja novog karaktera, gledas da li se postojeci text u textboxu zavrsava na " " ili je prazan. ako jeste, kapsujes taj novi karakter
ili
regularni izrazi
"
Ne razumem sta znaci "kapsujes"?

Sada sam probao prvi nacin, sa metodom .Split(), koji mi je delovao prijemciv, ali na kraju sam se zakucao jer on meni podeli pocetni string(recenicu) na delove(reci) iskljucujuci space , ali mi zato dalje ne dozvoljava da reci podelim na slova, jer se metoda .Split() odnosi na separatore, a koji bi separator mogao koristiti u reci? Cak i kad bi mi dozvolio podelu reci na slova nisam bas siguran kako bih uspeo da slova tacno po redu posle vratim u recenicu?!

Ako postoji resenje za ovu podelu vrlo rado bih ga koristio, jer mi je najprihvatljivija iz prostog razloga jer ove druge predloge bas i nisam u celosti skontao

[Ovu poruku je menjao bigguy dana 22.11.2008. u 20:03 GMT+1]

[Ovu poruku je menjao bigguy dana 22.11.2008. u 20:09 GMT+1]
[ Igor Gajic @ 22.11.2008. 20:54 ] @
Najprostije:

Code:


        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            StringBuilder text = new StringBuilder(((TextBox)sender).Text);
            for (int i = 1; i < text.Length; i++)
                if (char.IsWhiteSpace(text[i - 1])) text[i] = char.ToUpper(text[i]);

            ((TextBox)sender).Text = text.ToString();
            ((TextBox)sender).SelectionStart = ((TextBox)sender).Text.Length;
        }


Daleko od najefikasnijeg ali dobro obradjuje Copy-Paste situacije.

S obzirom da ti korisnici nece pisati "Rat i Mir" u textbox-u, nema veze sto uvek obradjuje ceo string.
[ sallle @ 23.11.2008. 01:48 ] @
sto se ovog resenja tice:

1. ne kapsuje se prvo slovo. treba dodati
Code:
(if (text.Length>0) text[0] = char.ToUpper(text[0]);


2. ovako odokativno imam utisak da ce uleti u infinite loop
Code:
 ((TextBox)sender).Text = text.ToString();
ce svaki put da digne event
[ sallle @ 23.11.2008. 02:03 ] @
@bigguy

kapsovanje mi znaci da od malo slovo pretvorim u veliko : a->A

sto se verzije sa splitom tice:
Code:

string [] nizReci  = textbox1.Text.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries);
string rezString=String.Empty; //rezultat
foreach (string str in nizReci)
{
   rezString+=char.ToUpper(str[0])+str.Substring(1,str.Length-1))+' ';
}
return rezString.Trim();

ako ces u textboxu pisati rat i mir, za rezString koristi StringBuilder klasu
[ Igor Gajic @ 23.11.2008. 06:26 ] @
Citat:



2. ovako odokativno imam utisak da ce uleti u infinite loop




Ne nece. Provereno.
[ bigguy @ 23.11.2008. 16:53 ] @
Momci ovo super radi :) Hvala.
Ali kako da sada ogranicim da u stringu izmedju dve reci mogu da imam samo jedan space, odnosno, da mogu da pisem "Marko Markovic", a da ne mogu da pisem "Marko Markovic"?
[ sallle @ 24.11.2008. 09:07 ] @
ako koristis onaj gore algoritam sto sam ti napisao (sa split), on ce odsece sve suvisne spejsove. a ako ne koristis mozes u nekoj petlji da zoves
Code:

while(true)
{
if (str.IndexOf("  ")>-1)//ako imamo 2 spejsa
str= str.Replace(" ","  ");//zameni 2 spejsa sa jednim
else
break;
}