ListView 中如何获得选中的当前单元

redfox1985 2007-08-14 05:11:25
我想用listview做一个工具,需要选中某一个单元,用的是详细信息显示,也就是作为一个表格来用,怎样才能通过鼠标事件知道是选中了这个单元格呢?
高手指点!
...全文
538 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkline 2007-09-26
  • 打赏
  • 举报
回复
学习了!!!!
redfox1985 2007-08-17
  • 打赏
  • 举报
回复
谢谢楼上的~~~
解决了!!!
哈哈哈哈!!
还是洋鬼子牛比!!!
Koala_sea 2007-08-17
  • 打赏
  • 举报
回复
既然是1.1的就这样吧。
foreach(ListViewItem lvi in listView1.SelectedItems)
{
Console.WriteLine(lvi.Text);
}
lance 2007-08-17
  • 打赏
  • 举报
回复
<PRE lang=cs id=pre2 style="MARGIN-TOP: 0px">private bool HitTest(Point hitPoint, out int row, out int column)
{
const int LVM_GETSUBITEMRECT = 0x1038; //Is LVM_FIRST (0x1000) + 56
const int LVM_COLUMNORDERARRAY = 0x103B; //Is LVM_FIRST (0x1000) + 59
const int LVIR_BOUNDS = 0;
bool retval = false;
RECT subItemRect;
row = column = -1;
ListViewItem item = m_lvListView.GetItemAt(hitPoint.X, hitPoint.Y);

if(item != null && m_lvListView.Columns.Count > 1)
{
if(m_lvListView.AllowColumnReorder)
{
int[] columnOrder = new int[m_lvListView.Columns.Count];
// Get the order of columns in case
// they've changed from the user.
if(SendMessage(m_lvListView.Handle,
LVM_COLUMNORDERARRAY, m_lvListView.Columns.Count,
columnOrder) != 0)
{
int i;
// Get the subitem rectangles (except column 0),
// but get them in the proper order.
RECT[] subItemRects = new RECT[m_lvListView.Columns.Count];
for(i = 1; i < m_lvListView.Columns.Count; i++)
{
subItemRects[columnOrder[i]].top = i;
subItemRects[columnOrder[i]].left = LVIR_BOUNDS;
SendMessage(m_lvListView.Handle,
LVM_GETSUBITEMRECT, item.Index,
ref subItemRects[columnOrder[i]]);
}

// Find where column 0 is.
for(i = 0; i < columnOrder.Length; i++)
if(columnOrder[i] == 0)
break;

// Fix column 0 since we can't get
// the rectangle bounds of it using above.
if(i > 0)
{
// If column 0 not at index 0, set using the previous.
subItemRects[i].left = subItemRects[i-1].right;
subItemRects[i].right = subItemRects[i].left
+ m_lvListView.Columns[0].Width;
}
else
{
// Else, column 0 is at index 0, so use the next.
subItemRects[0].left = subItemRects[1].left -
m_lvListView.Columns[0].Width;
subItemRects[0].right = subItemRects[1].left;
}

// Go through the subitem rectangle bounds and
// see where our point is.
for(int index = 0; index < subItemRects.Length; index++)
{
if(hitPoint.X >= subItemRects[index].left &
hitPoint.X <= subItemRects[index].right)
{
row = item.Index;
column = columnOrder[index];
retval = true;
break;
}
}
}
}
// No column reordering...much simpler.
else
{
for(int index = 1; index <= m_lvListView.Columns.Count-1;
index++)
{
subItemRect = new RECT();
subItemRect.top = index;
subItemRect.left = LVIR_BOUNDS;
if(SendMessage(m_lvListView.Handle,
LVM_GETSUBITEMRECT, item.Index, ref subItemRect) != 0)
{
if(hitPoint.X < subItemRect.left)
{
row = item.Index;
column = 0;
retval = true;
break;
}
if(hitPoint.X >= subItemRect.left & hitPoint.X <=
subItemRect.right)
{
row = item.Index;
column = index;
retval = true;
break;
}
}
}
}
}
return retval;
}</PRE>





http://www.codeproject.com/cs/miscctrl/CSharpHitTest.asp
redfox1985 2007-08-16
  • 打赏
  • 举报
回复
谢谢大家伙,不过我还是没能找到解决方案!
我的是Framework 1.1
还希望大家再帮帮忙!!
呵呵!
楼上说的一些都没有那属性和方法!!!
郁闷了!!
godgreat 2007-08-16
  • 打赏
  • 举报
回复
ListView1.Items[ListView1.ItemIndex].Caption
ListView1.GetItemAt(x,y);
北京的雾霾天 2007-08-16
  • 打赏
  • 举报
回复
没想到当有滚动条的时候就不好使了
-------------------
你可能需要使用AutoScrollPosition来偏移坐标。
vainnetwork 2007-08-16
  • 打赏
  • 举报
回复
关注
redfox1985 2007-08-16
  • 打赏
  • 举报
回复
重写listview,如果嫌麻烦就用datagrid。有时它比listview好用的。
重写也解决不了啊!!!
如何能确定那一列??
icefeiji 2007-08-16
  • 打赏
  • 举报
回复
重写listview,如果嫌麻烦就用datagrid。有时它比listview好用的。
redfox1985 2007-08-16
  • 打赏
  • 举报
回复
有没有人帮忙啊!!!!!!!!!
我要疯了 !!!!!!!!!!!!!!!
redfox1985 2007-08-15
  • 打赏
  • 举报
回复
使用ListViewItem的GetSubItemAt(x,y)

1.1里边好象没有这样一个函数啊!!!
郁闷,昨天看到一帖子用位置来确定,
还以为很好,没想到当有滚动条的时候就不好使了!!!

private void m_ListViewInstance_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//确定被选中的单元格
ListViewItem tlvi = m_ListViewInstance.GetItemAt(e.X, e.Y);
int cout = 0;
for ( int i = 0; i < m_ListViewInstance.Columns.Count; i++ )
{
cout += m_ListViewInstance.Columns[i].Width;
if ( true == ( cout > e.X))
{
m_ColumnIndex = i;
break;
}
}
//确定被选中的单元格



}
北京的雾霾天 2007-08-14
  • 打赏
  • 举报
回复
使用ListViewItem的GetSubItemAt(x,y)
redfox1985 2007-08-14
  • 打赏
  • 举报
回复
是这样,我要在没有点columnheader的情况下想知道目前鼠标焦点在哪一列!
也就是知道落在哪一个单元格!
cxy0303 2007-08-14
  • 打赏
  • 举报
回复
listview.SelectedItems返回的是一个SelectedListViewCollention集合,应为可能选择多行嘛
redfox1985 2007-08-14
  • 打赏
  • 举报
回复
可是不是单元格,是某一行被定位了,还有列呀!!!
北京的雾霾天 2007-08-14
  • 打赏
  • 举报
回复
可以通过鼠标的坐标来得到其下是否正好有一个Item:

ListView ls;
ls.GetItemAt(x, y);
magicblack 2007-08-14
  • 打赏
  • 举报
回复
selectindex

selectitem
lovefootball 2007-08-14
  • 打赏
  • 举报
回复
listview.SelectedIndices[i]

110,539

社区成员

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

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

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