0

We have a dropdownlist in gridview that gets populated from the database.

There is a also a textbox next to this dropdownlist.

If the option the user is looking for isn't in the dropdown, enter that value into the textbox and when submitted to the database, will now become in the dropdownlist.

I am running into the following error:

Unable to cast object of type 'ASP.addtoroster_aspx' to type 'System.Web.UI.WebControls.GridViewRow'.

The error is on this line:

Dim parentRow As GridViewRow = DirectCast(button.NamingContainer, GridViewRow)

I believe this error occurs because I am using an imagebutton on the markup to submit to the database.

<asp:ImageButton ID="btnSave" runat="server" ImageUrl="images/save.png" 
                                             onmouseout="this.src='images/save.png'" 
                                             onmouseover="this.src='images/save.png'"

 OnClick="btnSave_Click" alt="Save Data" /> 

Any idea how to resolve this?

Even though this is vb, I welcome solution in c# if available.

Thank you!

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' Try
    SetRowData()
    Dim table As DataTable = TryCast(ViewState("CurrentTable"), DataTable)

    If table IsNot Nothing Then
        For Each row As DataRow In table.Rows
            Dim txLName As String = TryCast(row.ItemArray(1), String)
            Dim txName As String = TryCast(row.ItemArray(2), String)
            Dim txEmail As String = TryCast(row.ItemArray(3), String)
            Dim txRole As String = TryCast(row.ItemArray(4), String)
            Dim txPhone As String = TryCast(row.ItemArray(5), String)
            Dim drpEmpl As String = TryCast(row.ItemArray(6), String)
            Dim txVIP As String = TryCast(row.ItemArray(7), String)
            Dim drpLCB As String = TryCast(row.ItemArray(8), String)

            'Find the button
            Dim button As Button = DirectCast(sender, Button)
            'Find parent row
            Dim parentRow As GridViewRow = DirectCast(button.NamingContainer, GridViewRow)
            'find DropDownlist and textbox
            Dim ddl As DropDownList = TryCast(parentRow.FindControl("txtLoginName"), DropDownList)
            Dim txtNewUser As TextBox = TryCast(parentRow.FindControl("txtNewUser"), TextBox)
            If txtNewUser IsNot Nothing AndAlso ddl IsNot Nothing Then
                'add new listitem here
                Dim customItem As New ListItem(txtNewUser.Text, txtNewUser.Text)
                ddl.Items.Add(customItem)
            End If

            Dim ddlvalue As String = ""
            Dim idx As Integer = grvStudentDetails.EditIndex

            If drpEmpl = "Other" Then
                ddlvalue = DirectCast(grvStudentDetails.FindControl("txtOther"), TextBox).Text

                '   Else
                '      ddlvalue = drpEmpl
            End If


            If txLName IsNot Nothing OrElse txLName IsNot Nothing OrElse txEmail IsNot Nothing OrElse txRole IsNot Nothing OrElse txPhone IsNot Nothing OrElse drpEmpl IsNot Nothing OrElse txVIP IsNot Nothing OrElse drpLCB IsNot Nothing Then
                ' Response.Write(String.Format("{0} {1} {2} {3} {4} {5} {6} {7} <br/>", txLName, txName, txEmail, txRole, txPhone, drpEmpl, txVIP, drpLCB))

                'Try
                Dim dateentered As String = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")
                'Response.Write(dateentered)
                'Response.End()

                Dim s As String
                Dim count As Integer

                'If LoginName already exists, alert user
                s = "SELECT Count(*) FROM Employee_Roster WHERE login_id = " & txLName
                'Response.Write(s)
                'Response.End()
                Dim connSt As String = ConfigurationManager.ConnectionStrings("allstringconstrng").ConnectionString
                Dim connc As New OleDbConnection(connSt)
                Dim cmdc As New OleDbCommand(s, connc)
                'cmdc.Parameters.AddWithValue("login_id", txtLoginName.SelectedValue)
                connc.Open()
                ' cmdc.ExecuteNonQuery()
                count = cmdc.ExecuteScalar()


                '   Now let's see if we found existing record
                If count > 0 Then
                    'Display some feedback to the user to let them know it was processed
                    lblResult.ForeColor = System.Drawing.Color.Green
                    lblResult.Text = "User already is in the Excel Sheet!"
                Else
                    s = "INSERT INTO Employee_Roster(login_id, FullName, Email_Address, Role_Dept,Phone,Employer,VP,entryDate,Notes) VALUES "
                    s += "('" & txLName & "', '" & txName & "', '" & txEmail & "', '" & txRole & "', '" & txPhone & "', '" & ddlvalue & "','" & txVIP & "','" & dateentered & "', '" & drpLCB & "')"
                    Response.Write(s)
                    Response.End()
                    Dim connStr As String = ConfigurationManager.ConnectionStrings("allstringconstrng").ConnectionString
                    Dim conn As New OleDbConnection(connStr)
                    Dim cmd As New OleDbCommand(s, conn)
                    conn.Open()
                    cmd.ExecuteNonQuery()
                    conn.Close()


                    'Display some feedback to the user to let them know it was processed
                    lblResult.ForeColor = System.Drawing.Color.Green
                    lblResult.Text = "Record successfully saved!"

                    'Clear the form
                    txLName = ""
                    txLName = ""
                    txEmail = ""
                    txRole = ""
                    txPhone = ""
                    txVIP = ""
                End If
                ' Catch

                'If the message failed at some point, let the user know
                lblResult.ForeColor = System.Drawing.Color.Red
                lblResult.Text = "Your record failed to save, please try again."

                ' End Try

            End If
        Next
    End If
    '  Catch ex As Exception
    'Throw New Exception(ex.Message)
    ' End Try
