如何以编程方式滚动列表视图项

本文关键字:列表 视图 滚动 方式 编程 | 更新日期: 2023-09-27 18:16:20

我有一个listview控件在我的WinForms应用程序。

在这里,点击单独的按钮,我改变了几个listview项目的背景色,并重新加载整个网格,因为有一定的变化到数据库中,所以,从数据库中每次点击按钮重新加载。

现在,问题是,一旦网格被重新加载,最后添加的项目是滚动的,需要滚动所有的项目,找到这样,这使得最终用户很难。

是否有任何方法,滚动最后添加的项目或更新的项目自动进入listview(我的意思是,以编程方式,它可以直接查看用户而无需手动滚动)。

如何以编程方式滚动列表视图项

listView1.EnsureVisible(X);其中X为项目索引。

这个代码片段可以用来自动滚动ListView到listView中的特定索引。

考虑代码:有了这个,你可以自动滚动到索引8上的按钮,点击

 private void button2_Click(object sender, EventArgs e)
 {
     listView1.EnsureVisible(8);
 }

尽管@user3711357正确答案,我花了太多时间试图理解为什么它不适合我。我发现在表单的构造函数中调用EnsureVisible是行不通的。

public class MyForm
{
    public MyForm()
    {
        InitializeComponent();
        listView1.EnsureVisible(8);  // will not work !!!
    }
    private void MyForm_Load(object sender, EventArgs e)
    {
        listView1.EnsureVisible(8);  // Works fine
    }
}

在刷新列表之前,将当前关注的或选中的项(取决于您的交互代码如何工作)存储到一个变量中,然后您可以在之后恢复选中的项。例如,

Dim selectedObjectName = listview.SelectedItems(0).Name
...
' refresh your list
...
Dim vItem as ListViewItem
If listview.SelectedItem.ContainsKey(selectedObjectName) Then 
    vItem = listview.Items(selectedObjectName)
Else
    vItem = listview.Items(0)
End If
vItem.Selected = True
vItem.Focus

可以直接发送消息

public partial class Form1 : Form
{
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    public Form1()
    {
        InitializeComponent();
        c_scroll.ScrollSlide += C_scroll_ScrollSlide;
    }
    private void C_vScrollBar_Scroll(object sender, ScrollEventArgs e)
    {
        const int LVM_SCROLL = (0x1000 + 20);
        SendMessage(c_listView_show.Handle, LVM_SCROLL, 0, e.NewValue - e.OldValue);
    }

}