How to cast bindingdatasource to datatable?

牧云@^-^@ 提交于 2019-11-28 14:51:41

Looks like your bs.DataSource is actually another BindingSource, so you can try this:

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.

This is my solution which also works if you are using BindingSource as n child level.

    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;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!