【问题标题】:When trying to fill a comboBox with list, get "Object reference not set to an instance of an object" error尝试用列表填充组合框时,出现“对象引用未设置为对象实例”错误
【发布时间】:2015-06-11 13:18:06
【问题描述】:

我已阅读有关此错误的所有其他问题(并且有很多),但找不到任何相关内容,所以我在这里。我正在尝试用我创建的列表的内容填充dropdown (cmbEditProjType),然后根据选择的项目编号,显示cmbEditProjType 的文本将是该项目的类型.这使他们能够在需要时进行更改。

上面提到的错误指向我的comboBox。我尝试在向其中添加项目之前对其进行初始化,但出现错误;试图硬编码列表项之一,而不是从数据库中提取,得到错误。如果您需要任何其他信息,请友好地询问...

    Sub fillJobNoDropdown()

    cmbEditJobNo.Text = ""
    txtEditProjNo.Text = ""
    cmbEditProjNo.Text = ""
    txtEditProjName.Text = ""
    'cmbEditProjType.Items.Clear()  ERROR SHOWS HERE WHEN NOT CLEARED, ALSO TRIED = ""
    txtEditProjTypeDesc.Text = ""
    txtEditProjCost.Text = ""
    txtEditProjBudget.Text = ""

    'get values to populate Job No. dropdown with active projects
    Dim fillJobNo As New SqlCommand("SELECT Distinct JobNo from PT_Project WHERE Active = '1' and Deleted = '0'")
    Dim dr As SqlDataReader = fillJobNo.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            cmbEditJobNo.Items.Add(dr("JobNo))
        Else

        End If
    End While
    dr.Close()

End Sub

Sub fillProjNoDropdown()

    cmbEditJobNo.Text = ""
    txtEditProjNo.Text = ""
    cmbEditProjNo.Text = ""
    txtEditProjName.Text = ""
    'cmbEditProjType.Text = ""   SAME THING: ERROR WHEN UNCOMMENT
    txtEditProjTypeDesc.Text = ""
    txtEditProjCost.Text = ""
    txtEditProjBudget.Text = ""

    Dim fillProjNo As New SqlCommand("SELECT ProjNo FROM PT_Project WHERE JobNo= '" & cmbEditJobNo.Text & "'")
    Dim dr As SqlDataReader = fillProjNo.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            If IsDBNull(dr("ProjNo")) Then
                cmbEditProjNo.Visible = False
                txtEditProjNo.Visible = True
                txtEditProjNo.Text = ""
                txtEditProjNo.Focus()
            Else
                cmbEditProjNo.Visible = True
                txtEditProjNo.Visible = False
                cmbEditProjNo.Items.Add(dr("RICC"))
            End If
        Else
            cmbEditProjNo.Visible = False
            txtEditProjNo.Visible = True
            txtEditProjNo.Text = ""
            txtEditProjNo.Focus()
            'if this happens and when saving will need to know if update or new
        End If
    End While
    dr.Close()

End Sub

Private Sub cmbEditJobNo_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbEditJobNo.GotFocus

    Call fillJobNoDropdown()

End Sub

Private Sub cmbEditJobNo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbEditJobNo.SelectedIndexChanged

    Call fillProjNoDropdown()

End Sub

Private Sub cmbEditProjNo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbEditProjNo.SelectedIndexChanged

    Dim fillProjProjNo As New SqlCommand("SELECT ProjectName, ProjectType, ProjectTypeDescription, ProjectCost, ProjectBudgeted FROM PT_Project WHERE JobNo = '" & cmbEditJobNo.Text & "' AND ProjNo = '" & cmbEditProjNo.Text & "'")

    Dim dr As SqlDataReader = fillProjProjNo.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            txtEditProjName.Text = dr("ProjectName")

            Dim valuesA As List(Of String) = New List(Of String)
            valuesA.Add("Home")
            valuesA.Add("Work")
            valuesA.Add("Maintain")
            valuesA.Add("Pool")
            valuesA.Add("Lawn")                

            'Filter distinct elements, and convert back into list
            Dim resultA As List(Of String) = valuesA.Distinct().ToList
            'Display result
            For Each elementA As String In resultA
                cmbEditProjType.Items.Add(elementA)
                cmbEditProjType.Text = dr("ProjectType")
            Next

            txtEditProjTypeDesc.Text = dr("ProjectTypeDescription")

            If IsDBNull(dr("ProjectCost")) Then
                txtEditProjCost.Text = 0.ToString("c")
            Else
                Dim formatProjCost As Decimal = dr("ProjectCost")
                txtEditProjCost.Text = formatProjCost.ToString("c")
            End If

            If IsDBNull(dr("ProjectBudgeted")) Then
                txtEditProjBudget.Text = 0.ToString("c")
            Else
                Dim formatProjBudg As Decimal = dr("ProjectBudgeted")
                txtEditProjBudget.Text = formatProjBudg.ToString("c")
            End If
            Exit Sub
            dr.Close()
        End If
    End While
    dr.Close()

End Sub

Private Sub txtEditProjNo_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtEditProjNo.GotFocus

    txtEditProjNo.ReadOnly = True
    Dim fillProj As New SqlCommand("SELECT ProjectName, ProjectType, ProjectTypeDescription, ProjectCost, ProjectBudgeted FROM PT_Project WHERE JobNo = '" & cmbEditJobNo.Text & "'")

    Dim dr As SqlDataReader = fillProj.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            txtEditProjName.Text = dr("ProjectName")

            Dim valuesB As List(Of String) = New List(Of String)
            valuesB.Add("Home")
            valuesB.Add("Work")
            valuesB.Add("Pool")
            valuesB.Add("Maintain")
            valuesB.Add("Lawn")

            Dim resultB As List(Of String) = valuesB.Distinct().ToList
            For Each elementB As String In resultB
                cmbEditProjType.Items.Add(elementB)
                cmbEditProjType.Text = dr("ProjectType")
            Next

            txtEditProjTypeDesc.Text = dr("ProjectTypeDescription")

            If IsDBNull(dr("ProjectCost")) Then
                txtEditProjCost.Text = 0.ToString("c")
            Else
                Dim formatProjCost As Decimal = dr("ProjectCost")
                txtEditProjCost.Text = formatProjCost.ToString("c")
            End If

            If IsDBNull(dr("ProjectBudgeted")) Then
                txtEditProjBudget.Text = 0.ToString("c")
            Else
                Dim formatProjBudg As Decimal = dr("ProjectBudgeted")
                txtEditProjBudget.Text = formatProjBudg.ToString("c")
            End If
            Exit Sub
            dr.Close()
        Else
        End If
    End While
    dr.Close()

End Sub


Private Sub btnSaveProject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveProject.Click

    Dim JobNo = cmbEditJObNo.Text
    Dim ProjNo = cmbEditProjNo.Text
    Dim ProjName = txtEditProjName.Text
    Dim ProjType = cmbEditProjType.Text
    Dim ProjTypeDesc = txtEditProjTypeDesc.Text
    Dim ProjCost = txtEditProjCost.Text
    Dim ProjBudg = txtEditProjBudget.Text

    'comfirm changes
    Dim Reply As String = ""

    If ProjName = "" Or ProjType = "" Then
        MsgBox("Project Name and Project Type are required to be filled in.")
    Else
        Reply = MsgBox("I am ready to SAVE / UPDATE Project " & JobNo & " / Project No. " & ProjNo & ". Do you wish to continue?", vbYesNo)

        If Reply = vbYes Then
            'Update database based on changes made my user (from stored procedure)
            Dim dbUpdate As New SqlCommand("PT_AddManageProjects", frmMainMenu.DB)
            dbUpdate.CommandType = CommandType.StoredProcedure

            dbUpdate.Parameters.Add(New SqlParameter("@SPUse", 1))
            dbUpdate.Parameters.Add(New SqlParameter("@JobNo", JobNo))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjNo", ProjNo))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjectName", ProjName))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjectType", ProjType))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjectTypeDescription", ProjTypeDesc))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjectCost", ProjCost))
            dbUpdate.Parameters.Add(New SqlParameter("@ProjectBudgeted", ProjBudg))
            dbUpdate.Parameters.Add(New SqlParameter("@Deleted", DBNull.Value))
            dbUpdate.Parameters.Add(New SqlParameter("@Active", DBNull.Value))

            dbUpdate.ExecuteNonQuery()
            MsgBox("Project " & JobNo & " / Project No. " & ProjNo & " saved successfully.")
        Else
            'if no do nothing, go back to form
        End If
    End If

