如何将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; }