我在WinForms应用程序上有一个listview控件。
在这里,点击单独的按钮,我确实更改了一些listview项目backcolor并重新加载整个网格,因为有一些更改到数据库所以,每次点击按钮从数据库重新加载。
现在,问题是,一旦重新加载网格然后最后添加的项目滚动,所以,需要滚动所有项目并找到它,这使得最终用户很难。
有没有办法,将最后添加的项目或更新的项目自动滚动到列表视图中(我的意思是,通过编程方式,可以直接查看用户而无需手动滚动)。
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);
}
}