7

由于我没有根据用户可能选择的内容处理 ListView 中的项目(处理始终使用列表中的所有内容),我想禁止选择可能使用户认为他将处理限制为那一项(我已经得到了 multiselect = false,所以这不是问题)。

4

3 回答 3

14

中没有任何属性可以禁用项目选择ListView

ItemSelectionChanged您可以做的是通过将事件处理程序附加到然后取消选择该项目来处理通知已选择项目的事件:

yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;

private void yourListView_ItemSelectionChanged(
    object sender,
    ListViewItemSelectionChangedEventArgs e)
{
   if (e.IsSelected)
      e.Item.Selected = false;
}
于 2012-09-28T21:47:15.980 回答
7

为了添加到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;
    }
}
于 2016-02-29T13:50:58.133 回答
1

该解决方案可能会导致闪烁。您可能想要捕获 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 和 don '不将消息传递给 base.WndProc。

-100 是 LVN_ITEMCHANGING。通过 m.Result 返回 1 或 0 将不允许或允许更改发生。m.LParam 的前四个字节是通知代码,接下来的四个字节是发送消息的控件的标识,第三个字节是发送消息的控件的窗口句柄。有关详细信息,请参阅 NMHDR 和 NMLISTVIEW 结构。谷歌是你的朋友。

不过,迟到的答案。你可能会认为写这么久我花了好几年才完成。

于 2021-07-11T18:20:39.320 回答