如何以编程方式滚动listview项目

时间:2014-08-04 09:56:04

标签: c# vb.net winforms listview listviewitem

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

在这里,点击单独的按钮,我确实改变了一些listview项目的颜色并重新加载整个网格,因为数据库有一些变化,所以每次点击按钮都会从数据库重新加载。

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

有没有办法,将最后添加的项目或更新的项目自动滚动到listview中(我的意思是,通过编程方式,可以直接查看用户而无需手动滚动)。

4 个答案:

答案 0 :(得分:5)

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

此代码段可用于将ListView自动滚动到listView中的特定索引。

考虑代码:使用此代码,您可以在按钮单击

时自动滚动到索引8
 private void button2_Click(object sender, EventArgs e)
 {
     listView1.EnsureVisible(8);
 }

答案 1 :(得分:0)

在刷新列表之前,将当前焦点或所选项目(取决于交互代码的工作方式)存储到变量中,然后您可以恢复所选项目。例如;

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

答案 2 :(得分:0)

尽管@ 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
    }
}

答案 3 :(得分:0)

可以直接发送消息。

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);

    }


}