Solved

DataGridView Cell Validation?

Posted on 2010-08-16
13
896 Views
Last Modified: 2013-11-08
Using winform and VB.NET and DataGridView.
I have code behind the CellValidating. But it does not seem to get invoked when navigating to another Cell. (Code Behind the RowValidating does get triggered when navigating to different row.) This is not consistant. I can tab to the next cell and the code is not called, then tab back back to the cell (that has the validating), then tab to the next cell and this time it does call the code.
How is this suppose to work? There is an e.cancel property that when it is set to true is suppose to keep the focus in the cell but if the code is not invoked what good is that?
0
Comment
Question by:Jess31
  • 8
  • 3
  • 2
13 Comments
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33448651
can you please post the code (Cell Validating)?
0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33448684
what kind of validation do you want to achieve?
0
 

Author Comment

by:Jess31
ID: 33448745
I would like that the user entering an Amount greater than n be alerted and unless the user choose to explicitly do this that he/she will be prvented from leaving this cell.
Private Sub DataGridView1_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) _

                Handles DataGridView1.CellValidating



        If ynLoading = False Then

            If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Receiving" Then

                If CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Receiving").Value) > CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").Value) Then

                    If MsgBox("Are you sure you wish to Over-Receive, to Receive more than what appears on the Purchase Order?", _

                              CType(MsgBoxStyle.Exclamation + MsgBoxStyle.YesNoCancel, MsgBoxStyle), "Is the Amount in Error") _

                              <> MsgBoxResult.Yes Then

                        e.Cancel = True

                        Exit Sub

                    End If

            End If

end if

End sub

Open in new window

0
 

Author Comment

by:Jess31
ID: 33448751
please ignore this line
>  If ynLoading = False Then
0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33448873
Remove initially your messagebox to see if it works without it
Private Sub DataGridView1_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) _

                Handles DataGridView1.CellValidating



        If ynLoading = False Then

            If e.ColumnIndex)= "YourColumnIndex" Then   '----->Change this 

                If CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Receiving").Value) > CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").Value) Then

                        e.cancel = True

                        Exit Sub

                    End If

            End If

        End if

End sub

Open in new window

0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33449085
I thing that the cell validating event validates the cell it self...
you may add validation after the completion of entry before you update your data ...it much easier ...and you dont force any time ..the user with canceling his entries...
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33449137
YOu put this code before your update method
 For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1

            If IsDBNull(Me.DataGridView.Rows(i).Cells("Receiving").Value) Or _

            IsDBNull(Me..Rows(i).Cells("Backordered").Value) Then

               MessageBox.Show("...................................", "Empty cells", MessageBoxButtons.OK, MessageBoxIcon.Warning) 

               Exit Sub

            ElseIf If CInt(Me.DataGridView1.Rows(i).Cells("Receiving").Value) > CInt(Me.DataGridView1.Rows(i).Cells("Backordered").Value)  Then

                

                MessageBox.Show("...................................", "......", MessageBoxButtons.OK, MessageBoxIcon.Warning)

          

                Exit Sub



          End If

 Next 

' your update method ...this is one option

Open in new window

0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33449167
Also you may try your code in the row Validating event
0
 
LVL 17

Expert Comment

by:Zhaolai
ID: 33449173
Try this:


        If e.ColumnIndex = youcolumnindex Then

            If CInt(e.FormattedValue) > CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").FormattedValue) Then

                If MsgBox("Are you sure you wish to Over-Receive, to Receive more than what appears on the Purchase Order?", _

                          CType(MsgBoxStyle.Exclamation + MsgBoxStyle.YesNoCancel, MsgBoxStyle), "Is the Amount in Error") _

                          <> MsgBoxResult.Yes Then

                    e.Cancel = True

                    Exit Sub

                End If

            End If

        End If

Open in new window

0
 
LVL 17

Accepted Solution

by:
Zhaolai earned 500 total points
ID: 33449198
Oh... of cause in your CellValidating event. Complete code:

    Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating

        If e.ColumnIndex = YourColumnIndex Then

            If CInt(e.FormattedValue) > CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").FormattedValue) Then

                If MsgBox("Are you sure you wish to Over-Receive, to Receive more than what appears on the Purchase Order?", _

                          CType(MsgBoxStyle.Exclamation + MsgBoxStyle.YesNoCancel, MsgBoxStyle), "Is the Amount in Error") _

                          <> MsgBoxResult.Yes Then

                    e.Cancel = True

                    Exit Sub

                End If

            End If

        End If

    End Sub

Open in new window

0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33449212
It is a little strange ..in the cell validating.....he must also check for empty cells ...
Also to make a comparrison with cell validating event -in this case - the Backorderd must be already filled
0
 
LVL 18

Expert Comment

by:John (Yiannis) Toutountzoglou
ID: 33449548
just to be sure that Backordered is already filled try ...
Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating

If ynLoading = False Then

       If e.columnIndex="YourColumnIndex"

          If Not IsDBNull(Me.Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").Value) Or Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").Value Is Not Nothing then

                If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Receiving" Then

                    If CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Receiving").Value) > CInt(Me.DataGridView1.Rows(e.RowIndex).Cells("Backordered").Value) Then

                        If MsgBox("Are you sure you wish to Over-Receive, to Receive more than what appears on the Purchase Order?", _

                                  CType(MsgBoxStyle.Exclamation + MsgBoxStyle.YesNoCancel, MsgBoxStyle), "Is the Amount in Error") _

                                  <> MsgBoxResult.Yes Then

                            e.Cancel = True

                            Exit Sub

                        End If

                    End If

                End If

            End If

         End If

Open in new window

0
 

Author Closing Comment

by:Jess31
ID: 33450295
e.FormatedValue is key.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

27 Experts available now in Live!

Get 1:1 Help Now