2013-07-27 3 views
3

В размещенном вопросе: «Проверить, открывается ли форма», ответ ниже был опубликован как правильный. Однако я хотел бы знать, как проверить, открыт ли какой-либо конкретный экземпляр формы перед его открытием; например, чтобы проверить, открывается ли экран редактирования одной и той же записи или форма для добавления новой записи, когда другая форма, чтобы сделать то же самое, уже открыта.Проверьте, открыт ли конкретный экземпляр формы в vb.net 2010

Ниже приведенный код является правильным ответом на исходный вопрос. Можно ли изменить его, чтобы делать то, что мне нужно? Заранее спасибо.

If Application.OpenForms().OfType(Of Form2).Any Then 

    MessageBox.Show ("Opened") 

Else 

    Dim f2 As New Form2 

    f2.Text = "form2" 

    f2.Show() 

End If 

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

В настоящее время я создаю дерево открытых форм, их имя, запись, которую они редактируют, и статус редактирования, а их закрытие обновляется в дереве. Ответ # 2 на первый взгляд кажется, что он может справиться с этими ситуациями, и нет необходимости иметь эту структуру данных в фоновом режиме, которая должна постоянно обновляться всякий раз, когда предпринимается действие. Возможно, можно сделать его более общим, чтобы его можно было легко использовать повторно из приложения в приложение.

+0

Что вы подразумеваете под конкретным случаем? Как вы будете различать один экземпляр? –

+0

Прежде чем вы решите сделать это таким образом, обязательно прочитайте [этот вопрос] (http://stackoverflow.com/questions/3751554/application-openforms-count-0-). Просто сохраните экземпляр формы в списке, чтобы вам не понадобилась помощь в поиске ее позже. –

+0

Спасибо, что сообщили об этом – smh

ответ

2

Да, это можно легко изменить, чтобы делать то, что вы ищете.

Вы должны добавить общественное свойство Key (или что вы хотите), чтобы Form2, а затем вы можете использовать метод ShowOrOpenForm ниже для достижения ваших целей:

Public Sub ShowOrOpenForm(sKey As String) 

    If ShowFormForKey(sKey) Then 
     MessageBox.Show("Opened") 
    Else 
     Dim f2 As New Form2 

     f2.Key = sKey 
     f2.Text = "form2" 
     f2.Show() 
    End If 
End Sub 

Private Function ShowFormForKey(sKey As String) As Boolean 

    For Each oForm As Form2 In Application.OpenForms().OfType(Of Form2)() 
     If oForm.Key = sKey Then 
      oForm.Show() 
      Return True 
     End If 
    Next 

    Return False 
End Function 
+0

Это хорошее начало, я думаю, для разработки метода отслеживания форм. К сожалению, переход с vb6 на .net удалил возможность отслеживать открытие форм. Мне еще нужно найти что-то, что соответствует этому, но я хотел бы найти нечто более простое, чем то, что я сейчас делаю. – smh

0

Родитель вашего экрана редактирования следует хранить информацию о текущем экране редактирования. Если ничего нет, экран редактирования не открывается. Если не-ничего, он установлен на текущий экран редактирования. В этом случае вам не нужна головная боль, связанная с OpenForms.

+0

Да, спасибо. что предотвратит ошибку, если она проверяется, открыта ли форма. – smh

+0

@smh: Если мой ответ полезен, не забудьте его перенести. – Neolisk

0

Я не нашел свойства формы VB.Net, которая достоверно указывает, что форма была показана и до сих пор не была удалена. Разочарование, как говорит @smh. Мое решение было похоже на предложение @Hans Passant: «сохранить список», хотя я использую коллекцию. @Hans Passant предложил другой пост, но это C# Post. Вот код для управления формой после Show и перед Close или Dispose в Visual Basic:

в использовании, я называю SetOpenForm при создании новой формы, RemoveOpenForm при закрытии формы (или когда Принимают по форме щелкает). Между этими двумя событиями Форма и все ее данные могут быть получены с использованием GetOpenForm & имени Формы. Он действителен, когда открыт только один экземпляр каждой формы.

Public Shared cOpenForms As Collection 'Place this at the top of your 
             'set of Forms, e.g. in your MyApp Class. 
cOpenForms = New Collection    'Place this in the load sequence of MyApp. 

Public Shared Sub SetOpenForm(NamedForm As Form) 
    'Saves an Open Form in the Collection of Open Forms 
    'Call this every time a New Form is created (if you want to revisit it). 
    MyApp.cOpenForms.Add(NamedForm) 
End Sub 

Public Shared Sub RemoveOpenForm(NamedForm As Form) 
    'Removes an Open Form in the Collection of Open Forms, if it is present. 
    'Silently ignores Forms that are not in the Collection. 
    'Call this every time a Form is finished with, Closed, Disposed. 
    If Not IsNothing(NamedForm) Then 
     If MyApp.cOpenForms.Contains(NamedForm.Name) Then 
      MyApp.cOpenForms.Remove(NamedForm.Name) 
    End If 
End Sub 
Public Shared Function GetOpenForm(FormName As String) As Form 
    'Retrieves a Form if it is in the Collection of Open Forms 
    'Call this to retrieve Form FormName; then check for IsNothing. 
    For Each f As Form In MyApp.cOpenForms 
     If f.Name = FormName Then 
      Return f 
     End If 
    Next 
    Return Nothing 
End Function 
Смежные вопросы