如何将bindingdatasource转换为datatable?

我正在尝试使用此代码将bindingdatasource转换为datatable

BindingSource bs = (BindingSource)gvSideMember.DataSource; DataTable tCxC = (DataTable)bs.DataSource; 

抛出错误无法将bindingsource强制转换为datatable

然后我尝试了这段代码

  private DataTable GetDataTableFromDGV(DataGridView dgv) { var dt = ((DataTable)dgv.DataSource).Copy(); foreach (DataGridViewColumn column in dgv.Columns) { if (!column.Visible) { dt.Columns.Remove(column.Name); } } return dt; } 

它再次向我显示同样的错误

  DataTable dt = new DataTable(); DataSourceSelectArguments args = new DataSourceSelectArguments(); DataView dv = new DataView(); dv = (DataView)SqlDataSource1.Select(args); dt = dv.ToTable(); 

但我不知道DataSourceSelectArguments的基类是什么? 所以我不能怎么做这个演员?

看起来你的bs.DataSource实际上是另一个BindingSource ,所以你可以试试这个:

 var source = bs.DataSource; while(source is BindingSource){ source = ((BindingSource)source).DataSource; } if(source is DataTable){ var table = (DataTable) source; }//else there is not any DataTable we can extract. 

这是我的解决方案,如果您使用BindingSource作为n子级别也可以。

  public static DataTable Table(this DataGridView dgv) { DataTable dt; if (dgv.DataSource is BindingSource) dt = ((BindingSource)dgv.DataSource).Table(); else if (dgv.DataSource is DataSet) dt = ((DataSet)dgv.DataSource).Tables[dgv.DataMember]; else if (dgv.DataSource is DataTable) dt = (DataTable)dgv.DataSource; else dt = null; return dt; } public static DataTable Table(this BindingSource bs) { var bsFirst = bs; while (bsFirst.DataSource is BindingSource) bsFirst = (BindingSource)bsFirst.DataSource; DataTable dt; if (bsFirst.DataSource is DataSet) dt = ((DataSet)bsFirst.DataSource).Tables[bsFirst.DataMember]; else if (bsFirst.DataSource is DataTable) dt = (DataTable)bsFirst.DataSource; else return null; if (bsFirst != bs) { if (dt.DataSet == null) return null; dt = dt.DataSet.Relations[bs.DataMember].ChildTable; } return dt; }