Vb.net Sayısal Bir Textboxa "string" Değer Girilmemesi

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Selamun aleykum arkadaşlar hep vb.netde textboxlarla ilgili soruyorum çünkü programımın büyük çoğunluluğu bitti bu textbox hataları kaldı.

Sorunum şu nakit diye bir textboxım var veri tabanımdada bu nakitin veri tipi "float" fakat benim buraya string bir değer girdiğim zaman msj vermesi lazım nasıl yapabilirim ?
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,607
Reaksiyon puanı
144
Puanları
243
Alfabetik karakterleri girdirme sen de :) Aşağıdaki kodu C# ile yazdım ama VB.Net 'e çevirmekte zorlanacağını zannetmiyorum. Bu kodu TextBox'ın KeyPress eventine yazacaksın:

PHP:
if ((e.KeyChar >= '0' && e.KeyChar <= '9') || e.KeyChar == (char)Keys.Back)
    e.Handled = false;
else
{
    if (e.KeyChar == '.' && textBox1.Text.IndexOf('.') == -1)
        e.Handled = false;
    else
        e.Handled = true;
}
 

rainman4009

Asistan
Katılım
24 Şubat 2010
Mesajlar
250
Reaksiyon puanı
5
Puanları
18
bence bir function ile bir alfabe dizisi yapsan krakter krakter kontrol ettirebilirsin...

bununla ilgili php örneği verim


Function kodtemizle($text)
{
$gkod = array("","<",">","");
$dkod = array("","","","");

$ykod = str_replace($gkod,$dkod,$text);
return $ykod;
}

php str_replace var bu işi yapan ama c# tam hakim olmadığım için sana bulmaya çalışayım...


ama N3CAT arkadaşımın mantığı ile de yapabilirsi ... klavyden her girilen kod asci karakterleri ile sorgulatabilirsin ...
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Tamam tşekrler denedikten sonra haber vericem :)
 

Uso!

Doçent
Katılım
10 Ağustos 2010
Mesajlar
947
Reaksiyon puanı
27
Puanları
18
NumericUpDown ile de yapabilirsiniz sanırım, onda decimal özelliği de olacaktı yanlış hatırlamıyorsam.
 

Uso!

Doçent
Katılım
10 Ağustos 2010
Mesajlar
947
Reaksiyon puanı
27
Puanları
18
Zaten o yüzden diyorum ya, decimals kullanarak para birimi girişine benzetebilirsiniz. :)

numeric.png


Gene de TextBox kullanarak yapacaksanız, şöyle basit bir çözüm de kullanabilirsiniz:

Kod:
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        If Not IsNumeric(TextBox1.Text) And TextBox1.Text <> "" Then
            MsgBox("Lütfen geçerli bir para birimi giriniz!")
            TextBox1.Text = ""
            TextBox1.Focus()
        End If
    End Sub

IsNumeric hazır fonksiyonu ayıraç olarak "." ve "," kullanır ve sadece sayısal değerlerden oluşan bir değeri kontrol etmek için kullanılabilir.
 

magnet

Asistan
Katılım
17 Eylül 2005
Mesajlar
499
Reaksiyon puanı
5
Puanları
18
Zaten o yüzden diyorum ya, decimals kullanarak para birimi girişine benzetebilirsiniz. :)

numeric.png


Gene de TextBox kullanarak yapacaksanız, şöyle basit bir çözüm de kullanabilirsiniz:

Kod:
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        If Not IsNumeric(TextBox1.Text) And TextBox1.Text <> "" Then
            MsgBox("Lütfen geçerli bir para birimi giriniz!")
            TextBox1.Text = ""
            TextBox1.Focus()
        End If
    End Sub
IsNumeric hazır fonksiyonu ayıraç olarak "." ve "," kullanır ve sadece sayısal değerlerden oluşan bir değeri kontrol etmek için kullanılabilir.



@Uso! ağzımdan aldın :thumbup1: =) kısacası isnumeric sayısal değer olup olmama durumunu kontrol eden bir fonksiyon. Boolen değer döndürür. yani sonucu True veya False tur.
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Zaten o yüzden diyorum ya, decimals kullanarak para birimi girişine benzetebilirsiniz. :)

