0

データベースから入力されるグリッドビューにドロップダウンリストがあります。

このドロップダウンリストの横にもテキストボックスがあります。

ユーザーが探しているオプションがドロップダウンにない場合は、その値をテキスト ボックスに入力します。データベースに送信されると、ドロップダウン リストに表示されます。

次のエラーが発生しています。

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

エラーは次の行にあります。

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

マークアップでイメージボタンを使用してデータベースに送信しているため、このエラーが発生すると思います。

<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" /> 

これを解決する方法はありますか?

これは vb ですが、可能であれば c# での解決策を歓迎します。

ありがとうございました!

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
4

2 に答える 2

2

コントロールがページ内にあり、キャストが無効であるbutton.NamingContainerことは明らかです。GridViewRow

FindControl解決策は、 if your controls have this property setを使用する必要がないことですrunat="server"。あなたが彼らに与えたIDを使用するだけです。

指摘すべきもう 1 つの点は、パラメーター化されたクエリを使用する必要があることです。あなたのクエリはSQL インジェクションの傾向があります。checkパラメータ化された SQL クエリを作成するにはどうすればよいですか? どして私がこんな事に?

于 2013-02-02T17:53:44.780 に答える
0
Dim parentRow As GridViewRow = DirectCast(button.NamingContainer, GridViewRow)

このボタンはの外側にありGridview、このボタンはに属していますASP.addtoroster_aspx

しかし、あなたが言うとき、それが保持されていることを示していbutton.NamingContainerますASP.addtoroster_aspx

ボタンなので、キャストは失敗しています。

于 2013-02-02T17:47:39.640 に答える