滚动WinForms列表框中的大量项目问题

时间:2014-09-17 17:48:18

标签: c# winforms listbox scroll

我注意到在listbox winforms控件中有大量项目存在问题。

在这个简单的测试用例中,我有120,000个字符串添加到列表框中。我最初使用绑定到listbox.DataSource的数据表遇到了这个问题,但它也可以通过这种方式重现:

listBox.BeginUpdate();
for(int x = 0; x < 120000; x++)
{
    listBox.Items.Add(x);
}
listBox.EndUpdate();

当我单击并从上到下拖动滚动按钮时,在我松开鼠标后,它会将滚动按钮移动到滚动条的中间。

这是一个屏幕截图,当我从底部正好/靠近底部时,按钮落地(我是精确的,没有鼠标在滚动条的边界之外)。

enter image description here

如果我现在点击滚动条按钮并将其向下移动3/4 /向下控制器的长度,现在它将回弹到控制长度的1/4左右。

还有其他人看过这个并且有一个已知的解决方法吗? (我承认自己没有进入下一点)这种控制是否具有虚拟模式&#39;像datagridview这样的动态加载选项可能偶然会摆脱这种奇怪的打嗝?

3 个答案:

答案 0 :(得分:0)

例如,如果要在首次加载表单时执行此操作,请设置属性及其虚拟大小 使用ListView而不是ListBox

private void Form1_Load(object sender, EventArgs e)
{
    listView1.VirtualMode = true;
    listView1.VirtualListSize = 12000;
 }

答案 1 :(得分:0)

恕我直言,你正在解决错误的问题。在列表框中包含如此大量项目的用例是什么?列表框的一般用法是供用户从列出的填充中进行选择。您的应用程序是否真的希望用户从如此庞大的选择列表中选择特定项目?

您可以通过提供更好的方法来缩小列表以供选择,从而为您的用户(以及您的表现)提供帮助。

答案 2 :(得分:0)

我注意到,垂直滚动条中内置的列表框只能从滚动位置返回索引,最高可达65535。如果添加的项目超过此值,则会出现滚动问题。但是,垂直滚动条控件没有此问题。最多可以滚动到Int32.Max。我只是使用了垂直滚动条控件,而不是ListBox滚动条中的默认版本

我添加了另一个垂直滚动条(vScrollBar1),并将其放置在列表框的右侧,以覆盖其原始列表框的垂直滚动条。

然后为我创建的垂直滚动条添加以下代码

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) { listbox.TopIndex = 
e.NewValue; }

private void vScrollBar1_MouseEnter(object sender, EventArgs e)
    {
        vScrollBar1.Maximum = listbox.Items.Count;
    }