检测BindingSource SortChanged事件以在winforms中实现双向绑定

时间:2014-09-01 20:42:33

标签: winforms datagridview bindingsource

我正在尝试使用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排序已经改变了?

1 个答案:

答案 0 :(得分:1)

遇到这个问题(出于不同的原因,如在多列排序中)我发现 Bindingsource 没有排序更改事件,也没有 Datagridview的 自己的Sorted事件不会随之激活(它只是在进行排序时才会触发)。

datagridview“知道”甚至更改其排序字形位置。

我解决这个问题的方式不适合大多数,因为它特定于我正在编码的任务。在我的多列排序例程中,我跟踪 bindingsource.sort 字符串,然后跟踪Datagridview中的常规事件(当前正在尝试 SelectionChanged )我将我的排序字符串与当前 Bindingsource 一个,当它不同时关闭我的多列排序指标。这对我来说没问题,因为我的所有Datagrids都基于一个常见的自定义控件。

我想到的另一种方法是创建一个基于Bindingsource的自定义控件并添加一个sort方法(调用bindingsource排序方法),然后触发我自己的事件。如果开始一个新项目,但改变一个大型程序会变得很痛苦,那就没问题了。

令人遗憾的是,我从一开始就为每个UI控件(Winforms)创建了一个自定义控件,但从未想过为数据访问创建一个通用控件。

希望这可以帮助面临同样问题的人。