2013-12-06 2 views
-1

Я пытаюсь бросить 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? Так что я не могу, как я могу сделать это?

+0

Что вы установили в источнике данных источника связывания? –

ответ

2

Похоже, ваш 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. 
+0

Где я могу разместить gvSideMember? – buddy

+0

@buddy мой код не включает 'gvSideMember', он включает' bs' и как вы получаете 'bs'? очевидно, что вы получили его от 'gvSideMember'. –

+0

ничего не делает во время отладки, он не вводит не во время, а не в другом, если – buddy

0

Это мое решение, которое также работает, если вы используете BindingSource как уровень п ребенка.

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; 
    } 
+0

Вы должны действительно добавить объяснение, почему это должно сработать - вы также можете добавить код, а также комментарии в самом коде - в его текущей форме он не дает никаких объяснений, которые может помочь остальной части сообщества понять, что вы сделали, чтобы решить/ответить на вопрос. Это особенно важно для более старого вопроса и вопросов, на которые уже есть ответы. –