View Full Version : سوال: چطور میشه در یکی از سلول های دیتا گرید فقط عدد یا حرف وارد کرد
  
saman_itc
یک شنبه 10 شهریور 1387, 19:08 عصر
سلام دوستان من برای اینکه در یک دیتا گرید که به دیتا بیس متصل نیست چطور می توانم شرط تعین کنم که در یک سلول فقط عدد ودر سلول دیگر فقط حروف وارد شود.:متفکر:
ali_md110
سه شنبه 12 شهریور 1387, 02:07 صبح
راههای متفاوتی هست
شما روال رویداد زیر رو تعریف کنید
Private Sub TextBox_KeyPress( _
              ByVal sender As System.Object, _
              ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If CType(sender, TextBox).Text = String.Empty And _
           e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If CType(sender, TextBox).Text.Contains(Chr(46)) And _
           e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If (Not (Char.IsDigit(e.KeyChar) Or _
           Char.IsControl(e.KeyChar) Or _
           (e.KeyChar = Chr(46)))) Then
            e.Handled = True
        End If
    End Sub
بعد اونو توی رویداد EditingControlShowing دیتاگرایدتون بکار برید
مثلا کد زیر ستون دوم رو فقط عدد قبول میکنه
  Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
        If Me.DataGridView1.CurrentCell.ColumnIndex = 1 And _
            Not e.Control Is Nothing Then
            Dim tb As TextBox = CType(e.Control, TextBox)
            AddHandler tb.KeyPress, AddressOf TextBox_KeyPress
        End If
    End Sub
saman_itc
سه شنبه 12 شهریور 1387, 12:14 عصر
کاکو علی ممنون 
من خیلی احتیاج به این دستور داشتم.
در ضمن این دستور فقط عدد ثبت می کنه اگه بخواهیم حروف ثبت کنیم چی
باز هم ممنون.
rika_vazy
سه شنبه 12 شهریور 1387, 12:30 عصر
راههای متفاوتی هست
شما روال رویداد زیر رو تعریف کنید
Private Sub TextBox_KeyPress( _
              ByVal sender As System.Object, _
              ByVal e As System.Windows.Forms.KeyPressEventArgs)
 
        If CType(sender, TextBox).Text = String.Empty And _
           e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If CType(sender, TextBox).Text.Contains(Chr(46)) And _
           e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If (Not (Char.IsDigit(e.KeyChar) Or _
           Char.IsControl(e.KeyChar) Or _
           (e.KeyChar = Chr(46)))) Then
            e.Handled = True
        End If
 
    End Sub
 
بعد اونو توی رویداد EditingControlShowing دیتاگرایدتون بکار برید
مثلا کد زیر ستون دوم رو فقط عدد قبول میکنه
  Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
        If Me.DataGridView1.CurrentCell.ColumnIndex = 1 And _
            Not e.Control Is Nothing Then
            Dim tb As TextBox = CType(e.Control, TextBox)
            AddHandler tb.KeyPress, AddressOf TextBox_KeyPress
        End If
    End Sub
 
اگه امکان داره کد خط های بالا را توضیح بدین.
ممنون می شم
ali_md110
چهارشنبه 13 شهریور 1387, 02:36 صبح
این هم یک روش ساده دیگه که هم عدد و هم حروف ورودی رو میشه فیلتر کرد
 Dim nonNumberEntered As Boolean
 Private Sub editingControl_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
        Dim selPos As Integer = 0
        Dim regPos As Integer = 0
        Dim temp As TextBox = CType(sender, TextBox)
        selPos = temp.SelectedText.IndexOf(".")
        regPos = temp.Text.IndexOf(".")
        nonNumberEntered = False
        If regPos <> -1 AndAlso (e.KeyCode = Keys.OemPeriod OrElse e.KeyCode = Keys.Decimal) Then
            If selPos < 0 Then
                nonNumberEntered = True
            End If
        End If
        If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 OrElse e.Modifiers <> Keys.None Then
            If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 OrElse e.Modifiers <> Keys.None Then
                If (e.KeyCode <> Keys.Back AndAlso e.KeyCode <> Keys.OemPeriod AndAlso e.KeyCode <> Keys.Decimal) OrElse e.Modifiers <> Keys.None Then
                    nonNumberEntered = True
                End If
            End If
        End If
    End Sub
 Private Sub editingControl_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
        If nonNumberEntered = True Then   ' قرار دهید فقط عدد وارد و برعکس فقط حروفtrue  اگر در حالت 
            e.Handled = True
        End If
    End Sub
 Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
        Dim row As DataGridViewRow = DataGridView1.CurrentRow
        Dim cell0 As DataGridViewCell = row.Cells(0)  'در اینجا سلوهایی که جهت فیلتر شدن لازم است رو بر اساس ایندکس معرفی کرده
        Dim cell1 As DataGridViewCell = row.Cells(1)
        Dim cell2 As DataGridViewCell = row.Cells(2)
        RemoveHandler DataGridView1.EditingControl.KeyPress, AddressOf editingControl_KeyPress
        RemoveHandler DataGridView1.EditingControl.KeyDown, AddressOf editingControl_KeyDown
        If DataGridView1.CurrentCell Is cell1 OrElse DataGridView1.CurrentCell Is cell2 OrElse DataGridView1.CurrentCell Is cell0 Then 'و  در اینجا سلولها رو بکار میبریم 
            '
            AddHandler DataGridView1.EditingControl.KeyPress, AddressOf editingControl_KeyPress
            AddHandler DataGridView1.EditingControl.KeyDown, AddressOf editingControl_KeyDown
        End If
    End Sub
ali_md110
چهارشنبه 13 شهریور 1387, 03:15 صبح
قابل توجه دوستمونrika_vazy  
در مثال اول یک روال رویداد مانند رویداد keypress یک کنترل مثلا تکست باکس رو تعریف کردیم 
شما اگر کد زیر رو درون رویداد KeyPress یک تکست باکس هم بکارببرید فقط اعداد رو میتونید وارد کتید
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If CType(sender, TextBox).Text = String.Empty And _
        e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If CType(sender, TextBox).Text.Contains(Chr(46)) And _
           e.KeyChar = Chr(46) Then
            e.Handled = True
            Return
        End If
        If (Not (Char.IsDigit(e.KeyChar) Or _
           Char.IsControl(e.KeyChar) Or _
           (e.KeyChar = Chr(46)))) Then
            e.Handled = True
        End If
    End Sub
دیتاگراید ویو یک رویداد بنام EditingControlShowig داره که شما میتونید روال رویداد ساخته شده توسط خودتون رو با كمك دستورAddHandler  به صورت پویا با یک مدیر رویداد مرتبط نمایید
 یعنی شما در واقع سلول دیتاگراید ویو را وادار میکنید تا مانند یک textbox  عمل کند 
 
Private Sub TextBox_KeyPress 
رویداد بالا رویداد ساخته شده توسط کاربر هستش
و نحوه استفاده اون بدین صورت هستش
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
        If Me.DataGridView1.CurrentCell.ColumnIndex = 1 And _
            Not e.Control Is Nothing Then
            Dim tb As TextBox = CType(e.Control, TextBox)
            AddHandler tb.KeyPress, AddressOf TextBox_KeyPress
        End If
  
  End Sub
میتونید بصورت زیر هم استفاده کنید یعنی متغیری که در بالا تعریف شده رو حذف کرد 
 Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
        If Me.DataGridView1.CurrentCell.ColumnIndex = 1 And _
            Not e.Control Is Nothing Then
            AddHandler DataGridView1.EditingControl.KeyPress, AddressOf TextBox_KeyPress
        End If
    End Sub
دیتاگراید ویو یک رویداد بنام keypress داره ما باید اونو  توسط روال روبدادی که خودمون ساختیم اداره کنیم 
بدین صورت
AddHandler DataGridView1.EditingControl.KeyPress, AddressOf TextBox_KeyPress
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.