PDA

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