为什么DataRow在方法的一部分中被识别而在另一部分中被识别(我如何动态地添加DataRows)?

时间:2012-08-22 21:46:12

标签: c# winforms oracle dynamic dotconnect

使用此代码:

OracleDataTable dt = PlatypusSchedData.GetAvailablePlatypi(); 
OracleDataTable outputDt = new OracleDataTable();

int iRows = 12;
while (iRows > 0)
{
    outputDt.Rows.Add(new DataRow()); // line 1
    //var dr = new DataRow();     // line 2a
    //outputDt.Rows.Add(dr);      // line 2b
    iRows -= 1;
}

for (int i = 0; i < dt.Rows.Count; i += 1) {
    DataRow dr = dt.Rows[i];
    int outputColumn = 0;
    if (i % 12 == 0 && i > 0) {
        outputColumn += 1; //2?
    }
    outputDt.Rows[i % 12][outputColumn] = dr[0];
    outputDt.Rows[i % 12][outputColumn + 1] = dr[1];
}
dataGridView1.DataSource = outputDt;

...我使用第1行(注释掉第2a和2b行)或使用第2a和2b行(第1行注释掉)得到这个编译时错误:

由于其保护级别

'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)'无法访问

这令我感到困惑,因为for循环中的DataRow是可以容忍的。如何将这些DataRows添加到OracleDataTable中?

2 个答案:

答案 0 :(得分:19)

DataRow的构造函数标记为protected internal,因此您无法直接构造它。

获取DataTable的新行的正确代码是

DataRow dr = dt.NewRow();

答案 1 :(得分:3)

我不熟悉OracleDataTable,但我认为它继承了普通的DataTable

您无法直接创建DataRow,因为构造函数为protected。相反,您必须使用其中一种工厂方法,例如DataTable.Rows.AddDataTable.NewRow。这可确保在新DataRow上应用正确的架构,因为它是根据DataTable确定的。

所以这应该有效:

while (iRows > 0)
{
    DataRow dr = outputDt.NewRow();
    // fill the fields of the row ...
    // add it to the DataTable:
    outputDt.Rows.Add(dr);
    iRows -= 1;
}