Feedback

C# - TextBox nur mit Zahleneingabe

Veröffentlicht von am 12.02.2012
(8 Bewertungen)
Klasse: ValueBox ; abgeleitet von TextBox, Nur Zahlen zugelassen
/// -------
Diese ValueBox ist eine angepasste TextBox in der man nur Zahlen eingeben kann (incl. MIUNUS- und KOMMA-Zeichen und allen Controls).
Snippet in VB übersetzen
 /// <summary>
    /// Klasse:  ValueBox  ; abgeleitet von TextBox, Nur Zahlen zugelassen
    /// -------
    /// 
    /// Diese ValueBox ist eine angepasste TextBox in der man nur Zahlen eingeben kann (incl. MIUNUS,PLUS- und KOMMA-Zeichen).
    /// 
    /// 
    /// Zwei statische Members:
    /// -----------------------
    /// 1. ValueBox.CreateValueBox(myWindowsForm-Objekt, Location_X, Location_y , myFont , myColor , deltaLänge, deltaHöhe, AnzahlZeichen); 
    ///    Diese Funktion erstellt ein TextBox bzw. ValuBox-Objekt und legt es in der WindowsForm an.
    ///    Die Eigenschaft gibt zusätzlich ein ValueBox-Objekt zurück. (wird ggf. für die 2. Funktion Set_Layout_ValueBox  benötigt)
    ///    
    /// 2. ValueBox.Set_Layout_ValueBox( ValueBox-Objekt , Location_X, Location_y , myFont , myColor ,deltaLänge ,deltaBreite, AnzahlZeichen); 
    ///    Mit dieser Funktion kann man die Eigenschaften eines bestehenden ValueBox-Objekt nachträglich ändern:
    ///    -Position(Location), die Länge, die Höhe, die Schriftart, die Schriftfarbe, die AnzahlDerZeichen
    ///    
    /// 
    /// 3. In der Eigenschaft:  myValueBox.ZAHL  steht die Zahl(double) zur weitern Verwendung zu Verfügung. 
    ///    -------------------------------------------------------------------------------------------------
    ///    
    /// z.B:
    ///     private ValueBox myValueBox;  //bitte Global !!!  
    ///     ....
    ///     z.B in Form1_Load
    ///     myValueBox=ValueBox.CreateValueBox(this , 10 , 100 , textBox1.Font , Color.Black , 0 , 0 , "9999"); //ValueBox anlegen
    ///     ....
    ///     z.B. in einen  button1_Click  oder sonst wo... (Zusatzfunktion)
    ///     ValueBox.Set_Layout_ValueBox(myValueBox , 10 , 200 , (new Font(new FontFamily("Arial"),8,
    ///                                                    FontStyle.Regular, GraphicsUnit.Pixel)) , Color.Red , 0 , 0 , "99999999999");
    ///    
    ///     ....
    ///     doubel wert=myValueBox.ZAHL; // <----- der Inhalt der ValueBox steht hier drin
    ///     
    /// 4. weiter Eigenschaften sind (myValueBox.)
    ///     -MIN und MAX -> Eingabe der Zahl eingrenzen (double)
    ///     -KOMMA       -> ZAHL mit oder ohne Komma     (bool)   
    ///     -AUTO_SIZE   -> die Boxlänge automatisch anhand der MaxLength anpassen  (bool)
    ///     -MIT_MINUS   -> Minuszeichen zugelassen oder nicht  (bool)
    ///     
    /// 
    /// benoetigte USINGS
    /// using System;
    /// using System.Collections.Generic;
    /// using System.Linq;
    /// using System.Text;
    /// using System.Windows.Forms;
    /// using System.Drawing;
    ///
    /// viel Spass
    /// Andy
    /// </summary>
   
    public class ValueBox : TextBox
    {
        #region div. Eigenschaften
        private bool MINUS=false;
        private double dZahl=0;
        private double dmin=0;
        private double dmax=0;
        private int org_width=0;
        private bool mit_komma=true;
        private bool mit_minus=true;
        private bool mit_autosize=false;
        private ValueBoxValues valueBox_Values;

        
        // hier wird der Wert der ValueBox abgelegt
        // Aufruf: myValueBox.ZAHL als double
        [Description("Double-Value of the textbox")]
        public double ZAHL
        {
            get { return dZahl; }
            private set { dZahl=value; }
        }

        
        [Description("Minimum Value of the textbox")]
        public double MIN
        {
            get { return dmin; }
            set { dmin=value; }
        }
        [Description("Maximum Value of the textbox")]
        public double MAX
        {
            get { return dmax; }
            set { dmax=value; }
        }
        [Description("Value with or without comma")]
        public bool KOMMA
        {
            get { return mit_komma; }
            set { mit_komma=value; }
        }
        [Description("Textbox Autosize TRUE or FALSE")]
        public bool AUTO_SIZE
        {
            get { return mit_autosize; }
            set { mit_autosize=value; }
        }
        [Description("With or without minus sign")]
        public bool MIT_MINUS
        {
            get { return mit_minus; }
            set { mit_minus=value; }
        }
       
        #endregion


        // Konstructor...
        
        public ValueBox()
        {
            //this.MaxLength="123456789012".Length;
            this.ZAHL=0;
            this.Text="";
            this.Refresh();
                     
        }

        // -----------------------------------------------------------------------------------------------------------------------------

        #region zwei statische Members - ValueBox.CreateValueBox(....) und  ValueBox.Set_Layout_ValueBox(...)

        /// <summary>
        /// ValueBox  erzeugen und in einer Windows-Form  anlegen
        /// 
        /// </summary>
        /// <param name="f"> Form Formobjekt</param>
        /// <param name="x"> int Location_X</param>
        /// <param name="y"> int Location_y</param>
        /// <param name="myf"> Font (z.B. from anyTexbox.Font)</param>
        /// <param name="myC"> Color (z.B. Color.Black)</param>
        /// <param name="withdx"> int zusatzLaenge zu der ValueBoxLaenge (um die Box zusätzlich zu verlängern)</param>
        /// <param name="heightdx"> int zusatzHoehe zu der ValueBoxHoehe (um die Box zusätzlich zu erhöhen)</param>
        /// <param name="anzZeichen"> int AnzahlZeichen der ValueBox (hiermit wird die Länge der ValueBox festgelegt)</param>
        /// <returns>ein erzeugtes Valueobjekt </returns>
        public static ValueBox CreateValueBox( Form f , int x , int y , Font myf , Color myC , int withdx , int heightdx , string anzZeichen )
        {
            ValueBox myvBox=null;
            try
            {
                myvBox=new ValueBox();

                bool ok=Set_Layout_ValueBox(myvBox , x , y , myf , myC , withdx , heightdx , anzZeichen);
                if(ok==true)
                {
                    f.Controls.Add(myvBox);
                    
                }
                else
                {
                    myvBox=null;
                }
            }
            catch(Exception ex)
            {
                //fehler
                MessageBox.Show("Fehler in Member: CreateValueBox\n\n"+ex.Message);
            }


            return myvBox;
        }


        /// <summary>
        /// Das Layout der ValueBox  festlegen  -  (Location,Länge,Höhe,maxAnzahlZeichen,Font,Color)
        /// </summary>
        /// 
        /// <param name="vb"> ValueBox-object</param>
        /// <param name="x"> int Location_X</param>
        /// <param name="y"> int Location_y</param>
        /// <param name="myf"> Font (z.B. from anyTexbox.Font)</param>
        /// <param name="myC"> Color (z.B. Color.Black)</param>
        /// <param name="withdx"> int zusatzLaenge zu der ValueBoxLaenge</param>
        /// <param name="heightdx"> int zusatzHoehe zu der ValueBoxHoehe</param>
        /// <param name="anzZeichen"> int AnzahlZeichen der ValueBox (hiermit wird die Länge der ValueBox festgelegt)</param>
        /// <returns>bool  true/false </returns>
        public static bool Set_Layout_ValueBox( ValueBox vb , int x , int y , Font myf , Color myC , int withdx , int heightdx , string anzZeichen )
        {
            bool ok=true;
            try
            {
                Graphics g = vb.CreateGraphics();

                SizeF mySsingle=(g.MeasureString(anzZeichen , myf)).ToSize();
                mySsingle.Width+=withdx+6;

                mySsingle.Height+=heightdx;
                int xa=0 , ya=1;

                //textbox innerhalb des panels
                vb.Location=new Point(xa , ya);
                vb.Font=myf;
                vb.ForeColor=myC;
                vb.Size=mySsingle.ToSize();
                vb.MaxLength=anzZeichen.Length;
                vb.Location=new Point(x , y);
                vb.ZAHL=0;
                vb.Text="";
                vb.Refresh();
               

            }
            catch(Exception ex)
            {
                //fehler
                MessageBox.Show("Fehler in Funktion: Set_Layout_ValueBox\n"+ex.Message);
                ok=false;
            }

            return ok;
        }

        #endregion


        // -----------------------------------------------------------------------------------------------------------------------------


        // privates


        #region div. private Members...
        // TextBoxMemeber OnKeyPress überschreiben, um die nur Zahlen,Minuszeichen,Kommar und Conrtollsteuerzeichen auszufiltern !!!
        protected override void OnKeyPress( KeyPressEventArgs e )
        {
            try
            {
                // wenn dezimalpunkt dann in komma !!!
                if(e.KeyChar=='.')
                    e.KeyChar=',';


                if(e.KeyChar=='-' && MIT_MINUS==true) // minus eingegeben
                {

                    if(Anzahl_EinesZeichens_ImText(this.Text , '-') == 0)
                    {
                        MINUS=false;
                    }

                    if(MINUS==false)
                    {
                        this.Text=this.Text.Insert(0 , "-");
                        MINUS=true;
                        this.Select(this.Text.Length , 0);

                    }

                    if(Anzahl_EinesZeichens_ImText(this.Text , '-') >1)
                    {
                        e.Handled = true;
                    }

                }

                if(e.KeyChar=='+') // bei eingabe des pluszeichen evt. das minuszeichen wieder rausnehmen
                {

                    if(MINUS==true && this.Text[0]=='-')
                    {
                        this.Text=this.Text.Remove(0 , 1);  // minuszeichen wieder rausnehmen
                        this.Select(this.Text.Length , 0);
                        MINUS=false;  // und MINUS-Flag zuruecksetzen, um das MINUS-Zeichen erneut setzen zu koennen
                    }
                    e.Handled = true;
                    return;

                }

                //pruefen, ob mehr als ein komma eingegeben wurde

                if(e.KeyChar==',' && KOMMA==true) // komma eingegeben
                {

                    if(Anzahl_EinesZeichens_ImText(this.Text+e.KeyChar , ',') >1)
                    {
                        e.Handled = true;
                    }

                }


                // pruefen auf -> zahl , control-steuerzeichen oder ein komma 
                if(KOMMA==true)
                {
                    if((!char.IsDigit(e.KeyChar) &&  !char.IsControl(e.KeyChar)) && !(e.KeyChar==','))
                        e.Handled = true; // wenn nein, dann eingabe ignorieren 
                }
                else
                {
                    if((!char.IsDigit(e.KeyChar) &&  !char.IsControl(e.KeyChar)) )
                        e.Handled = true; // wenn nein, dann eingabe ignorieren 
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Fehler in Member ValueBox.OnKeyPress\n\n"+ex.Message);
            }
        }


        // TextBoxMemeber OnLeave überschreiben, um die Eigenschaft "ZAHL" zu füllen
        // in der Eigenschaft "ZAHL" steht der innhalt der ValueBox !!!!!!!!!!!!!!!!
        // Die Eigenschaften MIN und MAX werden nur abgefragt, wenn eine von beiden nicht NULL ist.
        // (sprich: wenn beide auf NULL gestzt sind wird nicht abgefragt)
        protected override void OnLeave( EventArgs e ) 
        {

           

            try
            {
                if(!(this.Text=="" ||  this.Text.Length<=0))
                {
                    ZAHL=Convert.ToDouble(this.Text);

                    if(!(dmin==0 && dmax==0))
                    {
                        //MessageBox.Show(MIN.ToString()+" "+MAX.ToString());
                        if(ZAHL<MIN)
                        {
                            MessageBox.Show(ZAHL.ToString()+" < "+MIN.ToString()+"(MIN)");
                            this.Focus();

                        }
                        if(ZAHL>MAX)
                        {
                            MessageBox.Show(ZAHL.ToString()+" > "+MAX.ToString()+"(MAX)");
                            this.Focus();
                        }
                    }
                }
                else
                {
                    ZAHL=0;
                    this.Text="";
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Fehler in Member ValueBox.OnLeave\n\nZAHL auf Null gesetzt\n"+ex.Message);
                ZAHL=0;
            }

            base.OnLeave(e);            
        }

        // TextBoxMemeber OnENTER überschreiben, um bei AUTOSIZE=TRUE die Textbox-Grössen automatisch anzupassen !!!
        protected override void OnEnter( EventArgs e )
        {
           
            
                if(AUTO_SIZE==true)
                {
                   if(this.MaxLength<=50)
                   {
                    StringBuilder s=new StringBuilder();
                    for(int i=0 ; i<this.MaxLength ; i++)
                        s.Append("0");
                    Set_Layout_ValueBox(this , this.Location.X , this.Location.Y , this.Font , this.ForeColor , 0 , 0 , s.ToString());
                    AUTO_SIZE=false;
                   }
                   //else
                   //    MessageBox.Show("NO AUTOZICE avalible!  maxLenght("+this.MaxLength+") > 50");
                }

                base.OnEnter(e);
        }

        // TextBoxMemeber OnKeyDown überschreiben, bei Enter -  eingabe beenden - simuliert TAB-Taste
        protected override void OnKeyDown( KeyEventArgs e )
        {
            if(e.KeyCode==Keys.Enter)
            {
                SendKeys.Send("{TAB}");
                e.Handled = true;
            }

            base.OnKeyDown(e);
        }

        // Anzahl eines Zeichens im Text ermitteln
        private int Anzahl_EinesZeichens_ImText( string text , char zeichen )
        {
            int z=0;
            foreach(char s in text)
            {
                if(s==zeichen)
                    z++;

            }

            return z;
        }
        #endregion

    }

    
Abgelegt unter textbox, zahleneingabe, roters, TextBox.

5 Kommentare zum Snippet

Fawk_18 schrieb am 14.02.2012:
Ich würde hier einfach eine normale TextBox nehmen und einen RegEx-Code implementieren (ich glaube es gibt sogar eine RegExTextBox). Dann ersparst du dir viel Code und die Validierung ist bei RegEx viel schneller.

Lg Fawk_18
Martin Dauskardt schrieb am 14.02.2012:
http://www.dotnet-snippets.de/dns/numtextbox-kurzversion-SID1444.aspx
A,Roters schrieb am 14.02.2012:
Bestimmt richtig !
Aber viele Wege führen nach Rom.
mfg.
Martin Dauskardt schrieb am 14.02.2012:
Nun ja, wenn man den Anspruch hat einen möglichst langen und beschwerlichen Umweg zu gehen. dann ist dein Weg nach Rom sicherlich der richtige :-) MaD
Martin Dauskardt schrieb am 14.02.2012:
Nun ja, wenn man den Anspruch hat einen möglichst langen und beschwerlichen Umweg zu gehen. dann ist dein Weg nach Rom sicherlich der richtige :-) MaD
 

Logge dich ein, um hier zu kommentieren!