You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET从Form1传数据至Form2时ListView不新增行仅覆盖原有行问题

问题根因

你的问题核心是每次触发数据传递逻辑时,都创建了全新的Form2实例,新实例的ListView初始为空,添加数据后自然只会显示最新的一行,看起来像是覆盖了之前的内容。另外直接在Form2中引用Form1的实例控件的写法耦合度过高,后续维护容易出问题。

解决方法

步骤1:在Form1中声明Form2全局实例

不要每次触发数据传递时新建Form2对象,在Form1的类级别声明全局实例:

' 写在Form1类内部的最顶部,不要放到按钮点击等局部方法里
Private statusReportForm As New Form2

步骤2:给Form2添加公开的接收数据方法

不要直接在Form2中读取Form1的控件属性,改为通过公开方法接收参数,减少耦合:

' Form2内部新增以下方法
Public Sub AddNewOrder(recipientName As String, address As String, contactNumber As String, deliveryMode As String, deliveryDate As Date)
    Dim orderStatus As String = "Pending"
    Dim str(5) As String
    Dim lvItem As ListViewItem
    str(0) = recipientName
    str(1) = address
    str(2) = contactNumber
    str(3) = deliveryMode
    str(4) = deliveryDate.ToString("yyyy-MM-dd")
    str(5) = orderStatus
    lvItem = New ListViewItem(str)
    ListView1.Items.Add(lvItem)
    ' 需要传递后自动显示Form2可放开下面两行注释
    ' Me.Show()
    ' Me.BringToFront()
End Sub

步骤3:修改Form1的触发逻辑

将Form1中原来触发数据传递的逻辑(比如按钮点击事件)改为调用Form2的公开方法:

' Form1中提交数据的逻辑替换为以下内容
Dim recipientName As String = TextBox5.Text
Dim address As String = TextBox6.Text
Dim contactNumber As String = TextBox7.Text
Dim deliveryMode As String = If(ComboBox3.SelectedItem Is Nothing, "", ComboBox3.SelectedItem.ToString())
Dim deliveryDate As Date = DateTimePicker1.Value.Date
' 调用Form2的新增行方法
statusReportForm.AddNewOrder(recipientName, address, contactNumber, deliveryMode, deliveryDate)

可选优化(关闭Form2不销毁实例)

如果需要关闭Form2后重新打开还保留历史数据,可以在Form2中添加关闭事件逻辑,改为隐藏窗体而非释放:

Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    e.Cancel = True
    Me.Hide()
End Sub

内容的提问来源于stack exchange,提问作者MeltedIceCream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:06