Modifying Update button to load items in RadGrid and post

1 Answer 52 Views
Grid
cest
Top achievements
Rank 1
Iron
cest asked on 19 Jun 2024, 04:50 PM | edited on 20 Jun 2024, 12:23 PM

So, first off, I am very new to programming and just started a position, but I have been working on an item for a bit now and am struggling to get it to work correctly.  I get stuck on a spceific line of code and I am not sure how to handle it as they are not text boxes. The errors I get are as follows: 

System.InvalidCastException: 'Unable to cast object of type 'Telerik.Web.UI.GridTextBoxColumnEditor' to type 'System.IConvertible'.' 

For this line: 

cmd.Parameters.Add("@Fill_Qty", SqlDbType.Int).Value = System.Convert.ToInt32(fillQtyEditor)

I also believe this will effect the maint_date and active_indicator cmds as well and would like any feedback. Additionally, the cmd that I am using for sql the values are null so seems to be bypassing that as well. I have scoured this site and documentation which has helped somewhat but nothing specific to this. 

 

Protected Sub RadGrid1_ItemCreated(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) If e.Item.IsInEditMode Then Dim item As Telerik.Web.UI.GridEditableItem = TryCast(e.Item, Telerik.Web.UI.GridEditableItem) ' Add validator for PortalID (Non-nullable) Dim portalIDEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("PortalID"), Telerik.Web.UI.GridTextBoxColumnEditor) AddRequiredFieldValidator(portalIDEditor.TextBoxControl, "PortalID") ' Add validator for asset_sn (Non-nullable) Dim assetSNEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_SN"), Telerik.Web.UI.GridTextBoxColumnEditor) AddRequiredFieldValidator(assetSNEditor.TextBoxControl, "Asset Serial Number") ' Add validator for asset_model (Nullable) Dim assetModelEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_model"), Telerik.Web.UI.GridTextBoxColumnEditor) AddRequiredFieldValidator(assetModelEditor.TextBoxControl, "Asset Model") ' Add validator for asset_location (Nullable) Dim assetLocEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_location"), Telerik.Web.UI.GridTextBoxColumnEditor) AddRequiredFieldValidator(assetLocEditor.TextBoxControl, "Location") ' Add validator for Fill_qty (Nullable but must be numeric if provided) Dim fillQtyEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("Fill_qty"), Telerik.Web.UI.GridTextBoxColumnEditor) AddNumericValidator(fillQtyEditor.TextBoxControl, "Fill Quantity") Dim maintEditor As Telerik.Web.UI.GridDateTimeColumnEditor = CType(item.EditManager.GetColumnEditor("maint_Date"), Telerik.Web.UI.GridDateTimeColumnEditor) Dim actIndEditor As Telerik.Web.UI.GridCheckBoxColumnEditor = CType(item.EditManager.GetColumnEditor("active_indicator"), Telerik.Web.UI.GridCheckBoxColumnEditor) Dim notesEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("Notes"), Telerik.Web.UI.GridTextBoxColumnEditor) ' Checks to see if items if item is 'PerformInsert' else check if it is 'UpdateButton' Dim buttonName As String = If(TypeOf item Is Telerik.Web.UI.IGridInsertItem, "PerformInsertButton", "UpdateButton") TryCast(item.FindControl(buttonName), Button).ValidationGroup = "gridFormValidation" Dim objConnection As SqlConnection Dim strSQL As String objConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("DC2_Data_WarehouseConnectionString_PRODUCTION").ConnectionString) ' Insert record strSQL = "INSERT INTO [data_warehouse].[dbo].[t_d_ATracker] ([PortalID],[asset_SN],[Fill_Qty],[Maint_Date],[asset_location],[asset_model],[active_indicator],[Asset_Notes]) " & "VALUES (@PortalID, @asset_SN, @Fill_Qty, @Maint_Date, @asset_location, @asset_model, @active_indicator, @Asset_Notes);" & "SELECT CAST(scope_identity() AS int);" Dim cmd As New SqlCommand(strSQL, objConnection) ' Add parameters cmd.Parameters.Add("@PortalID", SqlDbType.VarChar, 10).Value = portalIDEditor.Text cmd.Parameters.Add("@asset_SN", SqlDbType.VarChar, 20).Value = assetSNEditor.Text cmd.Parameters.Add("@Fill_Qty", SqlDbType.Int).Value = System.Convert.ToInt32(fillQtyEditor) cmd.Parameters.Add("@Maint_Date", SqlDbType.Date).Value = maintEditor cmd.Parameters.Add("@asset_location", SqlDbType.VarChar, 20).Value = assetLocEditor.Text cmd.Parameters.Add("@asset_model", SqlDbType.VarChar, 20).Value = assetModelEditor.Text cmd.Parameters.Add("@active_indicator", SqlDbType.Bit).Value = actIndEditor cmd.Parameters.Add("@Asset_Notes", SqlDbType.VarChar, -1).Value = notesEditor.Text End If End Sub

