怎样能够取得鼠标点击的listview的子项呢?请大家给下启发,up有分

herony420 2004-11-15 11:50:04
如题,我想让用户点击listview的某个项(item)的子项(subitem)的时候,做一些事情,怎样可以知道用户点击的子项呢?
请大家帮忙给各启发
...全文
267 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
淡蓝色2 2004-11-15
  • 打赏
  • 举报
回复
用hitTest方法
roarlion 2004-11-15
  • 打赏
  • 举报
回复
判断子项的text
herony420 2004-11-15
  • 打赏
  • 举报
回复
我是说当鼠标被点击时可以取得子项,使用什么事件或者其他的什么途径可以取得所点击的子项,
我们已经知道使用getItemAt方法可以取得Item但是却得不到子项。
cnhgj 2004-11-15
  • 打赏
  • 举报
回复
listView1.SelectedItems[0].Index

listView1.SelectedItems[0].SubItems[0]
zzcwhq 2004-11-15
  • 打赏
  • 举报
回复
NO.1
OneDotRed 2004-11-15
  • 打赏
  • 举报
回复
看看这个可以成功不。
private void listView1_Click(object sender, System.EventArgs e)
{
Point p = MousePosition;

p = listView1.PointToClient( p );

ListViewItem item = listView1.GetItemAt( p.X , p.Y );

if ( item == null )
return;

Rectangle rect = listView1.GetItemRect( item.Index );

int offset = 0;

if ( listView1.ClientRectangle.Width < rect.Width ) //如果发生了水平滚动
{
offset = rect.Left ;
}

int width = p.X - offset ;
int index = 0;
int sum = 0;
for( int i = 0 ; i < listView1.Columns.Count ; i++ )
{
sum+=listView1.Columns[ i ].Width;
if ( sum >= width )
{
index = i;
break;
}
}


MessageBox.Show( item.SubItems[ index ].Text );

}
==============================
并且,listview的click事件的响应在点击子项的时候并没有发生,只有在点击项的时候才发生。

to:herony420(尽头) ,你需要将listview设为FullRowSelect,并且View为Details
jimh 2004-11-15
  • 打赏
  • 举报
回复
那就使用mousedown+mouseup事件,具体为mousedown时记录mousepoint,mouseup时判断是否同一点,如果是同一点,//相当于mouseclick
flcandclf 2004-11-15
  • 打赏
  • 举报
回复
ding
herony420 2004-11-15
  • 打赏
  • 举报
回复
并且,listview的click事件的响应在点击子项的时候并没有发生,只有在点击项的时候才发生。
herony420 2004-11-15
  • 打赏
  • 举报
回复
这种方法在有些情况下可行的,但是如果,可以listview较长,需要拖动水平滚动条的话就有麻烦了
OneDotRed 2004-11-15
  • 打赏
  • 举报
回复
listview_Click( sender , e )
{
Point p = MousePosition;
p = listView1.PointToClient( p );
ListViewItem item = listview.GetItemAt( p.X , p.Y ); //得到鼠标在listview显示区域的相对点

if ( item == null )
return;

//在listview中,subitem没有宽度设置,我查了查,1.1的ListView也没有设置subitem的方法,
//而在2.0的版本,有个internal的方法叫GetSubItemRect,可以使用反射去调用。呵呵,不过天无绝人之路,办法是有的,通过发送消息?好在listview的column还是有宽度的。OK

int width = p.x; //当前点在listview上的x坐标,也就是“宽度”啦
int index = 0;
int sum = 0;
for( int i = 0 ; i < listview.Columns.Count ; i++ )
{
sum+=listview.Columns[ i ].Width;
if ( sum >= width )
{
index = i;
break;
}
}

MessageBox.Show( item.SubItems[ index ].Text );
}
yufeng777 2004-11-15
  • 打赏
  • 举报
回复
UP
sneak 2004-11-15
  • 打赏
  • 举报
回复
每个ListItem都有个Tag属性,可以好好利用一下。

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