2014-02-15 4 views
0

Надеюсь, вы можете помочь, так как эта небольшая проблема была настоящей головной болью, и после длительных исследований я не нашел жизнеспособного решения.VB.NET Reloading Active Docked Forms

В моей программе используется номер оплаты служащего для извлечения данных из базы данных, при этом почти все формы состыкованы с использованием WeifenLuo. Когда номер оплаты изменен, он очищает наборы данных новой информацией, но мы не хотим, чтобы пользователям приходилось вручную закрывать все открытые закрытые окна - фактически каждое открытое окно должно обновляться с информацией нового сотрудника. Я пробовал .refersh(), .invalidate() - который, похоже, не перезагружает данные в каждом комбо/текстовом поле.

После долгих исследований я попытался это:

Private Sub tbPayNumber_KeyDown(sender As Object, e As KeyEventArgs) Handles tbPayNumber.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     Call Paynumber_Authentication() 

      'close and re-open any active forms 
      Dim table As New DataTable 
      table.Columns.Add("Forms", GetType(Form)) 

      For Each frm As Form In MdiChildren 
       table.Rows.Add(frm) 
      Next 

      For i = MdiChildren.Length - 1 To 0 Step -1 
       MdiChildren(i).Close() 
      Next 

      For i As Integer = 0 To table.Rows.Count - 1 
      Dim ResetForms = table.Rows(i)("Forms") 
       ResetForms.Show(pnlDockMain, DockState.Document) 
      Next 

    End If 

End Sub 

Если я запускаю код, как описано выше, я получаю раздражает MS разработана ошибка «Не удается получить доступ к объекту, расположенную».

Если изменить последнюю часть кода на:

For i As Integer = 0 To table.Rows.Count - 1 
     Dim ResetForms As New Form 
      ResetForms = table.Rows(i)("Forms") 
      ResetForms.Show(pnlDockMain, DockState.Document) 
Next 

Я получаю informous ошибку разрешения перегрузки на ResetForms.Show линии - слишком много аргументов.

Стоит сказать, что каждая форма будет получать любую информацию, необходимую ей при открытии формы, которая работает правильно. Любая помощь по перезагрузке каждой формы была бы оценена, так как единственный другой способ, о котором я могу думать, - перечислить каждое текстовое поле в каждой форме (более 30 форм) и дать им новые значения индивидуально - и вручную. Многие люди говорят об этой проблеме, принимая метод .IsDisposed и т. Д. Поэтому я надеюсь, что вы найдете элегантное решение.

Заранее спасибо, Шейн

+0

Я теперь удалось найти решение, которое работает - его не очень элегантно, так что если у вас есть какие-либо улучшения, пожалуйста, напишите. –

ответ

0
Private Sub tbPayNumber_KeyDown(sender As Object, e As KeyEventArgs) Handles tbPayNumber.KeyDown 

If e.KeyCode = Keys.Enter Then 
    Call Paynumber_Authentication() 
    Call Load_Employee() 

     'close and re-open any active forms 
     Dim table As New DataTable 
    table.Columns.Add("Forms", GetType(String)) 

    For Each frm As Form In MdiChildren 'load the name of each open form into a dataset 
     table.Rows.Add(frm.Name) 
    Next 

    For i = MdiChildren.Length - 1 To 0 Step -1 'closes all open docked windows 
     MdiChildren(i).Close() 


    Next 

    For i As Integer = 0 To table.Rows.Count - 1 

     Select Case table.Rows(i)("Forms") 
      Case "EmployeeDetails" 
       Dim LoadForm As New EmployeeDetails 
       EmployeeDetails.Show(pnlDockMain, DockState.Document) 
      Case "HomePage" 
       Dim LoadForm As New HomePage 
       HomePage.Show(pnlDockMain, DockState.Document) 
      Case "SOEInput" 
       Dim LoadForm As New SOEInput 
       SOEInput.Show(pnlDockMain, DockState.Document) 
     End Select 

    Next 

End If 

End Sub