C#中的列表框刷新()
Posted
技术标签:
【中文标题】C#中的列表框刷新()【英文标题】:listbox Refresh() in c# 【发布时间】:2011-07-05 10:02:20 【问题描述】:int[] arr = int[100];
listBox1.DataSource = arr;
void ComboBox1SelectedIndexChanged(object sender, EventArgs e)
.....//some processes
listBox1.DataSource = null;
listBox1.DataSource = arr;
is not working,
还有,
listBox1.Refresh(); is not working,
还有,
listBox1.Update(); is not working,
我知道我可以使用BindingList<T>
,但我只能使用数组。
你能帮我如何刷新列表框吗?
【问题讨论】:
【参考方案1】:我在这里的堆栈交换的第一个答案。
C# .Net 4.0:
listBox1.DataSource = null;
listBox1.DataSource = names;
我注意到第一次设置数据源时,它会刷新。 设置后,您尝试再次将其设置为相同,它不会更新。
所以我把它设为空,将它设置为相同的,它在这个问题上为我正确显示。
【讨论】:
【参考方案2】:ListBox 仅在绑定到 dataSource 的对象通知它自己的更改时更新其显示的内容。 BindingSource 对象有一个名为 DataSourceChanged 的事件。当源更改为不同的对象时,列表框将自行更新。 绑定列表时也是如此。如果您更改列表,则不会发生任何事情,因为列表不会通知它已更改。这个问题有一个简单的解决方案:使用 BindingList http://msdn.microsoft.com/de-de/library/ms132679%28v=vs.110%29.aspx
BindingList 具有 ListChanged 事件,每次更改 List 时都会调用(显然)。所以 Windows.Form 对象的 DataBindings 使用 ListChanged 之类的事件来更新自己。简单的 List 不支持此事件。
所以,如果您想使用大量数据绑定,您应该了解: http://msdn.microsoft.com/de-de/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx
【讨论】:
但在很多情况下,您不想更新现有的 BindingList,而是将其替换为另一个。那么它不会自动更新,因为DataSource仍然指向旧的。【参考方案3】:设法做到了
FirstListBox.DataContext = null;
FirstListBox.DataContext = App.ViewModel;
只需丢失链接并将所有数据返回给它。
【讨论】:
【参考方案4】:我继承了 ListBox
并添加了一个名为 RefreshItems()
的公共方法,它可以满足我们的需求。已经实施和所有。我不知道他们为什么不使用公共方法。
【讨论】:
【参考方案5】:问题可能来自 ListBox SelectionMode。
由于我不知道的原因,当 SelectionMode 为 SelectionMode.None 时,数据绑定不起作用。
解决方法可能是:
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.DataSource = myDatasource;
listBox.SelectionMode = SelectionMode.None;
希望对你有帮助。
【讨论】:
谢谢 - 找了好久,..这是我的问题。微软真的很烂! 是的——这有效!就我而言,我使用 listBox.Refresh() 而不是更改 DataSource。【参考方案6】:好吧,没有绑定我只管理:
this.Hide();
this.Show();
它重绘一切......
【讨论】:
【参考方案7】:试试下面的
listBox1.DataBind()
【讨论】:
它可能适用于 .NET 3.5 及更高版本,例如有没有办法在 .NET 2.0 上刷新 .NET 4.0 中没有 DataBind()【参考方案8】:使用 BeginUpdate 和 EndUpdate,应该可以解决它。 无需设置两次数据源
listBox1.BeginUpdate();
listBox1.DataSource = myList;
listBox1.EndUpdate();
【讨论】:
【参考方案9】:这些链接可能会有所帮助。
如何更新列表框项 (C#)? - http://arstechnica.com/civis/viewtopic.php?f=20&t=554717
将 ArrayList 绑定到 ListBox - http://www.java2s.com/Tutorial/CSharp/0460__GUI-Windows-Forms/BindArrayListtoListBox.htm
【讨论】:
【参考方案10】:在加载完成之前查看 Windows 窗体的更改,尤其是 Listbox 和其他控件上的更改是很棘手的。 要将数据视为已加载的数据,请使用 invalidate();然后更新();
【讨论】:
以上是关于C#中的列表框刷新()的主要内容,如果未能解决你的问题,请参考以下文章