Как преобразовать источник данных в источник данных?
Я пытаюсь привести источник данных привязки к данным с помощью этого кода
BindingSource bs = (BindingSource)gvSideMember.DataSource;
DataTable tCxC = (DataTable)bs.DataSource;
выдает ошибку, не в состоянии преобразовать источник привязки в 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? Так я не могу, как я могу сделать этот актерский состав?
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.
Это мое решение, которое также работает, если вы используете 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;
}