C# 以编程方式选择datagridview行不会触发bindingsource.currentchanged事件

C# 以编程方式选择datagridview行不会触发bindingsource.currentchanged事件,c#,winforms,C#,Winforms,这是一个WinC形式的问题 我有一个定制的datagridview,它绑定到bindingsource。有一个侦听器正在侦听bindingsource.currentchanged事件 当我订阅自定义datagridview的排序事件并以编程方式选择行时,bindingsource.currentchanged事件不会被激发: dataGridViewExtended.Sorted += SortedCompleted; private void SortedCompleted(...){

这是一个WinC形式的问题

我有一个定制的datagridview,它绑定到bindingsource。有一个侦听器正在侦听bindingsource.currentchanged事件

当我订阅自定义datagridview的排序事件并以编程方式选择行时,bindingsource.currentchanged事件不会被激发:

dataGridViewExtended.Sorted += SortedCompleted;
private void SortedCompleted(...){
    // Some code to get rowIndex...
    dataGridViewExtended.Rows[rowIndex].Selected = true;    
}

为什么以编程方式更改datagridview行的选择不会触发bindingsource.currentchanged?我怎样才能触发该事件?

我找到了原因。选择DataGridView行不会触发BindingSource的CurrentChanged事件。部分原因是可以同时选择多行。要触发该事件,需要设置DataGridView的CurrentCell。任何时候,CurrentCell只能是一个。更新CurrentCell后,将立即触发CurrentChanged事件


在我的情况下,只需将所选行的第一个单元格设置为CurrentCell即可。

我找到了原因。选择DataGridView行不会触发BindingSource的CurrentChanged事件。部分原因是可以同时选择多行。要触发该事件,需要设置DataGridView的CurrentCell。任何时候,CurrentCell只能是一个。更新CurrentCell后,将立即触发CurrentChanged事件

在我的例子中,只需将所选行的第一个单元格设置为CurrentCell即可。

您可以使用CurrentCell属性设置CurrentRow

CurrentRow是只读的

所选属性不影响CurrencyManager

在某些DataGridView事件中,从代码更改CurrentRow有一些限制,它可能引发异常

要从Dgv事件更改CurrentRow,可以使用Control.BeginInvoke异步发布更改。

可以使用CurrentCell属性设置CurrentRow

CurrencyManager DtCm; //SETUP CURRENCY MANAGER
DtCm = (CurrencyManager)this.BindingContext[DtTable]; //BIND CURRENCY MANAGER
int F = Dgv.CurrentRow.Index; //SET INDEX POSITION
this.DtCm.Position = F; //RESTORE POSITION
CurrentRow是只读的

所选属性不影响CurrencyManager

在某些DataGridView事件中,从代码更改CurrentRow有一些限制,它可能引发异常


要从Dgv事件更改CurrentRow,可以使用Control.BeginInvoke异步发布更改。

表单从Control继承。编写BeginInvoke时,您可以调用您的表单。BeginInvoke.Form继承自控件。写作开始,你称之为表单。
CurrencyManager DtCm; //SETUP CURRENCY MANAGER
DtCm = (CurrencyManager)this.BindingContext[DtTable]; //BIND CURRENCY MANAGER
int F = Dgv.CurrentRow.Index; //SET INDEX POSITION
this.DtCm.Position = F; //RESTORE POSITION