You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tile模式ListView无法通过TopItem获取首个可见项怎么办?

在ListView Tile模式下获取第一个可见项的解决方案

在.NET的ListView控件中,当View模式设为Tile(或Icon、SmallIcon)时,直接访问TopItem属性会抛出异常,因为这些布局模式的内部逻辑不支持该属性的直接调用。要在保持Tile模式的前提下获取第一个可见项,可以通过调用原生Win32 API的方式实现。

实现步骤

  1. 导入Win32 API声明:添加SendMessage函数的调用声明,用于向ListView原生控件发送消息。
  2. 编写获取可见项索引的方法:通过LVM_GETTOPINDEX消息获取当前最顶部可见项的索引。
  3. 通过索引获取ListViewItem:利用得到的索引直接访问ListView.Items集合,得到目标项。

代码示例

首先在你的窗体或控件类中添加API声明:

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

private const int LVM_GETTOPINDEX = 0x1027;

然后实现获取第一个可见项的方法:

private ListViewItem GetFirstVisibleItem(ListView listView)
{
    if (listView.Items.Count == 0)
        return null;

    int topIndex = (int)SendMessage(listView.Handle, LVM_GETTOPINDEX, IntPtr.Zero, IntPtr.Zero);
    if (topIndex >= 0 && topIndex < listView.Items.Count)
        return listView.Items[topIndex];

    return null;
}

使用方式

调用上述方法即可获取Tile模式下的第一个可见项:

ListViewItem firstVisible = GetFirstVisibleItem(ListView1);
if (firstVisible != null)
{
    string targetText = firstVisible.SubItems[1].Text;
    // 执行你的后续逻辑
}

说明

  • LVM_GETTOPINDEX是ListView原生控件的标准消息,能够在所有布局模式下返回当前可见区域最顶部项的索引,不受View模式限制。
  • 该方法同样适用于Icon、SmallIcon模式下的可见项获取需求。

内容的提问来源于stack exchange,提问作者pertenet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:11:25