【问题标题】:update ListView from another form从另一个表单更新 ListView
【发布时间】:2014-12-28 13:08:08
【问题描述】:

我在这里尝试了用户的所有方法,但似乎没有一个对我有用。 我想从 vb.net 中的 Form2 更新 Form1 中的 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 是特殊控件吗?

【问题讨论】:

  • “它不起作用”不是很有帮助。如果该方法在带有列表视图的 FORm1 上,它应该可以正常工作。问题可能是使用了默认的表单实例。
  • 正如我所说,从 Form1 使用它可以正常工作(例如单击 Form1 上的 button1 调用该方法有效),如果我从 Form2 调用它(例如单击 Form2 上的 button2)它不会工作。不起作用是指什么都没有发生,也没有抛出异常。
  • 忘了说... WinForms。哦,如果你给我 C# 对我来说是一样的,我可以把它翻译成 vb。
  • 请说明如何从form2调用它,正如我所说,问题可能是您使用的是默认表单实例。
  • 好的,编辑了第一篇文章。

标签: .net vb.net basic


【解决方案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 调用它,请确保您是从Form1实例调用checkFoundList。比如:

' 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

【讨论】:

  • 什么是TypeTheListViewHolds?
  • @xpirt - 很高兴它成功了。关于“TypeTheListViewHolds”:您的示例不清楚MyListView 持有什么数据类型/对象。所以我只是将它插入到我的示例中,以显示您应该填写适当的类型。
  • 是的,后来我明白了 xD。再次感谢您的解决方案,祝您有愉快的一天!
【解决方案2】:

如前所述,查看您遇到的错误会很有帮助。但这很可能是因为 Form2 没有对 Form1 的引用。解决此问题的多种方法之一是将 Form2 的所有者设置为 Form1。

在创建 Form2 时在 Form1 中设置其所有者:

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

【讨论】:

  • 在 myListView 上使用修饰符 Public 它不起作用...顺便说一句,正如我所说,没有抛出任何错误或异常,只是没有任何反应。
  • 您可能在某处吞下了异常。要中断任何异常,请转到菜单 Debug -> Exceptions。在“异常”窗口中,选中“引发”列中的“公共语言运行时异常”复选框。单击“确定”。现在调试运行您的应用程序,看看您是否因异常而中断。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多