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

问题描述:

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

谢谢, Rakesh。

+0

请输入密码?你是否有任何代码对任何Listbox事件进行冗长的操作,而它正在被填充? – shahkalpesh

+1

它不是。尽管如果您将超过65536个项目放入列表中,Vista中的错误会导致滚动问题。 –

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

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

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

头尖,总是..

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

二尖,尽可能使用的AddRange。

第三,它可能是矫枉过正,创建自己的列表框...

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 
} 

你为什么不只是分析你的数据库是这样的。

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语句,则可以获取总数或行数,然后将其传递给字符串。然后你使用字符串来控制数组。希望这可以帮助

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