【问题标题】:How to cast bindingdatasource to datatable?如何将绑定数据源转换为数据表?
【发布时间】:2013-12-06 12:42:48
【问题描述】:

我正在尝试使用此代码将绑定数据源转换为数据表

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

抛出错误,无法将绑定源转换为数据表

然后我尝试了这段代码

 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 的基类是什么?所以我不能怎么做这个演员?

【问题讨论】:

  • 你在bindingsource的datasource中设置了什么??

标签: c# casting datatable bindingsource


【解决方案1】:

看起来你的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.

【讨论】:

  • 我把 gvSideMember 放在哪里?
  • @buddy 我的代码不涉及gvSideMember,它涉及bs,你如何得到bs?很明显你是从gvSideMember 那里得到的。
  • 它在调试过程中什么也不做,它不会进入not in while 和not in other if
  • @buddy 你有这个(DataTable)bs.DataSource,它抛出这个unable to cast bindingsource to datatable。那么为什么它会像这样抛出呢?这意味着bs.DataSource 应该是BindingSource,因此应该进入while 循环并循环至少1 次。
  • 真的没有进入while循环
【解决方案2】:

这是我的解决方案,如果您使用 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;
    }

【讨论】:

  • 你真的应该添加一些解释为什么这应该工作 - 你也可以添加代码以及代码本身中的 cmets - 在当前的形式中,它没有提供任何可以帮助的解释社区的其他人了解您为解决/回答问题所做的工作。这对于较早的问题和已经有答案的问题尤其重要。
  • 如果您没有孩子,则子检查会导致在有效表上返回“null”。如果您没有孩子,只需将此部分注释掉即可。不错。
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 2011-03-12
  • 2022-01-23
  • 2013-02-13
  • 2012-02-17
  • 1970-01-01
  • 2013-02-15
  • 2017-08-03
相关资源
最近更新 更多