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

如何从Form1更新Form2中ListView的指定记录?

WinForms跨窗体更新ListView问题解决

问题分析

你的代码存在两个关键问题:

  • 更新了错误的Form2实例:Form1点击按钮时每次都会新建一个showdata(Form2)对象,你修改的是这个隐藏的新窗体的ListView,而非用户正在查看的已打开Form2。
  • 空引用异常风险:Form2的frstName1方法直接访问listView1.SelectedItems[0],如果ListView没有选中任何项,会触发空引用错误。

解决方案

1. 保留Form2实例引用(适用于Form1打开Form2的场景)

在Form1中保存已打开的Form2实例,避免每次创建新对象:

// Form1中声明全局变量存储Form2实例
private showdata _openedShowForm;

// 打开Form2的按钮事件(示例)
private void buttonOpenForm2_Click(object sender, EventArgs e)
{
    _openedShowForm = new showdata();
    _openedShowForm.Show();
}

// 你的更新按钮事件
private void button3_Click(object sender, EventArgs e)
{
    // 检查Form2是否已打开且未被关闭释放
    if (_openedShowForm != null && !_openedShowForm.IsDisposed)
    {
        string inputText = textBox1.Text;
        _openedShowForm.frstName1(inputText);
    }
}

2. 获取已运行的Form2实例(适用于Form2独立打开的场景)

通过Application.OpenForms查找当前已打开的Form2对象:

private void button3_Click(object sender, EventArgs e)
{
    // 查找正在运行的showdata窗体
    var existingShowForm = Application.OpenForms.OfType<showdata>().FirstOrDefault();
    if (existingShowForm != null)
    {
        string inputText = textBox1.Text;
        existingShowForm.frstName1(inputText);
    }
}

3. 修复Form2的空引用问题

修改Form2的更新方法,先判断是否有选中项:

public void frstName1(string firstName)
{
    // 先检查是否有选中的条目
    if (listView1.SelectedItems.Count > 0)
    {
        listView1.SelectedItems[0].SubItems[0].Text = firstName;
    }
    // 可选:如果无选中项,默认更新第一个条目
    // else if (listView1.Items.Count > 0)
    // {
    //     listView1.Items[0].SubItems[0].Text = firstName;
    // }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:25:34