鼠标事件GetItemAt(e.X,e.Y)为ListView控件提供了错误的值
本文关键字:控件 ListView 错误 GetItemAt 事件 鼠标 | 更新日期: 2023-09-27 18:20:50
C#(VS 2010)ListView控件鼠标点击事件的奇怪行为(项目没有复选框):
private void m_ListView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
// Returning some times wrong values
ListViewItem lvi = m_ListView.GetItemAt(e.X, e.Y);
//.... more logic here
}
}
在我单击该项目并立即向下或向上移动鼠标后,会选择其他项目,而不是预期的项目;
我调试后发现e.X,e.Y捕获了错误的值。当我点击并保持鼠标指针不动时,它工作得很好。但是,如果我单击并立即移动到另一行,则会选择其中一行。
问题:
- 这是ListView鼠标事件的已知问题吗
- 是否有其他方法可以检索鼠标事件的正确坐标
这是一个企业级项目,其中性能非常重要。我们已经为所有鼠标事件编写了原始代码,如向上、向下、双击、鼠标单击、项目检查等。
-Karthik
ListViewItem lvi = m_ListView.FocusedItem;
这应该可以得到刚刚点击的项目(聚焦)
m_ListView.GetItemAt(e.X, e.Y);
将在鼠标位置获取项目,这就是为什么当您快速移开鼠标时它会发生变化,如果您想要刚刚单击的项目,m_ListView.FocusedItem
应该可以很好地进行
您可能需要考虑什么是"错误值"。单击事件是一个高级事件,执行代码的时刻不一定等于鼠标当时的位置。该点击事件的存储坐标来自用户点击按钮的时刻。如果继续移动鼠标,事件内部的坐标将与鼠标在同一时刻的坐标不相等。
你说你处理所有鼠标事件。如果是为了性能,可以考虑使用内置的控制机制,这些机制针对速度和准确性进行了优化。在10年的开发中很难改进(通过早期的各种化身,控制在MS已经经历了相当长的开发时间)。
如果你真的需要最快的速度,那就从头开始写你自己的控件。使用低级鼠标事件获取最佳可用信息。
这是根据设计,MouseClick事件由MouseUp事件生成。所有的点击事件都是这样工作的。按下按钮,移动鼠标并释放按钮,因此总是给出你释放按钮的位置,而不是你按下按钮的位置
您需要使用MouseDown事件。