限制WinForms中列表框中的项目数

时间:2010-02-16 03:26:55

标签: c#

我有一个WinForms应用程序,它使用一个列表框来显示项目列表。当列表框中的项目数超过约150个项目时,我的应用程序挂起。这是ListBox控件的属性,它只能容纳这么多项吗?如果是这样,我会要求您提供此问题的解决方案。

谢谢, 勒凯什。

5 个答案:

答案 0 :(得分:2)

这一切都取决于你绑定的内容,如果你绑定简单的键值对,你可以立即绑定10k容易。您可能想尝试在循环中添加项目而不是绑定,以查看它是否挂起了某个项目。

for (int i = 0; i < 10000; i++)
{
     listBox1.Items.Add("item:" + i.ToString());
}

答案 1 :(得分:1)

您可以通过更大的数据集返回列表框并使用分页机制,也可以为SizeChanged添加事件侦听器,并在达到最大值时禁用添加。

答案 2 :(得分:1)

第一个提示,总是......

SuspendLayout();
// fill your lists
ResumeLayout();

第二个提示,尽可能使用AddRange。

第三,它可能有点过分,创建自己的ListBox ......

public class LimitedListBox : ListBox
{
    private int _maxItems = 100;

    public LimitedListBox()
    {
        SetItems(new LimitedObjectCollection(this, _maxItems));
    }

    public int MaxItems
    {
        get { return _maxItems; }
        set { _maxItems = value; }
    }

    /// <summary>
    /// This is the only 'bug' - no design time support for Items unless
    /// you create an editor.
    /// </summary>
    public new LimitedObjectCollection Items
    {
        get
        {
            if (base.Items == null)
            {
                SetItems(new LimitedObjectCollection(this, _maxItems));
            }
            return (LimitedObjectCollection) base.Items;
        }
    }

    private void SetItems(ObjectCollection items)
    {
        FieldInfo info = typeof (ListBox).GetField("itemsCollection",
                                                   BindingFlags.NonPublic | BindingFlags.Instance |
                                                   BindingFlags.GetField);
        info.SetValue(this, items);
    }

    #region Nested type: LimitedObjectCollection

    public class LimitedObjectCollection : ObjectCollection
    {
        private int _maxItems;

        public LimitedObjectCollection(ListBox owner, int maxItems)
            : base(owner)
        {
            _maxItems = maxItems;
        }

        public LimitedObjectCollection(ListBox owner, ObjectCollection value, int maxItems)
            : base(owner)
        {
            _maxItems = maxItems;
            AddRange(value);
        }

        public LimitedObjectCollection(ListBox owner, object[] value, int maxItems)
            : base(owner)
        {
            _maxItems = maxItems;
            AddRange(value);
        }

        public int MaxItems
        {
            get { return _maxItems; }
            set { _maxItems = value; }
        }

        public new int Add(object item)
        {
            if (base.Count >= _maxItems)
            {
                return -1;
            }

            return base.Add(item);
        }

        public new void AddRange(object[] items)
        {
            int allowed = _maxItems - Count;
            if (allowed < 1)
            {
                return;
            }

            int length = allowed <= items.Length ? allowed : items.Length;
            var toAdd = new object[length];
            Array.Copy(items, 0, toAdd, 0, length);

            base.AddRange(toAdd);
        }

        public new void AddRange(ObjectCollection value)
        {
            var items = new object[value.Count];
            value.CopyTo(items, 0);

            base.AddRange(items);
        }
    }

    #endregion
}

答案 3 :(得分:0)

为什么不直接解析数据库。

int Total = yourarray.GetLength(0);

Then all you have to do is this in your new array.

double [] new = double[Total];

array.copy(Total,new);

现在你有一个动态的数组。无论何时数据库增长,它都会自动填充 新阵列。

或者,如果您可以对数据库执行select count语句,则可以获取总数或行数,然后将其传递给字符串。然后使用该字符串来控制数组。希望这有帮助

答案 4 :(得分:0)

填写列表框时,我收到“内存不足”错误消息。问题与太多物品无关。我的代码中有一个错误,列表框中的项目在ToString()方法中返回null。所以Dot Net错误信息是错误的并且令人困惑。