Private Sub AddRequiredFieldValidator(textBox As TextBox, fieldName As String)
    Dim validator As New CustomValidator()
    validator.ID = "CustomValidator_" & fieldName.Replace(" ", "_")
    validator.ControlToValidate = textBox.ID
    validator.ValidateEmptyText = True
    validator.ErrorMessage = String.Format("* {0} is required", fieldName)
    validator.ForeColor = Color.OrangeRed
    validator.ClientValidationFunction = "requiredFieldValidation"
    validator.ValidationGroup = "gridFormValidation"
    AddHandler validator.ServerValidate, AddressOf RequiredField_ServerValidate
    textBox.Parent.Controls.Add(validator)
End Sub

Private Sub AddNumericValidator(textBox As TextBox, fieldName As String)
    Dim validator As New CustomValidator()
    validator.ID = "CustomValidator_" & fieldName.Replace(" ", "_")
    validator.ControlToValidate = textBox.ID
    validator.ValidateEmptyText = True
    validator.ErrorMessage = String.Format("* {0} must be a numeric value", fieldName)
    validator.ForeColor = Color.OrangeRed
    validator.ClientValidationFunction = "numericFieldValidation"
    validator.ValidationGroup = "gridFormValidation"
    AddHandler validator.ServerValidate, AddressOf NumericField_ServerValidate
    textBox.Parent.Controls.Add(validator)
End Sub

Protected Sub RequiredField_ServerValidate(source As Object, args As ServerValidateEventArgs)
    args.IsValid = Not String.IsNullOrWhiteSpace(args.Value)
End Sub

Protected Sub NumericField_ServerValidate(source As Object, args As ServerValidateEventArgs)
    Dim value As String = args.Value.Trim()
    args.IsValid = String.IsNullOrEmpty(value) OrElse IsNumeric(value)
End Sub

 


1 Answer, 1 is accepted

Sort by
0
Accepted
Rumen
Telerik team
answered on 24 Jun 2024, 10:46 AM

Hi Christopher,

To address the issues you're facing, let's break down the problem and provide solutions for each part:

1. InvalidCastException for fillQtyEditor

The error occurs because fillQtyEditor is a GridTextBoxColumnEditor and not a directly convertible value. You need to access the TextBoxControl property to get the text value and then convert it.

2. Handling maint_date and active_indicator

Similar to fillQtyEditor, you need to access the appropriate control properties to get their values.

3. Null Values in SQL Command

Ensure that you're correctly accessing the values from the controls and handling any potential nulls before inserting them into the database.

Here's an updated version of your code with the necessary adjustments:

