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

如何在Form3中处理Form2的ListView控件ItemCheck事件

实现方案

要在不修改Form2代码的前提下,在Form3中处理Form2内ListView的ItemCheck事件,可根据Form2中ListView的访问权限选择对应方案,两种实现都不需要改动Form2的任何代码:

方案1:Form2的ListView为公开可访问状态

如果Form2里的listView1访问修饰符为public/internal,且在Form3实例化前已经完成创建,你只需在现有代码基础上补充取消订阅逻辑避免内存泄漏即可,优化后代码如下:

public partial class Form3 : Form
{
    private Form2 parentForm;

    public Form3(Form2 parentForm)
    {
        InitializeComponent();
        this.parentForm = parentForm;
        // 订阅事件,注意确保此时parentForm的listView1已经完成初始化,不会为空
        this.parentForm.listView1.ItemCheck += ListView1_ItemCheck;
        // Form3关闭时取消订阅,防止内存泄漏
        this.FormClosed += (s, e) => 
        {
            if(this.parentForm != null && this.parentForm.listView1 != null)
            {
                this.parentForm.listView1.ItemCheck -= ListView1_ItemCheck;
            }
        };
    }
   
    private void ListView1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        // 实现单选逻辑:新勾选的项生效,其余项自动取消勾选
        if (e.NewValue == CheckState.Checked)
        {
            foreach (ListViewItem item in parentForm.listView1.Items)
            {
                if (item.Index != e.Index)
                {
                    item.Checked = false;
                }
            }
        }
    }
}

注意:你原有代码判断的是e.CurrentValue,修改为判断e.NewValue更准确,避免刚取消勾选时触发不必要的遍历。

方案2:Form2的ListView为私有/动态创建状态

如果Form2的listView1是私有修饰符,或者是运行时动态创建的,可通过反射获取Form2中的ListView实例,再订阅事件:

public partial class Form3 : Form
{
    private Form2 parentForm;
    private ListView targetListView;

    public Form3(Form2 parentForm)
    {
        InitializeComponent();
        this.parentForm = parentForm;
        // 反射获取Form2中的listView1实例
        var fieldInfo = typeof(Form2).GetField("listView1", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
        targetListView = fieldInfo?.GetValue(parentForm) as ListView;
        
        if(targetListView != null)
        {
            targetListView.ItemCheck += ListView1_ItemCheck;
            this.FormClosed += (s, e) => 
            {
                targetListView.ItemCheck -= ListView1_ItemCheck;
            };
        }
        // 如果是动态创建的ListView,可监听Form2的ControlAdded事件,动态检测ListView创建后再订阅
        else
        {
            parentForm.ControlAdded += (s, e) =>
            {
                if(e.Control is ListView lv && lv.Name == "listView1")
                {
                    targetListView = lv;
                    targetListView.ItemCheck += ListView1_ItemCheck;
                }
            };
        }
    }
   
    private void ListView1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (e.NewValue == CheckState.Checked)
        {
            foreach (ListViewItem item in targetListView.Items)
            {
                if (item.Index != e.Index)
                {
                    item.Checked = false;
                }
            }
        }
    }
}

实现效果

效果演示图


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:39:00