我BindingList<T>在我的Windows窗体中使用了一个包含" IComparable<Contact>"联系人对象列表的窗体.现在我希望用户能够按网格中显示的任何列进行排序.
在线MSDN上有一种描述如何实现基于BindingList<T>允许排序的自定义集合的方法.但是,是否有一个Sort-event或者某些东西可以在DataGridView中捕获(或者,甚至更好,在BindingSource上)以使用自定义代码对底层集合进行排序?
我真的不喜欢MSDN描述的方式.另一种方法是我可以轻松地将LINQ查询应用于集合.
我想DataGridView在Windows窗体应用程序中显示一个人员列表.我希望我的服务层返回Person对象列表(例如IList<Person>).我希望列表中的更改能够反映在其中DataGridView,反之亦然.我的理解是使用BindingSource便利的工作DataGridView.我的问题是双向数据绑定工作,我需要:
//pseudo code
BindingSource.DataSource = IBindingList<Person>
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做:
BindingSource.DataSource = IList<Person>
Run Code Online (Sandbox Code Playgroud)
有什么不同?如果我的列表更改将以DataGridView任何方式更新?如果我必须使用BindingList它,似乎有点不稳定(因为创建一个依赖)BindingList从我的服务层返回一个,有没有办法解决这个问题?
微软称BindingList(在备注部分)
http://msdn.microsoft.com/en-us/library/ms132679.aspx:
"但是,典型的解决方案程序员将使用提供数据绑定功能的类,例如
BindingSource,而不是直接使用BindingList<T>."
摘要
我有一个快速变化的大型数据集,我希望将其绑定到UI(带有分组的Datagrid).这些变化分为两个层次;
数据的特征如下;
我遇到问题的关键要求;
我想做什么;
如果第1项具有属性状态,该状态从A - > B - > C - > D移动到我需要/仅想要引发一个"状态"改变事件的区间中,A-> D.
我感谢用户不需要每秒更新数千次UI.如果添加了一个项目,其状态已更改并在UI更新之间的N秒窗口内全部删除,则它永远不会访问DataGrid.
数据网格
DataGrid是我用来显示数据的组件.我目前正在使用XCeed DataGrid,因为它提供了简单的动态分组.我没有在情感上投入其中,如果我可以提供一些动态分组选项(其中包括经常更改的属性),那么股票DataGrid会很好.
我的系统中的瓶颈目前是在项目属性发生变化时重新排序所花费的时间
这占用了YourKit Profiler中98%的CPU.
用不同的方式来表达问题
给定两个BindingList/ObservableCollection实例,这些实例最初相同,但第一个列表已经有一系列额外的更新(您可以监听),生成最小的更改集以将一个列表转换为另一个列表.
外部阅读
我需要的是George Tryfonas 的这个ArrayMonitor的等价物,但是通用它来支持添加和删除项目(它们永远不会被移动).
NB我真的很感谢有人编辑问题的标题,如果他们能想到更好的总结.
编辑 - 我的解决方案
XCeed网格将单元格直接绑定到网格中的项目,而排序和分组功能由BindingList上引发的ListChangedEvents驱动.这有点直观,并排除了下面的MontioredBindingList,因为行将在组之前更新.
相反,我自己包装项目,捕获属性更改事件并将其存储在HashSet中,如Daniel建议的那样.这对我很有用,我会定期迭代这些项目并要求他们通知任何更改.
MonitoredBindingList.cs
这是我对绑定列表的尝试,可以轮询更新通知.可能有一些错误,因为它最终对我没用.
它创建一个添加/删除事件队列,并通过列表跟踪更改.ChangeList与基础列表具有相同的顺序,因此在我们通知添加/删除操作后,您可以针对正确的索引引发更改.
/// <summary>
/// A binding list which allows change events to be polled rather than pushed.
/// </summary>
[Serializable]
public class MonitoredBindingList<T> : BindingList<T>
{
private readonly object publishingLock = …Run Code Online (Sandbox Code Playgroud) 完全被看似容易的东西所困扰,并且已经死了......但仍然难倒.
我想做什么:我有一个WinForms ListBox.其项目填充了对象,DisplayMember已设置.当应用程序运行时,列出的项目中的数据可能会更改,包括DisplayMember后面的字段.我希望ListBox中显示的文本在发生这种情况时更改,我还希望ListBox重新排序,以便项目按字母顺序排列.
当数据发生变化时,BindingList可以很好地更新显示的文本,但对于我的生活,我无法对它进行排序.
我对此进行了评论:http: //msdn.microsoft.com/en-us/library/ms993236.aspx
这里还有很多关于如何做到这一点的线程,但它们似乎都不适用于ListBox.
在ListBox上设置Sorted属性同样没有用.
我需要做什么才能让ListBox自行排序?
在我的一个项目中,我试图从列表中删除id等于给定id的项目.
我BindingList<T>有个叫UserList.
列表具有所有方法RemoveAll().
既然我有BindingList<T>,我就这样使用它:
UserList.ToList().RemoveAll(x => x.id == ID )
Run Code Online (Sandbox Code Playgroud)
但是,我的列表包含与以前相同数量的项目.
为什么它不起作用?
是什么之间的区别System.ComponentModel.BindingList方法Add(object)和AddNew()?MSDN文档说明了这一点:
看起来这两种方法都将一个项目添加到集合中,但是Add(object)一次性完成,而AddNew()稍微复杂一些.我的测试Add(object)似乎有效,但我想知道我是否使用了正确的方法.
那么这些方法有什么区别呢?
bindinglist inotifypropertychanged system.componentmodel c#-4.0
假设我有一个名为Sample的业务对象,我有样本的BindingList.样本有4个属性.
我可以选择哪些属性绑定到DataGrid,或者没有选项来自定义这样的东西?
注意:我使用Compact Framework,其中没有DataGridView,以及Autogenerate属性和DataMember属性.
回复时请记住这一点.
我认为这个标题几乎抓住了我的问题,但有一点背景如下:
当我有一个表单加载时,它会向绑定列表添加几千(30k个奇数)对象.当我的应用程序第一次加载它需要几秒钟(大约10秒左右的内存)时,它循环遍历对象列表并使用add函数将其添加到BindingSource.但是,当在后续表单上发生这种情况时,使用相同的代码加载它只需要一两秒钟.
所以我的查询是:
1.为什么BindingList(Of T)没有AddRange成员?
2.使用AddRange函数,初始和后续添加是否会更快?
3.为什么一个版本的代码运行速度慢于相同版本的任何想法?
感谢您提供的任何帮助.
如何在BindingList中查找具有属性等于特定值的对象.以下是我的代码.
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
}
BindingList<Product> productList = new BindingList<Product>();
Run Code Online (Sandbox Code Playgroud)
现在考虑productList有100个产品,我想找到id为10的产品对象.
我可以找到它
productList.ToList<Product>().Find(p =>p.ProductID == 1);
Run Code Online (Sandbox Code Playgroud)
但我觉得使用ToList()是一个不必要的听到这里.有没有直接的方法来做到这一点,没有"查找"方法BindingList<T>
我有一个自定义BindingList,我想为其创建一个自定义的AddRange方法.
public class MyBindingList<I> : BindingList<I>
{
...
public void AddRange(IEnumerable<I> vals)
{
foreach (I v in vals)
Add(v);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是大型集合的性能很糟糕.我正在调试的情况是尝试添加大约30,000条记录,并花费了不可接受的时间.
在线查看此问题之后,似乎问题在于使用Add每次添加时调整数组大小.我认为这个答案总结为:
如果您使用Add,它会根据需要逐渐调整内部数组的大小(加倍)
我可以在自定义AddRange实现中做什么来指定BindingList需要根据项目数量调整大小,而不是让它在每个项目添加时不断重新分配数组?
bindinglist ×10
c# ×6
winforms ×4
data-binding ×3
.net ×2
sorting ×2
wpf ×2
addrange ×1
c#-4.0 ×1
datagridview ×1
linq ×1
listbox ×1
vb.net ×1