我有一个WinForms应用程序,它使用一个列表框来显示项目列表。当列表框中的项目数超过约150个项目时,我的应用程序挂起。这是ListBox控件的属性,它只能容纳这么多项吗?如果是这样,我会要求您提供此问题的解决方案。
谢谢, 勒凯什。
答案 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错误信息是错误的并且令人困惑。