Vb.net 对象引用未设置为对象的实例。如何删除

Vb.net 对象引用未设置为对象的实例。如何删除,vb.net,Vb.net,我在表单form2中嵌入了一个userform,出于某种原因,我开始得到以下内容。 “对象引用未设置为对象实例”仅在form2的设计模式下 如果我通过“忽略并继续”并运行该项目,则表单工作正常,不会出现问题,并且错误消息仍然存在 单击此处查看错误的屏幕截图。 这是 下面是userform load事件的代码表单,我复制了触发错误的行。如果我注释掉这行,设计错误就会消失 If CType(Me.ParentForm.Owner, Form1).DataGridView1.Columns(col)

我在表单form2中嵌入了一个userform,出于某种原因,我开始得到以下内容。 “对象引用未设置为对象实例”仅在form2的设计模式下

如果我通过“忽略并继续”并运行该项目,则表单工作正常,不会出现问题,并且错误消息仍然存在

单击此处查看错误的屏幕截图。

这是

下面是userform load事件的代码表单,我复制了触发错误的行。如果我注释掉这行,设计错误就会消失

If CType(Me.ParentForm.Owner, Form1).DataGridView1.Columns(col).ReadOnly = False Then 



Public Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim DS As New PIMUserDBDataSet.ewosappendixDataTable
    Dim col As Integer


    DataGridView1.Rows.Add()

    With DS
        For col = 0 To .Columns.Count - 1
            If CType(Me.ParentForm.Owner, Form1).DataGridView1.Columns(col).ReadOnly = False Then                    ComboBox1.Items.Add(DS.Columns(col).ColumnName)
            End If
        Next
        ComboBox1.Sorted = True
    End With


End Sub
任何关于如何解决这一问题的建议都将不胜感激

谢谢

下面是加载/显示表单2的事件代码,因为它将帮助您识别form2/usercontrol1的父级

 Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ufm As New Form2
    ufm.Owner = Me


    ufm.Show()


End Sub
这是我的form1.vb.design

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
公开课表格1

Public filtermanger As DgvFilterManager

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ufm As New Form2

    'showing form2 which has the user control.
    ufm.Owner = Me
    ufm.Show()

End Sub

