winforms 如何在鼠标光标下得到正确的ListViewItem?

pepwfjgg  于 2023-11-21  发布在  其他
关注(0)|答案(3)|浏览(258)

下面的屏幕截图显示了ListView.GetItemAt方法的问题。

设计器代码

  1. this.listView1 = new System.Windows.Forms.ListView();
  2. this.SuspendLayout();
  3. //
  4. // listView1
  5. //
  6. this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
  7. this.listView1.Location = new System.Drawing.Point(0, 0);
  8. this.listView1.Name = "listView1";
  9. this.listView1.Size = new System.Drawing.Size(717, 511);
  10. this.listView1.TabIndex = 0;
  11. this.listView1.UseCompatibleStateImageBehavior = false;
  12. //
  13. // Form1
  14. //
  15. this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  16. this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  17. this.ClientSize = new System.Drawing.Size(717, 511);
  18. this.Controls.Add(this.listView1);
  19. this.Name = "Form1";
  20. this.Text = "Form1";
  21. this.Load += new System.EventHandler(this.Form1_Load);
  22. this.ResumeLayout(false);

字符串

代码隐藏

  1. public Form1()
  2. {
  3. InitializeComponent();
  4. }
  5. private void Form1_Load(object sender, EventArgs e)
  6. {
  7. listView1.OwnerDraw = true;
  8. listView1.View = View.LargeIcon;
  9. listView1.DrawItem += ListView1_DrawItem;
  10. listView1.MouseMove += ListView1_MouseMove;
  11. for (int i = 1; i <= 10; ++i)
  12. {
  13. listView1.Items.Add($"item {i}", 0);
  14. }
  15. }
  16. private void ListView1_MouseMove(object sender, MouseEventArgs e)
  17. {
  18. ListViewItem item = listView1.GetItemAt(e.X, e.Y);
  19. if (LastHoveredItem != null)
  20. {
  21. ListViewItem item2 = LastHoveredItem;
  22. LastHoveredItem = null;
  23. listView1.Invalidate(item2.Bounds);
  24. }
  25. if (item != null)
  26. {
  27. LastHoveredItem = item;
  28. listView1.Invalidate(item.Bounds);
  29. }
  30. else
  31. {
  32. LastHoveredItem = null;
  33. }
  34. }
  35. private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e)
  36. {
  37. if (LastHoveredItem == e.Item)
  38. {
  39. e.Graphics.FillRectangle(Brushes.Yellow, e.Item.Bounds);
  40. }
  41. else
  42. {
  43. e.Graphics.FillRectangle(Brushes.Green, e.Item.Bounds);
  44. }
  45. }
  46. internal ListViewItem LastHoveredItem = null;

截图

鼠标光标下的矩形应该是黄色的,但它和其他未悬停的矩形一样是绿色的。


的数据

d7v8vwbk

d7v8vwbk1#

ListView.GetItemAt如果图标的标签或图标矩形包含点,则获取项目。这不是您要查找的内容。您需要检查整个项目。
您可以使用以下方法之一:

  1. private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
  2. {
  3. //...
  4. var p = listView1.PointToClient(Cursor.Position);
  5. if (e.Item.GetBounds(ItemBoundsPortion.Entire).Contains(p))
  6. {
  7. //e.Item is Hot
  8. }
  9. else
  10. {
  11. //e.Item is Normal
  12. }
  13. //...
  14. }

字符串

展开查看全部
cmssoen2

cmssoen22#

为什么不能使用listView1.FocusedItem属性

qnyhuwrf

qnyhuwrf3#

分享一个在鼠标光标下找到ListViewSubItem的替代解决方案,归功于Fredrik Mörk(appsloveworld.com):

  1. private void listViewCreateEntity_KeyDown(object sender, KeyEventArgs e)
  2. {
  3. if (e.Control == true && e.KeyCode == Keys.C)
  4. {
  5. var mousePos = listViewCreateEntity.PointToClient(Cursor.Position);
  6. ListViewItem lvItem = listViewCreateEntity.GetItemAt(mousePos.X, mousePos.Y);
  7. if (null != lvItem)
  8. {
  9. var lvSubItem = lvItem.GetSubItemAt(mousePos.X, mousePos.Y);
  10. Clipboard.SetText(lvSubItem.Text);
  11. Debug.WriteLine("Hit! Clipboard copy: " + lvSubItem.Text);
  12. }
  13. }
  14. }

字符串

展开查看全部

相关问题