Problem z polami walutowymi i przesłanianiem metod (C#)

0

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.

0
private void textBoxPremium_Leave(object sender, EventArgs e) 
{ 
  if (textBoxPremium.Text != "") 
    try 
    { 
      textBoxPremium.Text = Convert.ToDecimal(textBoxPremium.Text.Replace("$", "").Replace(",", "")).ToString("c"); 
    } 
    catch 
    { 
      MessageBox.Show("Invalid Amount"); 
      textBoxPremium.Focus(); 
    } 
}

gotowy textbox http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=4523&lngWId=10

i jeszcze inny przykład http://www.c-sharpcorner.com/UploadFile/mgold/MaskedCurrencyTextBox08142005135643PM/MaskedCurrencyTextBox.aspx?ArticleID=3dc8ca4b-7166-4851-ab40-a2150c5ca787

a co do drugiego to może to Ci rozjaśni

        //
        // Summary:
        //     Occurs when the control is entered.
        [System.Windows.Forms.SRDescription("ControlOnEnterDescr")]
        [System.Windows.Forms.SRCategory("CatFocus")]
        public event EventHandler Enter;

oraz

        //
        // Summary:
        //     Raises the System.Windows.Forms.Control.Enter event.
        //
        // Parameters:
        //   e:
        //     An System.EventArgs that contains the event data.
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        protected virtual void OnEnter(EventArgs e);

musisz poczytać sobie jak to jest zorganizowane

0

Dziękuję za pomoc, nie omieszkam zaraz wykorzystać nowo nabytych wiadomości! :-)

Odnośnie problemu 2, to co napisałeś rozjaśniło mi w głowie i już wszystko działa. Jeszcze raz dziękuję!

Teraz popróbuję podłączyć tego gotowego TextBoxa i zobaczę jak to wyjdzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1