2013-10-08 3 views
1

Итак, мне нужно сделать программу для клиента, и он хочет, чтобы в ней находилась панель поиска. Поэтому я сделал это, и все сработало отлично, но я поместил его в свою основную форму. Теперь я хочу, чтобы поместить его в классе, но когда я инициализировать программу, она дает мне следующую ошибкуИнициализировать неправильно с классами vb.net

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 

Есть ли что-то, чего я не понял, или это невозможно сделать так?

Edit: добавлена ​​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 
+0

К сожалению, забудьте удалить его .. Это не создает никаких проблем, потому что это не связана с Исследовательский класс –

+1

НЕТ! Оставьте 'InitializeComponent()' в Sub New и вытащите ВСЕ код и поместите его в FormShown. Вы не можете «инициализировать» другие вещи до того, как форма создаст эти вещи. – Plutonix

ответ

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 
+0

Я пробовал, но программа просто не начинается вообще. Даже если я помещаю MessageBox внутри события –

+0

Да, он сверлит до «generate_autocomplete», который будет ссылаться на форму до ее создания, И ссылается на нее неправильно. – Plutonix

+0

@ Marc-AndréTrahan вы помещаете msgbox внутри WHAT-события в десятки. Кстати, требуются изменения BOTH. Как программа запускается по форме или Sub Main? – Plutonix

0

Даже если бы вы работали так, как хотите, в соответствии с вашим кодом, это всегда приводило бы к field, содержащему то же значение (в зависимости от того, что было установлено в дизайнере).

Вместо этого попробуйте ввести этот код внутри RbtnR_avancee_contact.Checked. Или даже TextChanged для поля автозаполнения (и инициализировать его в первый раз, когда пользователь вводит что-либо), он будет проверять проверенное состояние и заполнять элементы автозаполнения.

При таком подходе, если ваш пользователь никогда не использует окно поиска, вам не нужно его инициализировать.

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) 
Смежные вопросы