?
Solved

DataGridView Cell Validation?

Posted on 2010-08-16
13
Medium Priority
?
917 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
 
LVL 1

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
Free Backup Tool for VMware and Hyper-V

Restore full virtual machine or individual guest files from 19 common file systems directly from the backup file. Schedule VM backups with PowerShell scripts. Set desired time, lean back and let the script to notify you via email upon completion.  

 
LVL 1

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
 
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 2000 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
 
LVL 1

Author Closing Comment

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

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…
Suggested Courses

777 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