2014-12-28 3 views
0

Я пробовал все методы здесь, но никто не работает для меня. Я хочу обновить ListView в Form1 из Form2 в vb.net, но ничего не происходит, когда я запускаю этот метод.update ListView из другой формы

Public Sub checkFoundList() 
    For Each item In myListView.Items 
     If Not File.Exists(item.SubItems(2).Text) Then 
      myListView.Items.Remove(item) 
     End If 
    Next 
End Sub 

Этот метод находится на Form1, и когда я запускаю его здесь, он отлично работает. Но если я назову это из Form2, это не так.

В Form2 я просто называю его:

Form1.checkFoundList() 

Я попытался также поставить модификатор Public к myListView, но до сих пор не работает. Также методы, описанные некоторыми пользователями, как использование событий, не работают. Очень странно.

Есть ли ListView специальный элемент управления?

+0

«Это не работает» не очень полезно. Если этот метод находится на FOrm1 со списком, он должен работать нормально. Проблема может быть связана с экземпляром формы по умолчанию. – Plutonix

+0

Как я уже сказал, его использование в Form1 отлично работает (например, нажмите кнопку 1 в Form1, вызывающем этот метод), если я вызываю его из Form2 (например, нажмите кнопку2 на Form2), это не сработает. Не работает, я имею в виду, что ничего не происходит, и никаких исключений не возникает. – xpirt

+0

WPF или WinForms? – Paparazzi

ответ

1

Одна из проблем, которые возникнут у вас, заключается в том, что вы изменяете элементы в списке, перечисляя его с помощью инструкции For Each. Это вызовет проблемы при удалении элемента.

Вместо перечисления его с For оператор работает назад поэтому индексы не смещаются при извлечении элемента:

Public Sub checkFoundList() 
    For i = myListView.Items.Count - 1 To 0 Step -1 
     Dim item As <TypeTheListViewHolds> = myListView.Items(i) 
     If Not File.Exists(item.SubItems(2).Text) Then 
      myListView.Items.RemoveAt(i) 
     End If 
    Next 
End Sub 

Я только адаптированный код вы предоставили (не зная, что myListView держит), но методология будет одинаковой независимо от типа данных.

Что касается вызова из Form2, убедитесь, что вы звоните checkFoundList из экземпляраForm1. Что-то вроде:

' Class variable in Form2 which has an instance of Form1. 
Private _form1 As Form1 

' New Form2 method. 
' Pass an instance of Form1 to the constructor of Form2. 
' This way this instance of Form2 will "know" about a Form1 object. 
Public Sub New(form1Object As Form1) 
    ' Initialization code. 

    ' Set the reference to Form1 in Form2 
    _form1 = form1Object 
End Sub 

Public Sub Form2Method() 
    _form1.checkFoundList 
End Sub 
+0

Что такое TypeTheListViewHolds? – xpirt

+0

Это решение отлично работает! :) – xpirt

+0

@xpirt - Рад, что это сработало. Что касается «TypeTheListViewHolds»: в вашем примере не было четкого описания того, какой тип данных/объект 'MyListView' удерживался. Поэтому я просто вставлял это в свой образец, чтобы показать, что вы должны заполнить соответствующий тип. –

0

Как уже упоминалось, было бы полезно увидеть ошибку, которую вы получаете. Но это, скорее всего, потому, что Form2 не имеет ссылки на Form1. Один из многих способов исправить это - установить владельца Form2 в Form1.

В Form1 при создании Form2 установить его владелец:

Dim f2 As Form2 = New Form2() 
f2.Owner = Me 
f2.ShowDialog() 

В Form2 получить ссылку на Form1 и получить доступ окна списка, в данном случае я получить доступ к простому текстовому коробу:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim f1 As Form1 = DirectCast(Me.Owner, Form1) 
    f1.TextBox1.Text = "Hello World" 
End Sub 
+0

с модификатором 'Public' на myListView он не работает ... btw, как я уже сказал, никаких ошибок или исключений не возникает, просто ничего не происходит. – xpirt

+0

Вы можете проглотить исключение где-нибудь. Чтобы разбить любые исключения, перейдите в меню Debug -> Exceptions. В окне «Исключение» установите флажок в столбце «Брошенный» для «Исключения общего времени выполнения языка». Нажмите «ОК». Теперь отлаживаем запуск вашего приложения и видим, если вы нарушите исключение. – Crowcoder