2012-08-22 5 views
5

Con este código:¿Por qué se reconoce una DataRow en una parte de un método pero no en otra (cómo puedo agregar DataRows dinámicamente)?

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; 

... me sale este error en tiempo de compilación usando cualquiera de las líneas 1 (líneas 2a y 2b comentado) o el uso de líneas 2a y 2b (con la línea 1 comentada):

'System.Data.DataRow.DataRow (System.Data.DataRowBuilder)' es inaccesible debido a su nivel de protección

Esta mí porque el DataRow se tolera en el bucle for es desconcertante. ¿Cómo puedo agregar estas DataRows a mi OracleDataTable?

Respuesta

19

El constructor para DataRow está marcado como protected internal, y como tal, no puede construirlo directamente.

El código correcto para obtener una nueva fila para un DataTable es

DataRow dr = dt.NewRow(); 
3

No estoy familiarizado con OracleDataTable pero supongo que hereda de una normal de DataTable.

No se puede crear un DataRow directamente porque el constructor es protected. En su lugar, debe utilizar uno de los métodos de fábrica como DataTable.Rows.Add o DataTable.NewRow. Esto asegura que el esquema correcto se aplica en el nuevo DataRow porque se determina a partir de su DataTable.

Así que esto debería funcionar:

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