numeric.png


Gene de TextBox kullanarak yapacaksanız, şöyle basit bir çözüm de kullanabilirsiniz:

Kod:
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        If Not IsNumeric(TextBox1.Text) And TextBox1.Text <> "" Then
            MsgBox("Lütfen geçerli bir para birimi giriniz!")
            TextBox1.Text = ""
            TextBox1.Focus()
        End If
    End Sub

IsNumeric hazır fonksiyonu ayıraç olarak "." ve "," kullanır ve sadece sayısal değerlerden oluşan bir değeri kontrol etmek için kullanılabilir.


Teşekkürler ShiftDelete Ailesi :thumbup:

Bonus hakettin :)
 

BeNBeN

Asistan
Katılım
11 Temmuz 2008
Mesajlar
138
Reaksiyon puanı
2
Puanları
0
Bir string açarsın 11 lik. içerisine 0,1,2,3,4,5,6,7,8,9 birde virgül koyarsın. Her keypress olayında, basılan karakteri bu stringin içinde arattırırsın, eğer var ise sorun yok. Yok ise basmasın o karakteri. VB pek bilmiyorum oyüzden kod olarak yardımcı olamayacağım.
 

SiberWorm

Doçent
Katılım
3 Aralık 2009
Mesajlar
508
Reaksiyon puanı
5
Puanları
0
Bir string açarsın 11 lik. içerisine 0,1,2,3,4,5,6,7,8,9 birde virgül koyarsın. Her keypress olayında, basılan karakteri bu stringin içinde arattırırsın, eğer var ise sorun yok. Yok ise basmasın o karakteri. VB pek bilmiyorum oyüzden kod olarak yardımcı olamayacağım.

Sorun Uso Kardeş Tarafından Çözüldü Yinede Teşekkürler..!
 

sercim

Öğrenci
Katılım
29 Eylül 2013
Mesajlar
3
Reaksiyon puanı
0
Puanları
0
Merhabalar eskiden vb6 kullanmıştım .net e ilk defa geçiş yapmak zorunda kaldım. Eski bilgilerimi az çok hatırladım gibi ama benim bu konuyla alakalı bir kaç sorum olacak. Ya bizim 10 larca bu şekilde kontrol etmemiz gereken textbox larımız varsa ne olacak? Hepsi için ayrı ayrı sub yordam mı yazacaz?
Bir de ben sizin bu kodunuzu şu şekilde modifiye ettim

Private Sub txt1X_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt1X.TextChanged
If Not IsNumeric(txt1X.Text) And txt1X.Text <> "" Or txt1X.Text < 1 Or txt1X.Text > 800 Then
MsgBox("Lütfen '1 - 800' arası sayısal bir değer giriniz!")
txt1X.Text = ""
txt1X.Focus()
End If
End Sub

Yani extradan girilen değerlerin 1 ila 800 arasında olmasını istiyorum. Fakat bunu çalıştırdığımda "Then" ifadesinde hata veriyor. Diyor ki

"A first chance exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll

Additional information: "" dizesinden 'Double' türüne yapılan dönüştürme geçerli değil."

Zannedersem textbox daki değer null olunca sapıtıyor. Bu durumdan nasıl kurtulabilirim acaba? Yani text in içinde ki değerin nümerik ya da null olması imkansız mı ?
 

algea

Doçent
Katılım
15 Temmuz 2011
Mesajlar
505
Reaksiyon puanı
22
Puanları
18
Merhabalar eskiden vb6 kullanmıştım .net e ilk defa geçiş yapmak zorunda kaldım. Eski bilgilerimi az çok hatırladım gibi ama benim bu konuyla alakalı bir kaç sorum olacak. Ya bizim 10 larca bu şekilde kontrol etmemiz gereken textbox larımız varsa ne olacak? Hepsi için ayrı ayrı sub yordam mı yazacaz?
Bir de ben sizin bu kodunuzu şu şekilde modifiye ettim

Private Sub txt1X_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt1X.TextChanged
If Not IsNumeric(txt1X.Text) And txt1X.Text <> "" Or txt1X.Text < 1 Or txt1X.Text > 800 Then
MsgBox("Lütfen '1 - 800' arası sayısal bir değer giriniz!")
txt1X.Text = ""
txt1X.Focus()
End If
End Sub

