Why RowLeave fires before CellLeave/CellValidating? - vb.net

I have an update statement under RowLeave event of my datagridview. Before I update it I need to validate the cell if there is an empty value. But whenever I moved the focus to another row, RowLeave is called first before CellLeave/CellValidating.
Is there another way of validating the cell when leaving a row?
Note: Leaving a cell in the same row is not a problem.

Well your app is acting as designed, see if you can listen to something in the nature of cellexitEditmode or cell validated (not entirely sure these are all there). Best practice is if the row represents and object that is bound say your row represents an order and your grid is bound to a collection of orders . the cell will be a property in an order you can validate on property changed.

Related

Getting value of previous selected item (dropDown)

When a user changes the selected item on a dropdown I need to get the PREVIOUS item selected,
EX:
dropdown items:
1) Questions
2) Jobs
3) Tags
4) Badges
User has #2 Selected and then changes to #4 -- How can I get the value of #2 when they change the selection?
Declare an instance variable in your form (WinForms) or window (WPF).
When a user selects an item:
Do what you want to do.
Save the current item index in the instance variable.
In step 1, you can now access the instance variable to get the previously selected item.
Declare a global variable that will contain the previous value.
When the user changes the selection in the combobox, set the variable to the currently selected value. Allow the selection to be changed. You now will have the previous value.
If you need to have the history of changes, then the global variable would be a collection. Then on changed event, add the current selection to the collection.
If your control is bound to data, there is no need to "Squirrel" the old value away, your data provider usually does this for you.
For example, if you are bound to a DataRow, this code will get the previous value.
? = [Your DataRow].item("[Your column name]",OrigialVersion)
This varies based on your data but ultimately, you could always re-query the database to get the original value as well.
Regardless of what you are bound too, if you ask the datasource for it's value during the Validating event of the control, it will have not changed yet so it will give you the old value, which you can then compare against the current selection.
Lastly, if you are not bound to data, I typically store the old value in the TAG property on the GotFocus event of the control. Then you can compare against that.
Hope this provides some other options that might help you, depending on your case.

Detect when user has finished editing a cell in a datagridview

I am using DataGridView1.CellEndEdit to detect when the user finishes to edit a cell.
In my program i am doing this:
Filling a Datagridview with a binding source
Filtering with the bindingsource filter
order by the first column alphabetically
edit a cell
Write edited values in the database
The problem is: When I finish CellEndEdit is fired and the cell does this:
write new values to Datagridview
Refresh row order based on the new value of the cell and update the bindingsource filter
Fire CellEndEdit
For me this is a problem because I need to read the content of every cell of the row, in order to update the database and once it gets the new values it is moved to a unknown position OR hidden because it does not meet the filter criteria anymore and thus if I read the row it was before I get the values of a row that has nothing to do with the one I am looking for.
Is there a way to get the values of the entire row containing the cell i just edited from within the CellEndEdit sub?
Solved by adding a KeyUp event handler and storing each cell of the row in a variable on every keyup event.
The CellEndEdit event provides DataGridViewCellEventArgs arguments which contains the RowIndex.

DataGridViewRow Color Changes On DataView RowFilter

Goal
To differentiate different rows from each other based on a custom class object's properties. For example, if the object's available state is not available the row backcolor should be displayed in yellow. Similarly, if the object's deleted state is set to true, the row backcolor should be red.
Current Situation
I have a DataGridView that has it's DataSource set to a DataView. The DataView's Table is set to a DataTable filled with data by the custom class.
I created a method that sets the back colors correctly (tested and it works fine). However, this method is executed on the DataGridView1.RowsAdded event. For some reason, even if I have 20 rows that are added, it only goes through the event twice for the row index 0 and row index 1.
Problem
I need a DataGridView event that will fire my method every time a row is added or every time the RowFilter on my DataView changes. How can I go about doing this?
The best way to deal with custom row/cell style is to subscribe to the following events:
RowPrePaint
RowPostPaint
They are only raised when the row is displayed.

figure out rowindex on a row I just inserted?

I've got a vb project I am updating and it has a datagridview, a panel, and buttons along the bottom. The buttons control CRUD operations. The panel shows numerical up/downs and textboxes to represent the selected row.
I use some logic to keep track of current selected row and current row index for timer updates in the background. Upon delete I reset focus on the first row. Upon loading I set focus on first row. On update I keep current row focus.
Upon a good insert I would like to set the focus to the row I just inserted. But I do not know a way to determine what the rowindex value is for this freshly inserted row. My datatable which the datagridview uses is sorted on two id columns so it's not like the new entry will just jump to the bottom.
Any ideas on how I can implement this?
If you don't want to deal with the RowAdded event as Jay Riggs suggested, if you add it using a row object, as opposed to just Rows.Add, you should be able to pull that off of the row object after it's inserted.
Dim dgr As New DataGridViewRow()
DataGridView1.Rows.Add(dgr)
Me.DataGridView1.Rows.IndexOf(dgr)
This should also work for insert as well.
Check out the DataGridView RowAdded event; its DataGridViewRowsAddedEventArgs parameter includes the RowIndex property which gives you what you need.
The event fires everytime a row is added, so you'll have to either wire the event up when you want to check for added rows, or ignore the event when you don't care when a row is added (such as when your grid fills with data).
If you manually add rows to the DataGridView, then you can just use the return value from the Add method. Examples:
Dim newRowIndex As Integer = myDataGridView.Rows.Add()
myDataGridView.Rows(newRowIndex).Selected = True
No need to call IndexOf. If the DataGridView is bound to a DataSource then Jay Riggs' solution of using the RowsAdded event is the way to go.

DataGridView Cell Value Change Not Happening

I have retrieved data from access database into a DataGridView. Let us suppose I am in Row 0. When I change the contents of Row 0, Cell 1 and press a button, the Update query should modify that row, but I am unable to modify the value of the cell. The cell maintains its previous value and the database is not modified. For example, if I change the contents of a cell from "David" to "Jhon", how can I change the value of the cell from "David" to "Jhon"? I am using VB.NET 2008.
You most likely need to pick up the EditedFormattedValue of the cell, which has the new value. FormattedValue and Value have the original value.
I presume you are checking the formatted value of the cell for getting the value.
Also if you are changing the values, please check if the cell value changed event is triggered or not. Coz the editing control needs to pass the changed value back to the grid cell. If you can post your code then it might be more clear and helpful.