如何在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
相关产品推荐
相关产品推荐

