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

如何在ListView点击空白行时保持Selected属性为true?

解决方案

要解决ListView点击空白行丢失选中状态的问题,核心是通过MouseDown事件捕获空白区域的点击操作,手动恢复之前的选中项;同时结合状态变量记录选中状态,处理Light/Time变化时的禁用逻辑。

步骤1:记录当前选中项

定义一个私有变量保存当前选中的ListViewItem,确保在状态变化时能快速恢复:

private ListViewItem _currentSelectedItem;

在SelectedIndexChanged事件中更新这个变量:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
        _currentSelectedItem = listView1.SelectedItems[0];
    }
}

步骤2:处理空白区域点击

利用MouseDown事件(该事件会触发所有点击操作,包括空白区域),通过HitTest判断点击位置是否为空白行,若是则恢复之前的选中状态:

private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    var hitTestResult = listView1.HitTest(e.X, e.Y);
    // 点击的是空白区域(无对应ListViewItem)
    if (hitTestResult.Item == null)
    {
        listView1.SelectedItems.Clear();
        if (_currentSelectedItem != null)
        {
            _currentSelectedItem.Selected = true;
            _currentSelectedItem.EnsureVisible(); // 可选:确保选中项可见
        }
        e.Handled = true; // 阻止后续事件改变选中状态
    }
}

步骤3:处理Light/Time变化的禁用逻辑

当Light或Time值变化时,禁用ListView并保持当前选中状态:

// 示例:Light/Time值变化时调用此方法
private void HandleLightOrTimeChanged()
{
    listView1.Enabled = false;
    // 确保选中状态不丢失
    if (_currentSelectedItem != null)
    {
        _currentSelectedItem.Selected = true;
    }
}

补充:点击外部区域保持选中高亮

默认情况下,ListView失去焦点时选中项的高亮会隐藏,设置HideSelection为false可让选中状态在失去焦点时依然可见:

// 可在设计器设置,或代码初始化时添加
listView1.HideSelection = false;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:32:33