Protected Sub RadGrid1_ItemCreated(sender As Object, e As Telerik.Web.UI.GridItemEventArgs)
    If e.Item.IsInEditMode Then
        Dim item As Telerik.Web.UI.GridEditableItem = TryCast(e.Item, Telerik.Web.UI.GridEditableItem)

        ' Add validator for PortalID (Non-nullable)
        Dim portalIDEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("PortalID"), Telerik.Web.UI.GridTextBoxColumnEditor)
        AddRequiredFieldValidator(portalIDEditor.TextBoxControl, "PortalID")

        ' Add validator for asset_sn (Non-nullable)
        Dim assetSNEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_SN"), Telerik.Web.UI.GridTextBoxColumnEditor)
        AddRequiredFieldValidator(assetSNEditor.TextBoxControl, "Asset Serial Number")

        ' Add validator for asset_model (Nullable)
        Dim assetModelEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_model"), Telerik.Web.UI.GridTextBoxColumnEditor)
        AddRequiredFieldValidator(assetModelEditor.TextBoxControl, "Asset Model")

        ' Add validator for asset_location (Nullable)
        Dim assetLocEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("asset_location"), Telerik.Web.UI.GridTextBoxColumnEditor)
        AddRequiredFieldValidator(assetLocEditor.TextBoxControl, "Location")

        ' Add validator for Fill_qty (Nullable but must be numeric if provided)
        Dim fillQtyEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("Fill_qty"), Telerik.Web.UI.GridTextBoxColumnEditor)
        AddNumericValidator(fillQtyEditor.TextBoxControl, "Fill Quantity")

        Dim maintEditor As Telerik.Web.UI.GridDateTimeColumnEditor = CType(item.EditManager.GetColumnEditor("maint_Date"), Telerik.Web.UI.GridDateTimeColumnEditor)
        Dim actIndEditor As Telerik.Web.UI.GridCheckBoxColumnEditor = CType(item.EditManager.GetColumnEditor("active_indicator"), Telerik.Web.UI.GridCheckBoxColumnEditor)
        Dim notesEditor As Telerik.Web.UI.GridTextBoxColumnEditor = CType(item.EditManager.GetColumnEditor("Notes"), Telerik.Web.UI.GridTextBoxColumnEditor)

        ' Checks to see if items if item is 'PerformInsert' else check if it is 'UpdateButton'
        Dim buttonName As String = If(TypeOf item Is Telerik.Web.UI.IGridInsertItem, "PerformInsertButton", "UpdateButton")
        TryCast(item.FindControl(buttonName), Button).ValidationGroup = "gridFormValidation"

        Dim objConnection As SqlConnection
        Dim strSQL As String
        objConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("DC2_Data_WarehouseConnectionString_PRODUCTION").ConnectionString)

        ' Insert record
        strSQL = "INSERT INTO [data_warehouse].[dbo].[t_d_ATracker] ([PortalID],[asset_SN],[Fill_Qty],[Maint_Date],[asset_location],[asset_model],[active_indicator],[Asset_Notes]) " &
                         "VALUES (@PortalID, @asset_SN, @Fill_Qty, @Maint_Date, @asset_location, @asset_model, @active_indicator, @Asset_Notes);" &
                         "SELECT CAST(scope_identity() AS int);"
        Dim cmd As New SqlCommand(strSQL, objConnection)

        ' Add parameters
        cmd.Parameters.Add("@PortalID", SqlDbType.VarChar, 10).Value = portalIDEditor.TextBoxControl.Text
        cmd.Parameters.Add("@asset_SN", SqlDbType.VarChar, 20).Value = assetSNEditor.TextBoxControl.Text

        ' Handle Fill_Qty conversion
        Dim fillQty As Integer
        If Integer.TryParse(fillQtyEditor.TextBoxControl.Text, fillQty) Then
            cmd.Parameters.Add("@Fill_Qty", SqlDbType.Int).Value = fillQty
        Else
            cmd.Parameters.Add("@Fill_Qty", SqlDbType.Int).Value = DBNull.Value
        End If

        ' Handle Maint_Date conversion
        Dim maintDate As Date
        If Date.TryParse(maintEditor.TextBoxControl.Text, maintDate) Then
            cmd.Parameters.Add("@Maint_Date", SqlDbType.Date).Value = maintDate
        Else
            cmd.Parameters.Add("@Maint_Date", SqlDbType.Date).Value = DBNull.Value
        End If

        ' Handle Active_Indicator conversion
        cmd.Parameters.Add("@active_indicator", SqlDbType.Bit).Value = actIndEditor.CheckBoxControl.Checked

        cmd.Parameters.Add("@asset_location", SqlDbType.VarChar, 20).Value = assetLocEditor.TextBoxControl.Text
        cmd.Parameters.Add("@asset_model", SqlDbType.VarChar, 20).Value = assetModelEditor.TextBoxControl.Text
        cmd.Parameters.Add("@Asset_Notes", SqlDbType.VarChar, -1).Value = notesEditor.TextBoxControl.Text
    End If
End Sub

Key Adjustments:

  1. Accessing TextBoxControl Property: For fillQtyEditor, portalIDEditor, assetSNEditor, assetModelEditor, assetLocEditor, and notesEditor, use the TextBoxControl.Text property to get the text value.
  2. Conversion Handling: Use Integer.TryParse and Date.TryParse to handle conversions safely and set DBNull.Value if the conversion fails.
  3. CheckBoxControl Property: For actIndEditor, use the CheckBoxControl.Checked property to get the boolean value.

These adjustments should help you avoid the InvalidCastException and handle the null values correctly. If you encounter further issues, please provide additional details, and I will be happy to assist.

 

    Regards,
    Rumen
    Progress Telerik

    Stay tuned by visiting our public roadmap and feedback portal pages! Or perhaps, if you are new to our Telerik family, check out our getting started resources
    Tags
    Grid
    Asked by
    cest
    Top achievements
    Rank 1
    Iron
    Answers by
    Rumen
    Telerik team
    Share this question
    or