End Sub

Private Sub txtEditProjectName_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtEditProjCost.LostFocus, txtEditProjBudget.LostFocus

    'validates that budget and cost are numeric values
    If txtEditProjBudget.Text = "" Then Exit Sub

    If Not IsNumeric(txtEditProjBudget.Text) Then
        MsgBox("Please enter a numeric Budget value")
        txtEditProjBudget.Focus()
        Exit Sub
    End If

    If txtEditProjCost.Text = "" Then Exit Sub

    If Not IsNumeric(txtEditProjCost.Text) Then
        MsgBox("Please enter a numeric Cost value")
        txtEditProjCost.Focus()
        Exit Sub
    End If

End Sub

Private Sub btnDeleteProject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeleteProject.Click

    Dim JobNo = cmbEditJobNo.Text
    Dim ProjNo = cmbEditProjNo.Text
    Dim ProjName = txtEditProjName.Text
    Dim ProjType = cmbEditProjType.Text
    Dim ProjTypeDesc = txtEditProjTypeDesc.Text
    Dim ProjCost = txtEditProjCost.Text
    Dim ProjBudg = txtEditProjBudget.Text

    'check if changes have been made to any of the data first (compared to database)
    Dim compareProj As New SqlCommand("SELECT ProjectName, ProjectType, ProjectTypeDescription, ProjectCost, ProjectBudgeted FROM PT_Project WHERE JobNo = '" & JObNo & "' AND ProjNo = '" & ProjNo & "'", frmMainMenu.DB)
    Dim dr As SqlDataReader = compareProj.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            'if changes have been made, show error
            If ProjName <> dr("ProjectName") Or ProjType <> dr("ProjectType") Or ProjTypeDesc <> dr("ProjectTypeDescription") Then
                MsgBox("If you are attempting to delete a project, you cannot change any fields.  Please close this window and try again.  If needed, clear all fields and restart.")
                dr.Close()
                Exit Sub
            End If
        End If
    End While
    dr.Close()

    'comfirm delete
    Dim Reply As String = ""

    If ProjName = "" Or ProjType = "" Then
        MsgBox("Project Name and Project Type required to be filled in.")
    Else
        Reply = MsgBox("I am ready to DELETE Project " & JobNo & " / Project No. " & ProjNo & ". Do you wish to continue?", vbYesNo)
        If Reply = vbYes Then
            'if no changes, confirm delete, then change deleted to '1' and active to '0'
            Dim dbDelete As New SqlCommand("PT_AddManageProjects", frmMainMenu.DB)
            dbDelete.CommandType = CommandType.StoredProcedure

            dbDelete.Parameters.Add(New SqlParameter("@SPUse", 2))
            dbDelete.Parameters.Add(New SqlParameter("@JobNo", JobNo))
            dbDelete.Parameters.Add(New SqlParameter("@ProjNo", ProjNo))
            dbDelete.Parameters.Add(New SqlParameter("@ProjectName", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@ProjectType", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@ProjectTypeDescription", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@ProjectCost", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@ProjectBudgeted", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@Deleted", DBNull.Value))
            dbDelete.Parameters.Add(New SqlParameter("@Active", DBNull.Value))

            dbDelete.ExecuteNonQuery()

            MsgBox("Project " & JobNo & " / Project No. " & ProjNo & " deleted succesfully.")
            cmbEditJobNo.Items.Clear()
            'call sub to clear fields and update jobno dropdown with only active non-deleted projects
            Call fillJobNoDropdown()
        Else
            'if no do nothing, go back to form
        End If
    End If

End Sub

Private Sub optAdd_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optAdd.CheckedChanged

    If optAdd.Checked = True Then
        grpEdit.Visible = False
        grpAdd.Visible = True
    End If

End Sub

Private Sub btnAddNewProject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddNewProject.Click

    Dim JobNo = txtAddJobNo.Text
    Dim ProjNo = txtAddProjNo.Text
    Dim ProjName = txtAddProjName.Text
    Dim ProjType = cmbAddProjType.Text
    Dim ProjTypeDesc = txtAddProjTypeDesc.Text
    Dim ProjCost = txtAddProjCost.Text
    Dim ProjBudg = txtAddProjBudget.Text

    Dim readProj As New SqlCommand("SELECT JobNo, ProjNo FROM PT_Project")
    Dim dr As SqlDataReader = readProj.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            If JobNo = "" Or ProjNo = "" Or ProjName = "" Or ProjType = "" Then
                MsgBox("Project Number, Project Name, and Project Type are all required to be filled in.")
                txtAddJobNo.Focus()
                dr.Close()
                Exit Sub
            ElseIf JobNo = dr("JobNo") AndAlso ProjNo = dr("ProjNo") Then
                txtAddJobNo.Focus()
                MsgBox("The combination of Job and Project numbers you've entered already exists.")
                txtAddProjNo.Focus()
                dr.Close()
                Exit Sub
            Else
            End If
        End If
    End While
    dr.Close()

    'comfirm changes
    Dim Reply As String = ""

    Reply = MsgBox("I am ready to ADD Project?", vbYesNo)

    If Reply = vbYes Then
        Dim dbAdd As New SqlCommand("PT_AddManageProjects", frmMainMenu.DB)
        dbAdd.CommandType = CommandType.StoredProcedure
        dbAdd.Parameters.Add(New SqlParameter("@SPUse", 3))
        dbAdd.Parameters.Add(New SqlParameter("@JobNo", JobNo))
        dbAdd.Parameters.Add(New SqlParameter("@ProjNo", ProjNo))
        dbAdd.Parameters.Add(New SqlParameter("@ProjectName", ProjName))
        dbAdd.Parameters.Add(New SqlParameter("@ProjectType", ProjType))
        dbAdd.Parameters.Add(New SqlParameter("@ProjectTypeDescription", ProjTypeDesc))
        dbAdd.Parameters.Add(New SqlParameter("@ProjectCost", ProjCost))
        dbAdd.Parameters.Add(New SqlParameter("@ProjectBudgeted", ProjBudg))
        dbAdd.Parameters.Add(New SqlParameter("@Deleted", DBNull.Value))
        dbAdd.Parameters.Add(New SqlParameter("@Active", DBNull.Value))
        dbAdd.ExecuteNonQuery()

        MsgBox("Project has been added succesfully.")
        'clear the form after successful addition
        Call clearAddGroupbx()
    Else
    End If

End Sub

Private Sub txtAddProjNo_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtAddProjNo.LostFocus

    Dim readProj As New SqlCommand("SELECT JobNo, ProjNo FROM PT_Project")
    Dim dr As SqlDataReader = readProj.ExecuteReader()

    While dr.Read()
        If dr.HasRows = True Then
            If txtAddJobNo.Text = dr("JobNo") AndAlso txtAddProjNo.Text = dr("ProjNo") Then
                MsgBox("The combination of numbers you've entered already exists.")
                txtAddProjNo.Focus()
                dr.Close()
                Exit Sub
            End If
        End If
    End While
    dr.Close()

End Sub

Sub clearAddGroupbx()

    txtAddJobNo.Text = ""
    txtAddProjNo.Text = ""
    txtAddProjName.Text = ""
    cmbAddProjType.Text = ""
    txtAddProjTypeDesc.Text = ""
    txtAddProjCost.Text = ""
    txtAddProjBudget.Text = ""

End Sub

Sub clearEditGroupbx()

    cmbEditJobNo.Text = ""
    cmbEditProjNo.Text = ""
    txtEditRicc.Text = ""
    txtEditProjName.Text = ""
    cmbEditProjType.Text = ""
    txtEditProjTypeDesc.Text = ""
    txtEditProjCost.Text = ""
    txtEditProjBudget.Text = ""

End Sub

Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click

    Call clearAddGroupbx()
    Call clearEditGroupbx()

End Sub

Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click

    Me.Close()
    Me.Dispose()

End Sub

结束类

【问题讨论】:

  • 几乎所有的 NullReference 异常都有相同的原因。请参阅NullReference Exception in Visual Basic 以获取有关此方面的帮助。此代码位于何处?确切的线路是什么?
  • 请澄清: cmbEditProjType 是否设置为 Nothing?还是 cmbEditProjType.Items 设置为 Nothing?
  • 另外,回复:“我在向其中添加项目之前尝试对其进行初始化,得到了错误;试图硬编码列表项之一而不是从数据库中提取,得到了错误。” - 请出示你的初始化代码。
  • 它与 NullReferenceException 无关但是为什么你需要一个已经不同的不同项目的列表?我指的是价值观内容
  • 您甚至不需要 For Each。为什么不只是 cmbEditProjType.DataSource = 结果?或者直接 cmbEditProjType.DataSource = values

标签: vb.net winforms combobox


【解决方案1】:

原来问题在于我无意中将我的Generate Member 属性设置为false。在注意到这一点并将其改回true 之后,我能够简单地填充dropdownlist 的集合并使用.selectedtext 来显示从数据库中读取的内容。这可以解释为什么发布的其他问题都没有帮助我。现在感觉很傻……道歉。

【讨论】:

    【解决方案2】:

    我测试了你的代码:

    Dim values As List(Of String) = New List(Of String)
    values.Add("Home")
    values.Add("Office")
    values.Add("Garage")
    values.Add("Pool")
    values.Add("Lawn")
    values.Add("Maintain")
    values.Add("Education")
    
    'Filter distinct elements, and convert back into list
    Dim result As List(Of String) = values.Distinct().ToList
    'Display result
    For Each element As String In result
        cmbEditProjType.Items.Add(element)
    Next
    

    没有任何NullReferenceException 或其他例外。

    您的例外可能来自Dim dr As SqlDataReader = fillProjNo.ExecuteReader(),它没有从 SQL 获取任何数据!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-19
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多