如何强制 ListView 忽略单击/不突出显示单击的项目?
Posted
技术标签:
【中文标题】如何强制 ListView 忽略单击/不突出显示单击的项目?【英文标题】:How can I force a ListView to disregard clicking/not highlight a clicked item? 【发布时间】:2012-09-20 19:05:43 【问题描述】:由于我没有根据用户可能选择的内容处理 ListView 中的项目(处理总是使用列表中的所有内容),我想禁止选择可能使用户认为他在限制的项目对那个项目的处理(我已经有了 multiselect = false,所以这不是问题)。
【问题讨论】:
【参考方案1】:ListView
中没有任何属性可以禁用项目选择。
您可以做的是通过将事件处理程序附加到ItemSelectionChanged
来处理通知已选择项目的事件,然后取消选择该项目:
yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;
private void yourListView_ItemSelectionChanged(
object sender,
ListViewItemSelectionChangedEventArgs e)
if (e.IsSelected)
e.Item.Selected = false;
【讨论】:
【参考方案2】:添加到 Adriano Repettis 独奏中,我有类似的事情,我将我想阻止的项目变灰,他的解决方案阻止了蓝色突出显示,但项目仍然有焦点,这会导致问题项目的背景色设置为除白色以外的任何颜色,因为某些选定的行变为白色。为了解决这个问题,我建议添加以下行:
e.Item.Focused = false;
最终代码:
yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;
private void yourListView_ItemSelectionChanged(
object sender,
ListViewItemSelectionChangedEventArgs e)
if (e.Item.BackColor == Color.LightGray)
e.Item.Selected = false;
e.Item.Focused = false;
【讨论】:
【参考方案3】:该解决方案可能会导致闪烁。您可能想要捕获 mousedown 和 mouseup 事件。在 mousedown 中,您可以通过将 WM_SETREDRAW 消息发送到具有 0 wParam 的列表视图或通过调用 LockWindowUpdate 传递列表视图的窗口句柄来禁用列表视图的重绘。 例
SendMessage(listview.Handle, WM_SETREDRAW, 0, 0);
或者
LockWindowUpdate(listview.Handle);
在 mouseup 中,您将通过以下任一方法启用重绘。
SendMessage(listview.Handle, WM_SETREDRAW, 1, 0);
或者
LockWindowUpdate(IntPtr.Zero);
...而且,您不必立即使列表视图无效。必要时它会自己做。
请注意,您必须在此方法中执行 dllimports。
你觉得这有点矫枉过正吗?
这是另一个:
扩展 ListView 类,重写 WndProc,等待 WM_NOTIFY 反映到控件,检查 m.LParam 的前四个字节是否为 -100,如果是则设置 m.Result = (IntPtr)1是并且不将消息传递给 base.WndProc。
-100 是 LVN_ITEMCHANGING。通过 m.Result 返回 1 或 0 将不允许或允许更改发生。 m.LParam 的前四个字节是通知代码,接下来的四个字节是发送消息的控件的标识,第三个字节是发送消息的控件的窗口句柄。有关详细信息,请参阅 NMHDR 和 NMLISTVIEW 结构。 Google 是您的朋友。
不过,答案迟了。你可能会认为写这么久我花了好几年才完成。
【讨论】:
以上是关于如何强制 ListView 忽略单击/不突出显示单击的项目?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Listview 中获取选定的 SubItem 索引并突出显示它?