找不到列“0”C#

Cannot find column '0' C#

我有如下一段代码。

dt3 = new System.Data.DataTable();
            foreach (DataRow sourceRow in dt2.Rows) {
                DataRow destRow = dt3.NewRow();
                destRow[0] = sourceRow[2];
                dt3.Rows.Add(destRow);
            }

它在行 destRow[0] = sourceRow[2];

上产生以下错误

System.IndexOutOfRangeException: Cannot find column 0.

我做错了什么?有什么办法可以在不事先声明列的情况下解决这个问题吗?

这一行 dt3 = new System.Data.DataTable(); 创建了一个新的 DataTable。但是这个 table 还没有包含任何列。事实上,它是一个空 table.

此行 destRow[0] = sourceRow[2]; 尝试设置 table 第一列的值。但是,您的 table 尚未包含任何列。这就是错误消息试图告诉您的内容。

您必须在创建 table 之后创建您的专栏。你可以这样做:

DataColumn idColumn = new DataColumn();
idColumn.DataType = System.Type.GetType("System.Int32");
idColumn.ColumnName = "id";
dt3.Columns.Add(idColumn);

只有在这之后,您才能将数据放入第一列。

请看this example in the Microsoft docs

您可以尝试使用 Clone() 方法将 structure/columns 从源 table 复制到目标 table:

var dt3 = dt2.Clone();

来自docs.

这里我们创建一个包含 3 列的“源”数据表,select 新数据表的其中两列:

DataTable srcDataTable = new DataTable();
srcDataTable.Columns.Add("Column A", typeof(string));
srcDataTable.Columns.Add("Column B", typeof(int));
srcDataTable.Columns.Add("Column C", typeof(int));

DataTable dstDataTable = new DataTable();
var desiredColumns = new[] { "Column A", "Column C" };
foreach (DataColumn col in srcDataTable.Columns)
{
    if (desiredColumns.Contains(col.ColumnName))
    {
        dstDataTable.Columns.Add(col.ColumnName, col.DataType, col.Expression);
    }
}

现在您可以简单地遍历源 table 并根据需要复制行数据。复制行的示例:

foreach (DataRow srcRow in srcDataTable.Rows)
{
    var newRow = dstDataTable.NewRow();
    foreach (var columnName in desiredColumns)
    {
        newRow[columnName] = srcRow[columnName];
    }
    dstDataTable.Rows.Add(newRow);
}

使用列号的替代方法:

DataTable srcDataTable = new DataTable();
srcDataTable.Columns.Add("Column A", typeof(string));
srcDataTable.Columns.Add("Column B", typeof(int));
srcDataTable.Columns.Add("Column C", typeof(int));

DataTable dstDataTable = new DataTable();
var desiredColumns = new int[] { 0, 2 };
Dictionary<int, int> columnMap = new Dictionary<int, int>();

for (int colNum = 0; colNum < desiredColumns.Length; ++colNum)
{
    columnMap[colNum] = desiredColumns[colNum];
    dstDataTable.Columns.Add(srcDataTable.Columns[desiredColumns[colNum]].ColumnName, srcDataTable.Columns[desiredColumns[colNum]].DataType, srcDataTable.Columns[desiredColumns[colNum]].Expression);
}

foreach (DataRow srcRow in srcDataTable.Rows)
{
    var newRow = dstDataTable.NewRow();
    for (int colNum = 0; colNum < desiredColumns.Length; ++colNum)
    {
        newRow[colNum] = srcRow[columnMap[colNum]];
    }
    dstDataTable.Rows.Add(newRow);
}

What am I doing wrong?

Table dt3 没有第 0 列,因为您还没有添加

Is there any way around it without declaring columns beforehand?

即使您在编译时不一定知道 dt2 的第 2 列的列名或类型,您似乎知道您肯定希望 dt2 的第 2 列是 [=11 的第 0 列=],因此请确保向 dt3 添加一个与 dt2 的第 2 列类型相同的列(并且给它起相同的名称似乎也很合理):

        dt3 = new System.Data.DataTable();
        dt3.Columns.Add(dt2.Columns[2].ColumnName, dt2.Columns[2].DataType); 
        foreach (DataRow sourceRow in dt2.Rows) {
            DataRow destRow = dt3.NewRow();
            destRow[0] = sourceRow[2];
            dt3.Rows.Add(destRow);
        }