Private Sub DataGridView1_BindingContextChanged(sender As Object, e As EventArgs) Handles DataGridView1.BindingContextChanged
    Dim filtermanger As DgvFilterManager
    Dim idx As Integer

    filtermanger = New DgvFilterManager(DataGridView1)
    DataGridView1.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, DataGridView1, New Object() {True})

    With DataGridView1
        .EnableHeadersVisualStyles = False

        For Each col In DataGridView1.Columns

            'format (highlight) editable columns
            Select Case col.datapropertyname
                Case "execsummary", "custliab_1", "reqvendreturn_5", "pimvendreturn_6", "pmvendreturnesc_7", "bpsvertical"
                    idx = col.index
                    .Columns(idx).HeaderCell.Style.BackColor = Color.Wheat
                    .Columns(idx).HeaderCell.Style.Font = New Font(DataGridView1.Font, FontStyle.Bold)

                    If col.datapropertyname = "custliab_1" Then
                        .Columns(idx).ToolTipText = "Valid Values (uppercase):" _
                      & vbCrLf & "C : Customer Liable" _
                      & vbCrLf & "V : Vendor Liable(Returnable)" _
                      & vbCrLf & "R : Customer commitment but no Liability" _
                      & vbCrLf & "S : KGP Is Stuck With it As customer Is Not Liable. Cannot Return To vendor, but customer contract requires KGP to keep on hand." _
                      & vbCrLf & "N :  Not Liable (Customer Or Vendor)" _
                      & vbCrLf & "Blank"
                    End If
            End Select
        Next
    End With
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dc As DataColumn
    Dim idx As Integer
    Dim user As Integer

    'Form3 is the initial form the user see's.  they click one of two buttons.
    user = Form3.user
    For Each col In Me.PIMUserDBDataSet.ewosappendix.Columns
        Select Case user
            Case 1 'EWOS User
                dc = col
                idx = col.ordinal
                Select Case dc.ColumnName
                    Case "execsummary", "custliab_1", "reqvendreturn_5", "pimvendreturn_6", "pmvendreturnesc_7", "bpsvertical"
                        dc.ReadOnly = False
                        DataGridView1.Columns(idx).ReadOnly = False
                    Case Else
                        dc.ReadOnly = True
                        DataGridView1.Columns(idx).ReadOnly = True

                End Select
            Case 2 'Inv Anaylyst
                dc = col
                idx = col.ordinal
                Select Case dc.ColumnName
                    Case "reqvendreturn_5", "pimvendreturn_6", "pmvendreturnesc_7"
                        dc.ReadOnly = False
                        DataGridView1.Columns(idx).ReadOnly = False
                    Case Else
                        dc.ReadOnly = True
                        DataGridView1.Columns(idx).ReadOnly = True
                        'dcdt.ReadOnly = True
                End Select


            Case 3
                dc = col
                idx = col.ordinal
                Select Case dc.ColumnName

                    Case "execsummary", "custliab_1", "reqvendreturn_5", "pimvendreturn_6", "pmvendreturnesc_7", "bpsvertical", " ExecReview", "inventoryanalyst" &
                     ",EWOSClass", "custliab_1", "worker", "prodmgr", "owncode", "executive", "finalown"
                        dc.ReadOnly = False
                        DataGridView1.Columns(idx).ReadOnly = False
                    Case Else
                        dc.ReadOnly = True
                        DataGridView1.Columns(idx).ReadOnly = True
                        'dcdt.ReadOnly = True
                End Select
        End Select

    Next
    Me.EwosappendixTableAdapter.Fill(Me.PIMUserDBDataSet.ewosappendix)
End Sub
这里是Form2.vb.design

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>

由于控件通过Form2的Owner属性引用Form1,因此需要在初始值设定项运行之前设置它

对Form2的新方法进行如下扩充

Public Sub New(myOwner As Form1)

    Owner = myOwner

    ' This call is required by the designer.
    InitializeComponent()

End Sub
If me.parentform.owner IsNot Nothing then
    With DS
        For col = 0 To .Columns.Count - 1
            If CType(Me.ParentForm.Owner, Form1).DataGridView1.Columns(col).ReadOnly = False Then
            ComboBox1.Items.Add(DS.Columns(col).ColumnName)
            End If
        Next
        ComboBox1.Sorted = True
    End With
End If
那就这样说吧

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ufm As New Form2(Me)
    ufm.Show()
End Sub
我会将您的usercontrol更改为IDE中的安全控件,如下所示

Public Sub New(myOwner As Form1)

    Owner = myOwner

    ' This call is required by the designer.
    InitializeComponent()

End Sub
If me.parentform.owner IsNot Nothing then
    With DS
        For col = 0 To .Columns.Count - 1
            If CType(Me.ParentForm.Owner, Form1).DataGridView1.Columns(col).ReadOnly = False Then
            ComboBox1.Items.Add(DS.Columns(col).ColumnName)
            End If
        Next
        ComboBox1.Sorted = True
    End With
End If

当您在vs设计模式下打开用户控件时,会触发用户控件的加载事件,您可以添加一个检查条件,以便在它不在设计时加载,如:

bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

UserControl1
构造函数中发生了什么?你知道如何读取堆栈吗?用户控制代码的第21行是什么?根据我在InitializeComponent子表单2部分发布的代码。Me.Controls.Add(Me.UserControl11)需要更多信息。DataGridView1控件在usercontrol1或Form1中,还是两者都在?表单2是否具有用户控件UserControl1?我不清楚Form2或Usercotrol1的设计是否有问题?请评论该行并拍摄快照。同时检查UserControl1.Designer.vb的第21行。要使其可见,请在解决方案资源管理器中选择“全部显示”工具栏图标。不要忘记接受答案。谢谢,欢迎光临。