2015-10-13 3 views
-1

Я пытаюсь загрузить форму вуправления не отображается при загрузке формы

Dim f as New Form2 
f.show() 

Форма становится загруженной, но он не показывает все элементы управления. У меня есть две кнопки и два текстовых поля. Обе кнопки и одно текстовое поле становятся прозрачными. Форма появляется так, пока не закончится текущая подпрограмма.

Кроме того, форма при загрузке должна отображать текст, полученный из базы данных, и отображать текст (возвращенный снова с равным интервалом от db), если пользователь явно не закрывает приложение. Эта логика также находится в событии Form2_Load.

Как написать логику, чтобы форма2 отображалась правильно и получает текст из db на регулярном интервале.

Я создаю словарь, как приложение для домена здравоохранения. Он работает в двух режимах. Одним из режимов является режим ленты, где создается форма (форма отмечена как самая верхняя), которая должна отображать термин и определение до тех пор, пока приложение остается в живых. Следовательно, вы видите бесконечный цикл. Когда пользователь нажимает кнопку закрытия или нажимает X, приложение закрывается.

Я играл с кодом и переносил его с загрузки даже на указанное событие. Однако проблема сохраняется.

Private Sub Form2_Shown(ByVal sender As Object, ByVal e As EventArgs) _ 
Handles MyBase.Shown 

    Dim myConnection As OleDbConnection = New OleDbConnection 
    Dim idSelected, queryGetWordDef, totalRows 
    Dim rowReturned, queryGetMaxID, provider, ipath, dataFile, connString As String 
    Dim dict() As String 
    Dim dr1 As OleDbDataReader 
    Dim dt As DataTable = New DataTable 

    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 

    ipath = Application.StartupPath 

    dataFile = ipath & "\Database\database1.mdb" ' Change it to your Access Database location 

    connString = provider & dataFile 

    myConnection.ConnectionString = connString 

    queryGetMaxID = "SELECT ID FROM Table1" 
    myConnection.Open() 
    Dim cmd As OleDbCommand = New OleDbCommand(queryGetMaxID, myConnection) 
    Try 
     dr1 = cmd.ExecuteReader() 

    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 

    dt.Load(dr1) 

    totalRows = dt.Rows.Count 

    While True 
     idSelected = dt.Rows.Item(CInt(totalRows * Rnd()) + 1)(0) 
     queryGetWordDef = "SELECT Word & ""@"" & Meaning FROM Table1 WHERE ID = " & CStr(idSelected) 

     cmd = New OleDbCommand(queryGetWordDef, myConnection) 
     Try 
      rowReturned = cmd.ExecuteScalar() 
     Catch ex As Exception 
      Console.WriteLine(ex.Message) 
     End Try 

     dict = rowReturned.Split("@") 

     Me.txtBoxDefinition.Text = dict(1) 
     Me.txtBoxTerm.Text = dict(0) 


     Thread.Sleep(5000) 

    End While 

End Sub 

Изображение формы прилагается для большей ясности.

enter image description here

+0

Возможно ли для вас показать код для формы 2? – Karlta05

+0

Элементы управления там, они просто не окрашены. Ваш поток пользовательского интерфейса делает что-то еще, чего он не должен делать. Как запрос к базе данных или попытка обработки массивной бури запросов на вызовы. Такая ошибка, которая требует просмотра кода, а не скриншота. –

+0

@HansPassant, я обновил код в своем исходном сообщении. Пожалуйста, дайте мне знать, если что-то еще понадобится с моей стороны. –

ответ

1

Как уже упоминалось, у вас есть бесконечный цикл. Цикл вводится до создания формы.

Чтобы добиться того, что вы запрашиваете вы должны смотреть на backgroundworker

Вы можете использовать это в сочетании с таймером, чтобы вызвать событие backgrounderworker DoWork().

Ссылка также содержит пример того, как обновить текст на форме.

+0

Спасибо за помощь. Спасибо вам и stackoverflow, я узнал что-то новое. –

+0

Сладкий человек. Рад помочь вам – Karlta05

1

У вас есть бесконечный цикл в обработчике Shown событий. Этот код выполняется в потоке пользовательского интерфейса, и он никогда не заканчивается, поэтому вы никогда не сможете ничего сделать в потоке пользовательского интерфейса.

Избавьтесь от этой петли в целом. Если вы хотите что-то делать каждые 5 секунд, используйте Timer с Interval из 5000.

+0

Хорошо, я должен был предоставить контекст перед вставкой кода. Я создаю словарь, как приложение для домена здравоохранения. Он работает в двух режимах. Один из режимов - это режим ленты, где создается форма (форма отмечена как самая верхняя), которая должна отображать термин и определение до тех пор, пока приложение живое (что-то похожее на wordweb). Следовательно, вы видите бесконечный цикл. Когда пользователь нажимает кнопку закрытия или нажимает X, приложение закрывается. –

+0

Почему бы не использовать таймер для обновления термина и определения (например, предложенный jmcilhinney) или искать термины по мере того, как пользователь вводит их, а затем обновлять определение при выборе термина? – Capellan

+0

То, что я сказал, все еще стоит. Бесконечный цикл в любом методе в потоке пользовательского интерфейса - это то, что НИКОГДА не должно произойти. – jmcilhinney

Смежные вопросы