G
Guest
This is a difficult problem and I have been trying everything for a week or more.
It is a datagrid on a form and a button for adding a row and a button for deleting a row that gets enabled when a row is selected. The datagrid is bound to an array list rather than directly to a database.
If the add button is clicked, a row gets added ok and the program moves to a cell on the new row ready for editing. I then select the row by clicking in the left area by the row (which highlights the row) and click the delete button. The row does not get validated becasue I set the "Cause Validation" to false for the button and then the function runs (code below).
PROBLEM. I move the CurrentRowIndex off the row that I want to delete by doing:-
DataGridProductType1.CurrentRowIndex = DataGridProductType1.CurrentRowIndex - iwkNoOfRowsSelected
where I have confirmed that iwkNoOfRowsSelected is 1.
When debugging I find that after this line of code the CurrentRowIndex has not changed, it has not been decremented by 1. Because of this, when I have actually deleted the row in the arraylist and return to the grid I get an exception stating that an index was out of bounds. This exception is not in my code but in the .Net code somewhere.
I guess, because I was not able to move off the current row before deleting the row, when the grid is redrawn it finds the currentrowindex is not there anymore!!!
HELP Has anyone got any ideas at all.
Private Sub ButtonDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ButtonDelete.Click
Dim iwkRow As Integer
Dim iwkNoOfRowsSelected As Integer
Dim swkDescriptionString As String
Dim CwkArrayList As ArrayList
' Assumes the DataGrid is bound to an ArrayList.
CwkArrayList = DirectCast(DataGridProductType1.DataSource, ArrayList)
'//***********************************************************
'// Count the number of items selected.
'//***********************************************************
iwkNoOfRowsSelected = RowHowManySelected(DataGridProductType1)
'//***********************************************************
'// Move the current row index
'//***********************************************************
If iwkNoOfRowsSelected >= DataGridProductType1.CurrentRowIndex Then
DataGridProductType1.CurrentRowIndex = 0
Else
DataGridProductType1.CurrentRowIndex = DataGridProductType1.CurrentRowIndex - iwkNoOfRowsSelected
End If
'//***********************************************************
'// Go through Grid rows and delete ALL items that are selected
'//***********************************************************
For iwkRow = CwkArrayList.Count - 1 To 0 Step -1
If DataGridProductType1.IsSelected(iwkRow) Then
'//***********************************************************
'// Delete this row
'// Get key field text and then use that to delete the item
'//***********************************************************
swkDescriptionString = DataGridProductType1(iwkRow, 0)
m_ClassProductType1Control.Delete(swkDescriptionString)
'// alternate way of deleteing a row
'm_CBindingManagerBase.RemoveAt(iRow)
End If
Next iwkRow
'//***********************************************************
'// Refresh the data grid
'//***********************************************************
DataGridProductType1.DataSource = Nothing
DataGridProductType1.DataSource = m_ClassProductType1Control.GetArrayList()
End Sub
It is a datagrid on a form and a button for adding a row and a button for deleting a row that gets enabled when a row is selected. The datagrid is bound to an array list rather than directly to a database.
If the add button is clicked, a row gets added ok and the program moves to a cell on the new row ready for editing. I then select the row by clicking in the left area by the row (which highlights the row) and click the delete button. The row does not get validated becasue I set the "Cause Validation" to false for the button and then the function runs (code below).
PROBLEM. I move the CurrentRowIndex off the row that I want to delete by doing:-
DataGridProductType1.CurrentRowIndex = DataGridProductType1.CurrentRowIndex - iwkNoOfRowsSelected
where I have confirmed that iwkNoOfRowsSelected is 1.
When debugging I find that after this line of code the CurrentRowIndex has not changed, it has not been decremented by 1. Because of this, when I have actually deleted the row in the arraylist and return to the grid I get an exception stating that an index was out of bounds. This exception is not in my code but in the .Net code somewhere.
I guess, because I was not able to move off the current row before deleting the row, when the grid is redrawn it finds the currentrowindex is not there anymore!!!
HELP Has anyone got any ideas at all.
Private Sub ButtonDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ButtonDelete.Click
Dim iwkRow As Integer
Dim iwkNoOfRowsSelected As Integer
Dim swkDescriptionString As String
Dim CwkArrayList As ArrayList
' Assumes the DataGrid is bound to an ArrayList.
CwkArrayList = DirectCast(DataGridProductType1.DataSource, ArrayList)
'//***********************************************************
'// Count the number of items selected.
'//***********************************************************
iwkNoOfRowsSelected = RowHowManySelected(DataGridProductType1)
'//***********************************************************
'// Move the current row index
'//***********************************************************
If iwkNoOfRowsSelected >= DataGridProductType1.CurrentRowIndex Then
DataGridProductType1.CurrentRowIndex = 0
Else
DataGridProductType1.CurrentRowIndex = DataGridProductType1.CurrentRowIndex - iwkNoOfRowsSelected
End If
'//***********************************************************
'// Go through Grid rows and delete ALL items that are selected
'//***********************************************************
For iwkRow = CwkArrayList.Count - 1 To 0 Step -1
If DataGridProductType1.IsSelected(iwkRow) Then
'//***********************************************************
'// Delete this row
'// Get key field text and then use that to delete the item
'//***********************************************************
swkDescriptionString = DataGridProductType1(iwkRow, 0)
m_ClassProductType1Control.Delete(swkDescriptionString)
'// alternate way of deleteing a row
'm_CBindingManagerBase.RemoveAt(iRow)
End If
Next iwkRow
'//***********************************************************
'// Refresh the data grid
'//***********************************************************
DataGridProductType1.DataSource = Nothing
DataGridProductType1.DataSource = m_ClassProductType1Control.GetArrayList()
End Sub