2010-03-27 136 views
1

我想在ListView上选择一个项目,当用户点击一个没有项目的空间时。例如,项目下方的空间,但仍在ListView组件上。我已将ListView属性“HideSelection”更改为false,但仅当焦点更改为其他组件时才起作用;而不是当用户点击ListView本身时。谢谢!如何选择一个项目? - ListView

回答

5

这是您通常不应该修复的内容。用户故意点击某处,这可能是因为她想要取消选择一个项目。如果这是无意的,那么她会理解发生的事情并知道如何纠正它。给予标准控制非标准行为往往只会混淆用户。

但你可以修复它。您需要防止本机ListView控件看到点击。这需要重写WndProc()方法并检查点击发生的位置。为您的项目添加一个新类并粘贴下面显示的代码。编译。将新的控件从工具箱的顶部拖放到窗体上。

using System; 
using System.Drawing; 
using System.Windows.Forms; 

class MyListView : ListView { 
    protected override void WndProc(ref Message m) { 
    if (m.Msg == 0x201 || m.Msg == 0x203) { // Trap WM_LBUTTONDOWN + double click 
     var pos = new Point(m.LParam.ToInt32()); 
     var loc = this.HitTest(pos); 
     switch (loc.Location) { 
     case ListViewHitTestLocations.None: 
     case ListViewHitTestLocations.AboveClientArea: 
     case ListViewHitTestLocations.BelowClientArea: 
     case ListViewHitTestLocations.LeftOfClientArea: 
     case ListViewHitTestLocations.RightOfClientArea: 
      return; // Don't let the native control see it 
     } 
    } 
    base.WndProc(ref m); 
    } 
} 
+0

哇。这很好!只是一件事,有没有办法修改该代码,所以它也适用于右键单击?非常感谢! – 2010-03-27 15:44:43

+0

右键单击是0x202。它应该显示一个上下文菜单... – 2010-03-27 15:47:46

0

一种方法:在SelectedIndexChanged事件中,检查值是否为-1;如果是这样,请将其重置为先前的值(您可能将其存储在变量中)。

+0

你知道我该如何得到索引吗? – 2010-03-27 15:30:33

相关问题