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).
GFU-Schulungen  [Anzeige]

JavaScript für .NET-Entwickler

Sie sind .NET-Entwickler und nun stehen Sie vor der Aufgabe, JavaScript in Ihre Arbeit einzubinden. Die Schulung vermittelt Ihnen die JavaScript Grundlagen und die Funktionen der Scriptsprache. Sie wissen, wie objektorientierte Programmierung in JavaScript funktioniert und lernen abschließend Best Practicies Fälle kennen.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

 /// <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!