检索列表视图中的项目

时间:2009-03-10 05:11:50

标签: c# .net winforms

我正在使用ListView.GetItemAt(x,y)ListView中检索项目,但我不是 我将FullRowSelect选项设置为false时能够获取该项目。

我不确定如何在.NET 1.1中执行此操作。有没有人有任何指示?

以下是代码段:

public int GetListViewSubItem(ListView listView1, Point pt)
{
     const int LVM_FIRST  = 0x1000;
     const int LVM_GETSUBITEMRECT  = (LVM_FIRST + 56);
     const int LVIR_BOUNDS = 0;

     RECT myrect;
     ListViewItem lvitem = listView1.GetItemAt(pt.X, pt.Y);
     if(lvitem == null && listView1.SelectedItems.Count > 0)
         lvitem = listView1.SelectedItems[0];

     int intLVSubItemIndex = -1;
     ListViewItem.ListViewSubItem LVSubItem = null;

     if(lvitem != null)
     {
         int intSendMessage;
         for ( int i = 1; i <= lvitem.SubItems.Count - 1; i++)
         {
             LVSubItem = lvitem.SubItems[i];
             myrect = new RECT();
             myrect.top = i;
             myrect.left = LVIR_BOUNDS;
             intSendMessage = SendMessage(listView1.Handle, 
                                          LVM_GETSUBITEMRECT,
                                          lvitem.Index, ref myrect);
             if (pt.X < myrect.left)
             {
                 LVSubItem = lvitem.SubItems[0];
                 intLVSubItemIndex = 0;
                 break;
             }
             else if (pt.X >= myrect.left & pt.X <= myrect.right)
             {
                 intLVSubItemIndex = i;
                 break;
             }
             else
                 LVSubItem = null;
         }
    }

    if (LVSubItem == null || lvitem == null)
    {
        intLVSubItemIndex = -1;
    }

    return intLVSubItemIndex;
}

这个方法应该显示我点击了哪个单元格。 Tt有效,但如果我将fullrowselect更改为false,则会返回null值。

我甚至尝试getitemat(0,e.y),但它没有用。

每当我在ListView中选择一个项目时,它都会以蓝色突出显示,因此无法查看所选内容。我正试图删除那个蓝色的亮点。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你能详细说明你想要做什么吗?

您的ListView的ViewStyle是否设置为Details?由于你提到将FullRowSelect设置为false,我认为它是。

GetItemAt(x,y)仅在鼠标单击属于某个项目的实际文本时才有效。因此,如果您单击与项目相同的行但在列中没有文本,则它将返回null。

解决方法是简单地将0作为x参数传递:

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
    ListViewItem item = listView1.GetItemAt(0, e.Y);
    if (item == null)
    {
        MessageBox.Show("Null");
    }
    else
    {
        MessageBox.Show(item.Text);
    }
}

我可以确认这样可以正常工作 - 即使只有第一列中有文本,它也会返回该行上的项目。

答案 1 :(得分:1)

private int getSelectedSubItemIndex(ListView listView)
{
    if (listView.SelectedItems.Count == 1)
    {
        int x = 0;
        ListViewItem item = listView.SelectedItems[0];
        Point pt = listView.PointToClient(Control.MousePosition);
        for (int idx = 0; idx < item.SubItems.Count; ++idx)
        {
            x += listView.Columns[idx].Width;
            if (pt.X < x)
                return idx;
        }
    }
    return -1;
}