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

检测BindingSource SortChanged事件以在winforms中实现双向绑定,winforms,datagridview,bindingsource,Winforms,Datagridview,Bindingsource,我正在尝试使用C#winforms编写一个双向绑定应用程序 我将BindingNavigator和DataGridView绑定到同一数据源 因此,我可以使用双向绑定(在winforms中为yes),我希望能够在bindingSource排序顺序发生更改时进行检测 当我单击DataGridView的列标题时,网格的排序顺序会改变 并且BindingSource.ListChanged事件不会触发 但是bindingSource.Sort仍然为空 单击网格列标题时,将触发BindingSource.

我正在尝试使用C#winforms编写一个双向绑定应用程序 我将BindingNavigator和DataGridView绑定到同一数据源

因此,我可以使用双向绑定(在winforms中为yes),我希望能够在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列标题不设置bindingSource.Sort属性?
为了检测bindingSource排序已更改,我应该侦听什么事件?

遇到此问题(原因与多列排序不同)我发现,Bindingsource没有排序更改事件,也没有触发Datagridview的自己的排序事件(它似乎只是在排序时触发),这让我感到惊讶

datagridview“知道”甚至更改其排序图示符位置

我解决这个问题的方法并不适合大多数人,因为它是特定于我正在编写的任务的。在我的多列排序例程中,我跟踪bindingsource.sort字符串,然后跟踪Datagridview中的常规事件(当前正在尝试SelectionChanged)我将我的排序字符串与当前的Bindingsource字符串进行比较,并在不同时关闭多列排序指示器。这对我来说没问题,因为我所有的数据网格都基于一个通用的自定义控件

我想到的唯一其他方法是基于Bindingsource创建一个自定义控件,并添加一个排序方法(调用Bindingsource排序方法),然后触发我自己的事件。如果刚开始一个新项目,但改变一个大项目却成了一件痛苦的事,这将是很好的

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

希望这对面临同样问题的人有所帮助