End Sub
JayC
  • 7,053
  • 2
  • 25
  • 41
Kenny
  • 1,058
  • 4
  • 20
  • 49
  • The error is in that it's unable to perform the cast. Then why are you performing the cast in the first place? It looks as if the naming container is the page, not a GridViewRow, like somebody copy/pasted some code that worked with respect to a grid and failed to consider how things might work a little differently if the button were outside of a grid row. – JayC Feb 02 '13 at 16:47
  • So, what exactly is your point? – Kenny Feb 02 '13 at 16:50
  • Why are you performing the cast? – JayC Feb 02 '13 at 16:51
  • that has nothing to do with the problem – Kenny Feb 02 '13 at 16:56
  • Ok, since the code that you have assigns to a GridViewRow, that's why you are doing the cast.... ok then, but the error implies (I would think) that the NamingContainer of the button is the Page, *not* in a GridViewRow... That is, the button lives outside of a GridViewRow... something here doesn't add up. – JayC Feb 02 '13 at 16:57
  • Posting the code inside the `btnSave_Click` event would help us understand what you are trying to do. – Abdusalam Ben Haj Feb 02 '13 at 17:18
  • Sorry @AbZy, this is a lot of code and there is a whole lot more. That's why I posted as little as possible initially. The code allows users to fill a row, can add additional rows until done before submitting. Please let me know if you have additional question. – Kenny Feb 02 '13 at 17:31

2 Answers2

2

Its very clear that your controls are residing inside your page and casting button.NamingContainer to GridViewRow is invalid.

The solution is that you don't need to use the FindControl if your controls have this property set runat="server". Just use the ID you give to them.

One more thing to point out is you need to use parametrized queries. Your queries are prone to SQL Injection . check How do I create a parameterized SQL query? Why Should I?

Community
  • 1
  • 1
Abdusalam Ben Haj
  • 5,343
  • 5
  • 31
  • 45
  • et al, I thank you all for your comments. Problem is I still have not seen a comment on how to fix it. I get comments that it is outside gridview. Buttons usually are. What do I change on the following line of code? `Dim parentRow As GridViewRow = DirectCast(button.NamingContainer, GridViewRow)` All I am trying to do is that I have dropdownlist called txtLoginName. If the Option the user is looking for is not on this list, enter it into the texbox and when you submit your data to the database, it adds it to the dropdownlist. – Kenny Feb 02 '13 at 20:57
0
Dim parentRow As GridViewRow = DirectCast(button.NamingContainer, GridViewRow)

this button is out side of Gridview and this button belongs to ASP.addtoroster_aspx

but when you say button.NamingContainer it points ASP.addtoroster_aspx as it holds that

button,so casting is failing.

Kiran1016
  • 914
  • 4
  • 14