Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DataGrid转换为DataTable_C#_.net_Asp.net Mvc_Datatable_Datagrid - Fatal编程技术网

C# 将DataGrid转换为DataTable

C# 将DataGrid转换为DataTable,c#,.net,asp.net-mvc,datatable,datagrid,C#,.net,Asp.net Mvc,Datatable,Datagrid,在.NET中将我的DataGrid转换为DataTable(DataGrid.ItemsSource在.NET csharp中没有定义)的等价物是什么 谢谢 DataTable dt = new DataTable(); dt = ((DataView)DataGrid1.ItemsSource).ToTable(); 编辑 这不是重复的代码,因为前面的代码是针对WPF的,我正在寻找asp.net mvc csharp答案。项目资源是针对WPF的。使用数据源并将其转换为数据表,如下所示: dt

在.NET中将我的
DataGrid
转换为
DataTable
DataGrid.ItemsSource
在.NET csharp中没有定义)的等价物是什么

谢谢

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


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

项目资源是针对WPF的。
使用
数据源
并将其转换为
数据表
,如下所示:

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;
}
编辑:如果您在上述方法中遇到问题,您可以使用如下自定义方法:

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

另外,如果
数据源的类型是列表,那么
MoreLinq
也是一个不错的选择。检查此解决方案以了解如何使用它:

如果您指的是
系统.Windows.Forms.DataGrid
系统.Web.UI.WebControls.DataGrid
,那么最好的方法是将
数据源
属性强制转换为a
数据表

当然,
Datasource
属性首先必须是
DataTable
基础类型。您需要知道存储在
Datasource
属性中的对象的基础类型

如果
Datasource
的底层类型是一个通用列表,那么这篇SO文章应该有帮助:


仅供参考-如果DataGridView中有可见列可供使用,则Windows窗体
DataGrid
控件已替换为
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;
    }
私有数据表到数据表(DataGridView DataGridView)
{
var dt=新数据表();
int columnCount=0;
List ColumnNumber=新列表();
foreach(dataGridView.Columns中的DataGridViewColumn DataGridViewColumn)
{
if(dataGridViewColumn.Visible)
{
dt.Columns.Add(dataGridViewColumn.Name);
ColumnNumber.Add(columnCount);
}
columnCount++;
}
var cell=新对象[ColumnNumber.Count];
foreach(dataGridView.Rows中的DataGridViewRow DataGridViewRow)
{
int i=0;
foreach(列号中的int a)
{
单元格[i]=dataGridViewRow.Cells[a].值;
i++;
}
dt.Rows.Add(单元格);
}
返回dt;
}

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

您可以使用:

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
}
int-dgv1RowCount=dgv1.Rows.Count;
int numOfColumns=dgv1.Columns.GetColumnCount(dataGridViewElementState.Visible);
int numCells=dgv1RowCount*numfocolumns;
//在for循环中使用numCells
对于(int i=0;i
可能重复@ArricryStringOfLetters No.重复帖子的代码与OP的代码相同,因为他/她提到了
DataGrid.ItemsSource
没有定义,所以他/她肯定不是在寻找WPF解决方案。我试过了,我得到了这个错误:无法强制转换'System.Collections.Generic.List'in type'System.Data.DataTable'@J.Lavoie-见我的answer@J.Lavoie好的。检查我更新的答案。我提供了另一种方法来实现这一点。我需要什么来使用DataGridView?Intellisense找不到我one@bnem好的。我知道。顺便说一句,MVC不包含任何名为
DataGrid
的助手。我指的是
System.Web.UI.WebControls.DataGrid
@J。Lavoie yes看到您的编辑并更新了我的答案,添加了将列表转换为Datatable的链接我在强制转换时出错,但可能是因为存储的对象的基本类型是类对象!@J.Lavoie在您对另一个答案的评论中,您出现了一个错误,因为您试图将通用列表转换为
Datatable
。请使用t我在回答中提供了链接。好吧,除了我的日期时间值转换成十进制外,这一切都很好!