Vb.net 当试图用列表填充组合框时,获取;对象引用未设置为对象的实例;错误

Vb.net 当试图用列表填充组合框时,获取;对象引用未设置为对象的实例;错误,vb.net,winforms,combobox,Vb.net,Winforms,Combobox,我已经阅读了关于这个错误的所有其他问题(还有很多),但找不到任何相关的问题,所以我在这里。我试图用我创建的列表的内容填充下拉列表(cmbEditProjType),然后根据选择的项目编号,显示cmbEditProjType的文本将是该项目的类型。这使他们能够在需要时进行更改 我发现上面提到的错误指向我的组合框。在添加项目之前,我试图初始化它,但出现了错误;试图对列表项之一进行硬编码,而不是从数据库中提取,但出现错误。如果您需要任何其他信息,请友好地询问 Sub fillJobNoDrop

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

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

    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
Sub-fillJobNoDropdown()
cmbEditJobNo.Text=“”
txtEditProjNo.Text=“”
cmbEditProjNo.Text=“”
txtEditProjName.Text=“”
'cmbEditProjType.Items.Clear()未清除时,此处显示错误,也尝试了=“”
txtEditProjTypeDesc.Text=“”
txtEditProjCost.Text=“”
txtEditProjBudget.Text=“”
'获取值以使用活动项目填充作业编号下拉列表
Dim fillJobNo As New SqlCommand(“从PT_项目中选择不同的作业号,其中Active='1',Deleted='0'))
Dim dr As SqlDataReader=fillJobNo.ExecuteReader()
而里德博士
如果dr.HasRows=True,则
cmbEditJobNo.Items.Add(dr(“JobNo))
其他的
如果结束
结束时
克洛斯博士()
端接头
子填充projnodropdown()
cmbEditJobNo.Text=“”
txtEditProjNo.Text=“”
cmbEditProjNo.Text=“”
txtEditProjName.Text=“”
'cmbEditProjType.Text=”“相同的内容:取消注释时出错
txtEditProjTypeDesc.Text=“”
txtEditProjCost.Text=“”
txtEditProjBudget.Text=“”
Dim fillProjNo As New SqlCommand(“从PT_项目中选择ProjNo,其中JobNo='”&cmbEditJobNo.Text&“'))
Dim dr As SqlDataReader=fillProjNo.ExecuteReader()
而里德博士
如果dr.HasRows=True,则
如果是IsDBNull(dr(“ProjNo”)),则
cmbEditProjNo.Visible=False
txtEditProjNo.Visible=True
txtEditProjNo.Text=“”
txtEditProjNo.Focus()
其他的
cmbEditProjNo.Visible=True
txtEditProjNo.Visible=False
cmbEditProjNo.Items.Add(dr(“RICC”))
如果结束
其他的
cmbEditProjNo.Visible=False
txtEditProjNo.Visible=True
txtEditProjNo.Text=“”
txtEditProjNo.Focus()
'如果发生这种情况以及何时保存,则需要知道是更新还是新建
如果结束
结束时
克洛斯博士()
端接头
私有子cmbEditJobNo_GotFocus(ByVal sender作为对象,ByVal e作为System.EventArgs)处理cmbEditJobNo.GotFocus
调用fillJobNoDropdown()
端接头
私有子cmbEditJobNo\u SelectedIndexChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理cmbEditJobNo.SelectedIndexChanged
调用fillProjNoDropdown()
端接头
私有子cmbEditProjNo\u SelectedIndexChanged(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理cmbEditProjNo.SelectedIndexChanged
Dim fillProjProjNo作为新的SqlCommand(“选择项目名称、项目类型、项目类型说明、项目成本、从PT_项目预算的项目,其中作业编号='”&cmbEditJobNo.Text&“;ProjNo='”&cmbEditProjNo.Text&“”)
Dim dr As SqlDataReader=fillProjProjNo.ExecuteReader()
而里德博士
如果dr.HasRows=True,则
txtEditProjName.Text=dr(“项目名称”)
尺寸值A作为列表(字符串)=新列表(字符串)
价值a.添加(“主页”)
价值a.添加(“工作”)
价值a.添加(“维护”)
价值a.添加(“池”)
价值a.添加(“草坪”)
'筛选不同的元素,并转换回列表
Dim resultA作为列表(字符串)=值a.Distinct().ToList
'显示结果
对于结果中的每个元素A作为字符串
cmbEditProjType.Items.Add(elementA)
cmbEditProjType.Text=dr(“项目类型”)
下一个
txtEditProjTypeDesc.Text=dr(“项目类型描述”)
如果是IsDBNull(dr(“项目成本”)),则
txtEditProjCost.Text=0.ToString(“c”)
其他的
Dim formatProjCost作为十进制=dr(“项目成本”)
txtEditProjCost.Text=formatProjCost.ToString(“c”)
如果结束
如果IsDBNull(dr(“项目预算”)),则
txtEditProjBudget.Text=0.ToString(“c”)
其他的
Dim formatProjBudg As Decimal=dr(“项目预算”)
txtEditProjBudget.Text=formatProjBudg.ToString(“c”)
如果结束
出口接头
克洛斯博士()
如果结束
结束时
克洛斯博士()
端接头
私有子txtEditProjNo_GotFocus(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理txtEditProjNo.GotFocus
txtEditProjNo.ReadOnly=True
Dim fillProj As New SqlCommand(“选择项目名称、项目类型、项目类型说明、项目成本、从PT_项目预算的项目,其中作业号=””&cmbEditJobNo.Text&“”)
作为SqlDataReader的Dim dr=fillProj.ExecuteReader()
而里德博士
如果dr.HasRows=True,则
txtEditProjName.Text=dr(“项目名称”)
尺寸值B作为列表(字符串)=新列表(字符串)
价值某人加上(“家”)
价值某人加上(“工作”)
价值b.添加(“池”)
价值b.添加(“维护”)
价值某人加上(“草坪”)
Dim resultB As List(字符串)=valuesB.Distinct().ToList
对于resultB中作为字符串的每个元素B
cmbEditProjType.Items.Add(元素B)
cmbEditProjType.Text=dr(“项目类型”)
下一个
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