Witam,
jestem nowy, więc proszę o wyrozumiałość.
Podczas tworzenia aplikacji w nowym środowisku, jakim jest dla mnie C#, natknąłem się na następujące problemy...
PROBLEM 1:
Tworzenie intuicyjnie zachowujących się pól do wpisywania wartości walutowych (currency). Na początku zastosowałem zwykłego TextBoxa, jednak kontrola wpisanych na niego znaków mijała się z celem. Kolejnym pomysłem było wykorzystanie MaskedTextBoxa, z odpowiednią maską, ale i tutaj pojawił się problem, a mianowicie, zachowanie się wprowadzanego tekstu(strasznie nieintuicyjne, tekst wprowadza się od pozycji umieszczenia kursora, ani '.', ani ',' nie powoduje przejścia do wartości dziesiętnych – zastosowana maska to np. 99 999.99, wyr. do prawej). Ostatnim moim pomysłem było przechwycenie zdarzeń KeyDown i KeyPress (wcześniej TextChange) dla kontrolki(do czego znalazłem gotowe rozwiązanie w necie), co prawda zachowanie kontrolek się zmieniło ale to jeszcze nie to na co liczyłem. W środowisku w którym pracuję (CA Visual-Objects), załatwiał za mnie ten problem mechanizm tzw. FIELDSPEC'ÓW.
Przykład kodu:
Metoda zdarzenia KeyDown:
private void tbMaxAmount_KeyDown(object sender, KeyEventArgs e)
{
int KeyCode = e.KeyValue;
if (! IsNum(KeyCode))
{
e.Handled = true;
return;
}
else
{
e.Handled = true;
}
if (((KeyCode == 8) || (KeyCode == 46)) && (str.Length > 0))
{
str = str.Substring(0, str.Length - 1);
}
else if (!((KeyCode == 8) || (KeyCode == 46)))
{
str = str + Convert.ToChar(KeyCode);
}
if (str.Length == 0)
{
tbMaxAmount.Text = "";
}
if (str.Length == 1)
{
tbMaxAmount.Text = "0.0" + str;
}
else if (str.Length == 2)
{
tbMaxAmount.Text = "0." + str;
}
else if (str.Length > 2)
{
tbMaxAmount.Text = str.Substring(0, str.Length - 2) + "." +
str.Substring(str.Length - 2);
}
}</span>
Metoda zdarzenia KeyPress:
private void tbMaxAmount_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
Metoda zdarzenia IsNum:
public static bool IsNum(int Val)
{
// 8 - TAB, 46 - .
return ((Val >= 48 && Val <= 57) || (Val == 8) || (Val == 46));
}
Czy ktoś z was, ma bardziej eleganckie i lepiej(bardziej intuicyjnie) działające rozwiązanie tego problemu? Jeżeli tak, to będę bardzo wdzięczny za jakąś podpowiedź.
PROBLEM 2:
Przesłanianie metod przodka. Stworzyłem sobie kasę dziedziczącą po MaskedTextBox, o nazwie MyMaskedTextBox. Moim celem było to, by kontrolki tej klasy, przy zdarzeniu wejścia na nie Focusa zmieniały kolor na konkretny, a po wyjściu Focusa powracały do domyślnego. Dodam jeszcze, że chciałem zrobić to w ten sposób, by nie pisać do 100 kontrolek tego samego kodu dla ww. zdarzeń. Klasa wygląda tak:
class MyMaskedTextBox : MaskedTextBox
{
protected new void Enter(object sender, EventArgs e)
{
BackColor = Color.LightSkyBlue;
}
protected new void Leave(object sender, EventArgs e)
{
BackColor = Color.White;
}
}</span>
Zamiast modyfikatora 'new' próbowałem stosować 'override', jednak kompilator zgłaszał mi błąd “Error 1 'Test.TestClasses.MyMaskedTextBox.Leave(object, System.EventArgs)': cannot override because 'System.Windows.Forms.Control.Leave' is not a function”
Pozornie wszystko wygląda ok, ale kontrolki mojej klasy wcale nie zachowują się jak by się wydawało(tzn. Nie zmieniają koloru).
Proszę o pomoc i wyrozumiałość, Pozdrawiam.