【问题标题】:Programmatically send click message to ListView to select/unselect item以编程方式向 ListView 发送点击消息以选择/取消选择项目
【发布时间】:2017-08-04 18:03:10
【问题描述】:

我有一个ListView,我在上面显示其他控件。当您单击其中一个控件并采取行动时,我可以捕获。我想要的是将点击通知发送到它下面的ListView,这样它就好像ListView 被点击了一样。因此它将选择/取消选择单击发生的ListView 中的项目。我想向ListView 发送点击消息,而不是手动选择/取消选择该项目,因为我不想尝试确定它是否是多选列表,按下了哪些键,哪些非-单击的项目需要保持选中或未选中状态,...理想情况下,我会向ListView 发送一个单击通知,它会采取所有适当的操作,就像它被单击一样。

我曾尝试从user32.dll 调用SendMessage - WM_NOTIFYOCM_NOTIFY 都使用NMITEMACTIVATE 结构作为lParam。我似乎无法让它工作。我也玩过OnNotifyMessage 电话,但没有运气。

我可以从列表视图顶部的控件中成功捕获单击事件,获取光标位置,将其转​​换为下方ListView 中的项目/子项目,......我只是无法以编程方式发送任何需要发送到ListView 的通知,以便它采取适当的措施。

编辑:

下面链接中的可能解决方案将允许单击通过控件传递到其下方的 ListView,但您必须为所有控件创建自定义类,并且您无法处理顶部控件中的任何单击事件。

【问题讨论】:

  • 似乎你只是过于复杂了你需要的东西。 “我不想尝试确定它是否是多选列表。” - 这是一个 1-liner
  • 如果它是一个多选列表,并且您向列表发送了一个点击事件,那么当没有按下 ctrl 按钮时,它应该表现得只选择一项。换句话说,我没有看到手动选择/取消选择时增加的复杂性。
  • 尝试和模拟 ListView 的逻辑会非常复杂。您需要知道 1) 是否是多选,2) 是否按下 ctrl 键,3) 是否按下 shift 键,4) 最后选择的项目是什么(如果选择了一个),5) 是当前选择的项目或不...虽然很容易得到所有这些的答案,但您需要根据这些变量的所有组合来编程选择和取消选择的内容 - 仅仅触发一个会变得混乱和容易得多向 ListView 发送消息并让它完成
  • 例如,如果它是多选并按下 Ctrl 键,您只需选择/取消选择单击发生的项目(并保留所有其他项目)。如果按下 Shift 键,您将需要知道最后选择的项目是什么,然后选择两者之间的所有项目(至少所有其他项目)。如果既没有按下 Ctrl 也没有按下 Shift 键,您将选择/取消选择单击发生的项目并取消选择任何其他已选择的项目。我相信这一切都是可能的,但如果有一种简单的方法可以告诉 ListView 来解决它,那将是理想的

标签: c# .net winforms listview


【解决方案1】:

您需要创建一个类来扩展位于 ListView 上的控件并覆盖其中一个事件。这是一个与您的问题非常相似的问题,应该对您有所帮助。 https://stackoverflow.com/a/8635626/3508142

【讨论】:

  • 谢谢。这让我更接近。该链接显示了如何在其上放置自定义标签类的示例,它将通过单击传递到列表视图。但是 1)它要求您为所有想要具有此功能的对象创建自定义类(不是什么大问题),并且 2)不允许您在这些类中具有任何 OnClick 功能(可能是一个问题)。理想情况下,您可以处理标签中的 OnClick(或其他任何内容),然后向其下方的 ListView 发送消息
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多