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

Initialize_search()

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

generate_autocomplete()

' 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

クラスには、フォームのコントロールのインスタンスへの参照がありませ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 に答える
1

New が完了するまで、フォームは (完全には) 作成されません。your を追加するInitialize_searchと、最終的に `Main_form.RbtnR_avancee_contact.Checked' というステートメントになります。これは次の 2 つの点で間違っています。

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 に答える
0

希望どおりに機能したとしても、コードによれば、常にfield同じ値が含まれることになります (デザイナーで設定されたものは何でも)。

RbtnR_avancee_contact.Checked代わりに、このコードをイベント内に配置してみてください。または、オートコンプリート ボックスの TextChanged (およびユーザーが初めて何かを入力したときに初期化する) でさえ、チェックされた状態を調べて、オートコンプリート項目を設定します。

このアプローチでは、ユーザーが検索ボックスをまったく使用しない場合は、初期化する必要はありません。

于 2013-10-08T18:05:21.510 に答える