Hi,
I want to add (create and add to my datasource) multiple rows to my grid based on validating a field in the 'add new row' row.
At present, when I do this (as described below) it leaves me with the row being added. I would like to cancel the added row. In doing this I have been wondering if I am going about it all incorrectly, however:
I am unsure if I should perform some other function that captures the Add New Row functionality, if I should be doing what I'm doing (validating on CellValidating and adding the new rows) or using CellEndEdit or some other function to perform the load and cancelling the original edit.
In the grid (ProductCode, Operation, Quantity, Hours, and some resultant fields), I am trying to allow the user to enter in a specific sub-product code - to enter in one line, or to enter in a parent product code which will pre-populate a bunch of rows (for all the children meeting the criteria).
It currently is working as I want, barring the cancelEdit usage after adding in bulk. I'm not sure how to accomplish this (or do it better). Any advice would be really appreciated!
Here is basically what I currently have:
I want to add (create and add to my datasource) multiple rows to my grid based on validating a field in the 'add new row' row.
At present, when I do this (as described below) it leaves me with the row being added. I would like to cancel the added row. In doing this I have been wondering if I am going about it all incorrectly, however:
I am unsure if I should perform some other function that captures the Add New Row functionality, if I should be doing what I'm doing (validating on CellValidating and adding the new rows) or using CellEndEdit or some other function to perform the load and cancelling the original edit.
In the grid (ProductCode, Operation, Quantity, Hours, and some resultant fields), I am trying to allow the user to enter in a specific sub-product code - to enter in one line, or to enter in a parent product code which will pre-populate a bunch of rows (for all the children meeting the criteria).
It currently is working as I want, barring the cancelEdit usage after adding in bulk. I'm not sure how to accomplish this (or do it better). Any advice would be really appreciated!
Here is basically what I currently have:
Private Sub rgvProducts_CellValidating(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.CellValidatingEventArgs) Handles rgvProducts.CellValidating Dim col As GridViewDataColumn = e.Column Dim validateMessage As String = "" lblMsg.Text = "" If quitValidating Then Return End If If e.Row IsNot Nothing Then 'if new row and field entered is "ProductCode" If e.Row.GetType Is GetType(GridViewNewRowInfo) AndAlso col.FieldName = "ProductCode" Then If String.IsNullOrWhiteSpace(e.Value) Then 'show validation message: cannot be blank Return End If Dim coreProducts As DataTable Dim lp As LabourProduct Dim resultsMessage As String = "" 'Check if ProductCode value is valid against CoreProduct mapping If ApplicationFunctions.fieldValidate("CoreProductCode", e.Value) Then coreProducts = Labour.retrieveCoreProductRows("", e.Value, cl.Operation) 'retrieve set of CoreProduct rows filtered by Operation If coreProducts.Rows.Count = 0 Then 'show validation message: No CoreProduct items found Return ElseIf coreProducts.Rows.Count = 1 Then 'if single row returned, allow editing in-line rgvProducts.CurrentRow.Cells("ProductCode").Value = coreProducts.Rows(0)("CoreProductCode") rgvProducts.CurrentRow.Cells("Operation").Value = coreProducts.Rows(0)("Operation") rgvProducts.CurrentRow.Cells("ActualQuantity").Value = coreProducts.Rows(0)("StandardQuantity") rgvProducts.CurrentRow.Cells("StandardQuantity").Value = coreProducts.Rows(0)("StandardQuantity") rgvProducts.CurrentRow.Cells("StandardHours").Value = coreProducts.Rows(0)("StandardHours") rgvProducts.CurrentRow.Cells("EarnedHours").Value = coreProducts.Rows(0)("StandardHours") rgvProducts.CurrentRow.Cells("Description").Value = coreProducts.Rows(0)("ProductDescription") Return Else resultsMessage = ProcessCoreProductDataTable(coreProducts) 'This adds multiple rows to grid and saves the objects If Not resultsMessage = "Success" Then 'show validation message: Error saving Return Else 'Here trying to rebind the data source and cancel the edit ApplicationFunctions.showMsg(lblMsg, resultsMessage, ApplicationFunctions.AlertModes.Positive) rgvProducts.DataSource = "" rgvProducts.DataSource = cl.LabourProductList rgvProducts.CancelEdit() End If End If Else 'if not matched against the CoreProduct, then trying to match against Product parent coreProducts = Labour.retrieveCoreProductRows(e.Value, "", cl.Operation) If coreProducts.Rows.Count > 0 Then 'if rows returned then add them resultsMessage = ProcessCoreProductDataTable(coreProducts) If Not resultsMessage = "Success" Then ApplicationFunctions.showMsg(lblMsg, resultsMessage, ApplicationFunctions.AlertModes.Negative) e.Row.ErrorText = resultsMessage e.Cancel = True Return Else ApplicationFunctions.showMsg(lblMsg, resultsMessage, ApplicationFunctions.AlertModes.Positive) rgvProducts.DataSource = "" rgvProducts.DataSource = cl.LabourProductList rgvProducts.CancelEdit() End If 'else show validation message: product code entered invalid End If End If ElseIf (e.Row.GetType Is GetType(GridViewDataRowInfo) Or e.Row.GetType Is GetType(GridViewNewRowInfo)) And Not col Is Nothing Then 'only inline editing for any already entered rows validateMessage = validate(col.FieldName, e.Value) If validateMessage <> String.Empty Then ApplicationFunctions.showMsg(lblMsg, validateMessage, ApplicationFunctions.AlertModes.Negative) End If End If End Sub 'add items in bulk and save Private Function ProcessCoreProductDataTable(ByRef coreProducts As DataTable) As String Dim saveMessage As String = "" Dim lp As LabourProduct For Each cp As DataRow In coreProducts.Rows lp = New LabourProduct() lp.LabourID = cl.LabourID lp.ProductCode = cp("CoreProductCode") lp.CoreBoxNumber = lp.ProductCode.Substring(lp.ProductCode.LastIndexOf("_C")) lp.Operation = cp("Operation") lp.ActualQuantity = cp("StandardQuantity") lp.StandardQuantity = cp("StandardQuantity") lp.StandardHours = cp("StandardHours") lp.EarnedHours = cp("StandardHours") lp.Description = cp("ProductDescription") If Not lp.save(saveMessage) Then Return saveMessage Else cl.LabourProductList.Add(lp) End If Next Return saveMessage End Function