我正在尝试使用C#winforms编写双向绑定应用程序 我有一个BindingNavigator和一个绑定到同一数据源的DataGridView
这样我就可以进行2路绑定(在winforms中是的)我希望能够检测到bindingSource排序顺序何时发生了变化。
当我单击DataGridView的列标题时,网格的排序顺序确实发生了变化 并且BindingSource.ListChanged事件触发
然而,bindingSource.Sort仍然为空
单击网格列标题时,BindingSource.ListChanged事件会触发
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.Reset)
{
if (bindingSource.Sort != null)
{
controller.Sort = bindingSource.Sort; // never gets here. Why?
}
}
}
为什么不单击DataGridView Column标头设置bindingSource.Sort属性? 我应该监听什么事件才能检测到bindingSource排序已经改变了?
答案 0 :(得分:1)
遇到这个问题(出于不同的原因,如在多列排序中)我发现 Bindingsource 没有排序更改事件,也没有 Datagridview的> 自己的Sorted事件不会随之激活(它只是在进行排序时才会触发)。
datagridview“知道”甚至更改其排序字形位置。
我解决这个问题的方式不适合大多数,因为它特定于我正在编码的任务。在我的多列排序例程中,我跟踪 bindingsource.sort 字符串,然后跟踪Datagridview中的常规事件(当前正在尝试 SelectionChanged )我将我的排序字符串与当前 Bindingsource 一个,当它不同时关闭我的多列排序指标。这对我来说没问题,因为我的所有Datagrids都基于一个常见的自定义控件。
我想到的另一种方法是创建一个基于Bindingsource的自定义控件并添加一个sort方法(调用bindingsource排序方法),然后触发我自己的事件。如果开始一个新项目,但改变一个大型程序会变得很痛苦,那就没问题了。
令人遗憾的是,我从一开始就为每个UI控件(Winforms)创建了一个自定义控件,但从未想过为数据访问创建一个通用控件。
希望这可以帮助面临同样问题的人。