找不到列“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);
只有在这之后,您才能将数据放入第一列。
您可以尝试使用 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);
}
我有如下一段代码。
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);
只有在这之后,您才能将数据放入第一列。
您可以尝试使用 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);
}