¿Cómo puedo agregar una nueva columna y datos a una tabla de datos que ya contiene datos?

81

¿Cómo agrego un objeto nuevo DataColumna un DataTableobjeto que ya contiene datos?

Pseudocódigo

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", type(System.Int32));

foreach(DataRow row in dr.Rows)
{
    //need to set value to NewColumn column
}
Michael Kniskern
fuente

Respuestas:

126

Continúe con su código, está en el camino correcto:

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", typeof(System.Int32));

foreach(DataRow row in dt.Rows)
{
    //need to set value to NewColumn column
    row["NewColumn"] = 0;   // or set it to some other value
}

// possibly save your Dataset here, after setting all the new values
marc_s
fuente
¿Necesitas llamar dt.AcceptChanges()después de agregar la nueva columna y valor?
Michael Kniskern
2
@Michael: no, en realidad no. Su conjunto de datos ahora está preparado con esos nuevos valores. Si desea guardarlo, debe tener algún tipo de método para volver a escribirlo (a través del SqlDataAdapter o algún otro medio). AcceptChanges () no hará nada (excepto marcar esos cambios como "aceptados" -> ¡no serán detectados para guardar la próxima vez que guarde sus datos!)
marc_s
13

¿No debería ser en foreachlugar de para?

//call SQL helper class to get initial data  
DataTable dt = sql.ExecuteDataTable("sp_MyProc"); 

dt.Columns.Add("MyRow", **typeof**(System.Int32)); 

foreach(DataRow dr in dt.Rows) 
{ 
    //need to set value to MyRow column 
    dr["MyRow"] = 0;   // or set it to some other value 
} 
Imir Hoxha
fuente
7

Aquí hay una solución alternativa para reducir el bucle For / ForEach, esto reduciría el tiempo de bucle y las actualizaciones rápidamente :)

 dt.Columns.Add("MyRow", typeof(System.Int32));
 dt.Columns["MyRow"].Expression = "'0'";
Akxaya
fuente
2
@Akxaya, ¿le importaría explicar cómo funciona esa solución?
Mikael Dúi Bolinder
DataTable dt = sql.ExecuteDataTable ("sp_MyProc"); // dt.Columns.Add ("MyRow", typeof (System.Int32)); dt.Columns ["MyRow"]. Expresión = "'0'";
Akxaya
6

Solo usted desea establecer el parámetro de valor predeterminado. Este llamado tercer método de sobrecarga.

dt.Columns.Add("MyRow", type(System.Int32),0);
Nishantha
fuente
2

Prueba esto

> dt.columns.Add("ColumnName", typeof(Give the type you want));
> dt.Rows[give the row no like  or  or any no]["Column name in which you want to add data"] = Value;
Himanshu Shukla
fuente