将DataGrid转换为DataTable

时间:2017-06-19 18:58:02

标签: c# .net asp.net-mvc datatable datagrid

.NET中将DataGrid转换为DataTableDataGrid.ItemsSource的等价物在.Net csharp中未定义。

谢谢!

DataTable dt = new DataTable();
dt = ((DataView)DataGrid1.ItemsSource).ToTable();

修改

这不是重复,因为前面的代码是针对WPF的,我正在寻找一个asp.net mvc csharp的答案。

4 个答案:

答案 0 :(得分:2)

ItemsSource适用于WPF。使用DataSource并将其转换为DataTable,如下所示:

dt = (DataTable)DataGrid1.DataSource;

编辑:如果您遇到上述方法的问题,可以使用这样的自定义方法:

private DataTable ToDataTable(DataGridView dataGridView)
{
    var dt = new DataTable();
    foreach (DataGridViewColumn dataGridViewColumn in dataGridView.Columns)
    {
        if (dataGridViewColumn.Visible)
        {
            dt.Columns.Add();
        }
    }
    var cell = new object[dataGridView.Columns.Count];
    foreach (DataGridViewRow dataGridViewRow in dataGridView.Rows)
    {
        for (int i = 0; i < dataGridViewRow.Cells.Count; i++)
        {
            cell[i] = dataGridViewRow.Cells[i].Value;
        }
        dt.Rows.Add(cell);
    }
    return dt;
}

然后使用它:

var dataTable = ToDataTable(dataGridView1);

如果MoreLinq的类型是列表,Datasource也是一个不错的选择。检查此解决方案以了解如何使用它:https://stackoverflow.com/a/42550827/2946329

答案 1 :(得分:1)

如果您指的是System.Windows.Forms.DataGridSystem.Web.UI.WebControls.DataGrid,那么最好的方法是将Datasource属性转换为DataTable

当然,Datasource属性实际上必须是DataTable基础类型才能开始。您需要知道Datasource属性中存储的对象的基础类型。

如果Datasource的基础类型是通用列表,则此SO帖子应该有所帮助:How to convert a list into data table

仅供参考 - Windows窗体DataGrid控件according to Microsoft已被DataGridView取代。

答案 2 :(得分:0)

如果datagridview中有可见的列,您可以使用

    private DataTable ToDataTable(DataGridView dataGridView)
    {
        var dt = new DataTable();
        int columnCount = 0;
        List<int> columnNumbers= new List<int>();

        foreach (DataGridViewColumn dataGridViewColumn in dataGridView.Columns)
        {


            if (dataGridViewColumn.Visible)
            {
                dt.Columns.Add(dataGridViewColumn.Name);                   
                columnNumbers.Add(columnCount);

            }
            columnCount++;
        }

        var cell = new object[columnNumbers.Count];
        foreach (DataGridViewRow dataGridViewRow in dataGridView.Rows)
        {
            int i = 0;
            foreach (int a in columnNumbers)
            {
                cell[i] = dataGridViewRow.Cells[a].Value;
                i++;
            }
            dt.Rows.Add(cell);
        }
        return dt;
    }

答案 3 :(得分:0)

自定义方法未考虑隐藏的列。您收到一个错误消息,因为您复制的列的单元格过多。

您可以使用:

int dgv1RowCount = dgv1.Rows.Count;
int numOfColumns = dgv1.Columns.GetColumnCount(DataGridViewElementStates.Visible) ;
int numCells = dgv1RowCount * numOfColumns;
// use numCells in the for loop
for (int i = 0; i < numOfCells ; i++)
{
    enter code here
}