1

所以,我需要为客户做一个程序,他想要一个搜索栏。所以我做到了,一切都很完美,但我把它放在了我的主要形式中。现在,我想把它放在一个类中,但是当我初始化程序时,它给了我以下错误

An error occurred while creating the form. For more information, 
see Exception.InnerException. The error is: The form is self-reference during
construction from a default instance, which led to infinite recursion. In the
constructor of the form, refer to the form using 'Me'.

我试图把 Me.Rbtn_X... 放进去,但它不认识它。

初始化

' Main form
Public Sub New()
    InitializeComponent()
    Initialize_search()
End Sub

初始化搜索()

' Main form
' search is initialize like this :
' Dim search as New Research
Private Sub Initialize_search()
    search.generate_autocomplete()
End Sub

生成自动完成()

' Research class
Sub generate_autocomplete()  
    ' Main_form = Main form  
    Dim field = ""
    ' This is the place where the program fail
    If Main_form.RbtnR_avancee_contact.Checked Then
        field = "personneressource"
    Else
        field = "beneficiaire"
    End if
    ' ....
End Sub

有什么我不明白的,或者不可能那样做吗?

编辑:添加 Form_shown 事件

Public Sub New()
    InitializeComponent()
    ' Initialize_search()
End Sub

Private Sub Form_personne_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    MessageBox.Show("You are in the Form.Shown event.")
End Sub
4

3 回答 3

1

在新建完成之前,不会(完全)创建表单。通过将您添加Initialize_search到其中,它最终会导致语句“Main_form.RbtnR_avancee_contact.Checked”。这在两个方面是错误的:

1)表格还不存在,所以你不能参考它。(这就是“表单在构造过程中是自我引用”的错误含义)

2) ref 应该是 Me.RbtnR (这就是'使用'Me'引用表单的意思)

将您Initialize_search的活动转移到Form_shown活动中。您的代码应如下所示(包括 Lar 的建议)

' Main form
Public Sub New()
    ' REQUIRED
    InitializeComponent()

End Sub

如果确实需要为此设置一些东西,请将其添加到 form_shown 事件中:

Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) _
      Handles Me.Shown
      ' NOTE: even .NET refers to ME not MainForm etc

     InitializePanel 
     InitializeSeach

End Sub

然后:

Private Sub Initialize_search()
    search.generate_autocomplete(Me.RbtnR_avancee_contact.Checked)
End Sub

然后:

Sub generate_autocomplete(AdvContact as Boolean)  

    Dim field AS STRING = "" 

    If AdvContact  Then
        field = "personneressource"
    Else
        field = "beneficiaire"
    End if
   ' ....
End Sub
于 2013-10-08T17:54:40.470 回答
1

您的search类没有对表单控件实例的引用。

尝试传递值:

Sub generate_autocomplete(advancedChecked As Boolean) 
  Dim field As String = ""
  If advancedChecked Then
    field = "personneressource"
  Else
    field = "beneficiaire"
  End if
End Sub

然后当你调用它时:

search.generate_autocomplete(Me.RbtnR_avancee_contact.Checked)
于 2013-10-08T18:05:35.847 回答
0

即使确实像您希望的那样工作,根据您的代码,它总是会导致field包含相同的值(以设计器中设置的为准)。

相反,请尝试将此代码放入RbtnR_avancee_contact.Checked事件中。甚至是自动完成框的 TextChanged(并在用户第一次输入任何内容时对其进行初始化),它会检查选中状态并填充自动完成项。

使用这种方法,如果您的用户从不使用搜索框,则无需对其进行初始化。

于 2013-10-08T18:05:21.510 回答