【问题标题】:How to scroll listview items programmatically如何以编程方式滚动列表视图项目
【发布时间】:2014-09-26 18:32:19
【问题描述】:

我的 WinForms 应用程序上有一个列表视图控件。

在这里,单击单独的按钮时,我确实更改了几个列表视图项的背景颜色并重新加载整个网格,因为数据库中存在某些更改,因此每次单击按钮时都会从数据库重新加载。

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

有什么方法可以自动将最后添加的项目或更新的项目滚动到列表视图中(我的意思是,以编程方式,它可以直接查看给用户而无需手动滚动)。

【问题讨论】:

  • 您能不能简单地对项目进行排序,以便最后添加的项目位于列表框的顶部?这样就不需要滚动到底部来查看它们。这似乎是最简单的前进方式。
  • 如果添加的项目总是在ListView的最后,可以使用这个答案:stackoverflow.com/questions/2014287/…
  • 如果不是最后一个(例如更新的项目),那么您可以通过 listView1.Items[itemIndex].EnsureVisible(); 将项目的索引存储在您的按钮单击并滚动到它

标签: c# vb.net winforms listview listviewitem


【解决方案1】:

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

这个sn-p可以用来自动滚动ListView到listView中的特定索引。

考虑代码:通过此代码,您可以在单击按钮时自动滚动到索引8

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

【讨论】:

  • 它既好又简单,但似乎不能可靠地工作。
  • @NeilDunlop,您可能在创建表单时尝试过,但它肯定不起作用。但是,如果您将此实现移至加载事件或不属于初始化的代码的另一部分,它应该可以正常工作
  • @ehh 谢谢。我会检查我去年在做什么,但如果我正确理解你的建议,我认为它不会解决我遇到的问题。我不是即时创建表单。我所有的表单都是使用 VSTO 表单设计器创建的,然后使用...
【解决方案2】:

尽管@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】:

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

    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
    

    【讨论】:

      【解决方案4】:

      可以直接发送消息。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 2022-11-09
        • 2019-03-12
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        相关资源
        最近更新 更多