Yani extradan girilen değerlerin 1 ila 800 arasında olmasını istiyorum. Fakat bunu çalıştırdığımda "Then" ifadesinde hata veriyor. Diyor ki

"A first chance exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll

Additional information: "" dizesinden 'Double' türüne yapılan dönüştürme geçerli değil."

Zannedersem textbox daki değer null olunca sapıtıyor. Bu durumdan nasıl kurtulabilirim acaba? Yani text in içinde ki değerin nümerik ya da null olması imkansız mı ?

Gösterdiğim şekilde yapabilirsin
Kod:
Public Class Form1
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If IsNumeric(e.KeyChar) Or e.KeyChar = vbBack Or (e.KeyChar = "." And CountSeparator(TextBox1.Text) = 0) Then
            If Val(AddChar2Text(TextBox1.Text, e.KeyChar, TextBox1.SelectionStart)) > 800 Then
                e.Handled = True
                Beep()
            End If
        Else
            e.Handled = True
            Beep()
        End If
    End Sub
    Public Function AddChar2Text(strText As String, newchar As String, position As Integer) As String
        Dim a As String = ""
        For i As Integer = 0 To strText.Length
            If i = position Then
                a = a + newchar + Mid(strText, i + 1, 1)
            Else
                a = a + Mid(strText, i + 1, 1)
            End If
        Next
        Return a
    End Function
    Public Function CountSeparator(strText As String) As Integer
        Dim c As Integer = 0
        For i As Integer = 1 To strText.Length
            If Mid(strText, i, 1) = "." Then
                c = c + 1
            End If
        Next
        Return c
    End Function
End Class

- - - Mesaj Güncellendi - - -

Kısaca şöylede yapabilirsin:
Kod:
Public Class Form1
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If IsNumeric(e.KeyChar) Or e.KeyChar = vbBack Or (e.KeyChar = "." And TextBox1.Text.Count(Function(c As Char) c = ".") = 0) Then
            If Val(TextBox1.Text.Insert(TextBox1.SelectionStart, e.KeyChar)) > 800 Then
                e.Handled = True
                Beep()
            End If
        Else
            e.Handled = True
            Beep()
        End If
    End Sub
End Class
 

algea

Doçent
Katılım
15 Temmuz 2011
Mesajlar
505
Reaksiyon puanı
22
Puanları
18
Kodda ufak bir kısım eksik olmuş. Onuda yazayım tam olsun
Kod:
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If IsNumeric(e.KeyChar) Or e.KeyChar = vbBack Or (e.KeyChar = "." And TextBox1.Text.Count(Function(c As Char) c = ".") = 0) Or (e.KeyChar = "-" And TextBox1.SelectionStart = 0 And TextBox1.Text.Count(Function(c As Char) c = "-") = 0) Then
            If Val(TextBox1.Text.Insert(TextBox1.SelectionStart, e.KeyChar)) > 800 Or Val(TextBox1.Text.Insert(TextBox1.SelectionStart, e.KeyChar)) < 1 Then
                e.Handled = True
                Beep()
            End If
        Else
            e.Handled = True
            Beep()
        End If
    End Sub
End Class
 

sercim

Öğrenci
Katılım
29 Eylül 2013
Mesajlar
3
Reaksiyon puanı
0
Puanları
0
Vakit ayırıp uğraştığınız için çok teşekkür ederim. Canavar gibi olmuş vallahi. Çok çok teşekkürler...
Elinize ve beyninize sağlık...
 

Champion78

Müdavim
Müdavim
Katılım
29 Eylül 2006
Mesajlar
1,716
Reaksiyon puanı
43
Puanları
228
vb.net bilmiyorum ama illa ki try-catch yapısı vardır. C# üzerinde aşağıdaki şekilde basitçe yapılabilir:

try
{
float.Parse(textBox1.Text);
}
catch
{
MessageBox.Show("Geçerli sayı girin");
}

Bu kodu da key down/up event ine yazdın mı oldu bitti :) veya direk kaydet butonuna bastığında da çalıştırılabilir, daha pratik.
 
Üst