hanest Skrevet 23. juli 2004 Del Skrevet 23. juli 2004 Tekstboksen heter txtBareTall For å skrive inn bare tall er det enklest å bruke 2 hendelser (event) De er KeyDown og KeyPress KeyPress intreffer etter KeyDown, så du kan bruke KeyPress for å hindre uønskede tegn i tekstboksen. 'Denne varibelen skal vise om de er et tall eller ikke Private bErIkkeEtTall As Boolean = False Private Sub txtBareTall_KeyDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles txtBareTall.KeyDown bErIkkeEtTall = False Select Case e.KeyCode Case Keys.D0 To Keys.D9, Keys.NumPad0 To Keys.NumPad9, Keys.Back bErIkkeEtTall = False Case Else bErIkkeEtTall = True End Select End Sub Private Sub txtBareTall_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles txtBareTall.KeyPress e.Handled = bErIkkeEtTall End Sub Keys.D0 To Keys.D9 er de vanlige nummertastene. Keys.NumPad0 To Keys.NumPad9 er tallene på det numeriske tastaturet. Keys.Back er BackSpace eller Tilbake. Ved å sette e.Handled = bErIkkeEtTall gir vi beskjed om det skal skrivest inn et tegn eller ikke. Så lenge denne er True vil det ikke bli skrevet noe. Lenke til kommentar
aadnk Skrevet 23. juli 2004 Del Skrevet 23. juli 2004 Bra guide, men det er likevel ett problem med denne koden: du kan fremdeles lime inn bokstaver fra utklippstavlen. Siden jeg er nybegynner på VB.NET, så har jeg ingen løsninger på problemet, men i vb6 kunne du bruke API kallet SetWindowsLong for å gjøre tekstboksen Numeric only. Lenke til kommentar
hanest Skrevet 23. juli 2004 Forfatter Del Skrevet 23. juli 2004 OK, her er SetWindowLong. Det har ingen invirkning på hva som blir hentet inn fra utklippstavlen. Private Const GWL_STYLE = (-16) Private Const ES_NUMBER = &H2000 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _ ByVal hwnd As IntPtr, ByVal nIndex As Integer) As Integer Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _ ByVal hwnd As IntPtr, ByVal nIndex As Integer, _ ByVal dwNewLong As Integer) As Integer Private Sub frmBareTall_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load Dim iFormat As Integer Dim iNummerFormat As Integer iFormat = GetWindowLong(txtBareTall.Handle, GWL_STYLE) iNummerFormat = SetWindowLong(txtBareTall.Handle, GWL_STYLE, iFormat Or ES_NUMBER) End Sub Det enkleste er å behandle data fra utklipstavlen er ved hjelp av TextChanged, å bare erstatte ikke numerisk data med tom tekst. Private Sub txtBareTall_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles txtBareTall.TextChanged Dim iTeller As Integer Dim sTegn As String For iTeller = 1 To (txtBareTall.TextLength - 1) sTegn = Mid$(txtBareTall.Text, iTeller, 1) If Not IsNumeric(sTegn) Then txtBareTall.Text = Replace(txtBareTall.Text, sTegn, "") txtBareTall.SelectionStart = txtBareTall.TextLength End If Next End Sub Det blir ikke bra, den beste løsninga er å lage din egen tekstboks, der du har egen hurtigmeny som sjekker data på utklippstavlen ved innliming. Lenke til kommentar
GeirGrusom Skrevet 25. juli 2007 Del Skrevet 25. juli 2007 Du kan bruke en i KeyDown som heter SupressKey eller noe slikt, og man kan bruke Char.IsNumeric istedet for select case. Lenke til kommentar
aadnk Skrevet 25. juli 2007 Del Skrevet 25. juli 2007 Eller man kan overskrive skapelsesparametrene til tekstboksens underliggende vindu: Public Class NumericTextBox Inherits TextBox Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.Style = cp.Style Or 8192 ' ES_NUMBER Return cp End Get End Property End Class Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå