2012-07-05 46 views
33

tengo algo de código que establece el valor de las células en un DataRow por nombre de columna es decirobtener el índice de la columna DataTable con nombre

row["ColumnName"] = someValue; 

Quiero establecer también el valor para esta fila en la columna inmediatamente a la derecho del que se encuentra arriba. Claramente, si obtuviera la celda por índice en lugar de por nombre de columna, sería fácil. Entonces, ¿hay una manera de conseguir el índice de columna del nombre de la columna permitiendo así que haga:

row[index + 1] = someOtherValue; 

es decir, ¿tengo que crear una especie de diccionario de nombres de índices de columna y columna, cuando se crea inicialmente la mesa, o ¿Puedo obtener el índice del nombre de la columna más adelante sin hacer esto?

Respuesta

60

Puede usar DataColumn.Ordinal para obtener el índice de la columna en el DataTable. Así que si usted necesita la siguiente columna como el uso mencionado Column.Ordinal + 1:

row[row.Table.Columns["ColumnName"].Ordinal + 1] = someOtherValue; 
+0

+1 exactamente lo que necesitaba - gracias! – Andy

+2

No necesita la fila '+ 1' just' [row.Table.Columns ["ColumnName"]. Ordinal] = someOtherValue; 'funcionará. –

+3

@Piers: pero OP necesitaba la siguiente columna después de otra columna. –

28

Prueba esto:

int index = row.Table.Columns["ColumnName"].Ordinal; 
+2

+1 aunque como Tim te haya vencido, marcaré el suyo como la respuesta. – Andy

3

me escribió un método de extensión de DataRow que me pone el objeto a través del nombre de la columna.

public static object Column(this DataRow source, string columnName) 
{ 
    var c = source.Table.Columns[columnName]; 
    if (c != null) 
    { 
     return source.ItemArray[c.Ordinal]; 
    } 

    throw new ObjectNotFoundException(string.Format("The column '{0}' was not found in this table", columnName)); 
} 

Y Se llama así:

DataTable data = LoadDataTable(); 
foreach (DataRow row in data.Rows) 
{   
    var obj = row.Column("YourColumnName"); 
    Console.WriteLine(obj); 
} 
+0

¿Debería esta extensión arrojar "ObjectNotFoundException" en lugar de "ItemNotFoundException" ?? http://msdn.microsoft.com/en-us/library/system.data.objectnotfoundexception%28v=vs.110%29.aspx –

+0

Muy bien, he actualizado la respuesta. –

+0

-1 DataRow tiene eso ya incorporado en su ejemplo si hizo una fila ["YourColumnName"] devolverá el contenido de esa celda. Si la columna no existe arroja System.ArguementException y este es el mensaje {"Column 'YourColumnName' no pertenece a la tabla Table."} Por lo tanto, a menos que tenga algún aumento de rendimiento, elimine. Además, esto no responde a la pregunta de cómo obtener el índice. – DeadlyChambers

5

puede simplemente usar DataColumnCollection.IndexOf

Para que pueda obtener el índice de la columna requerida por su nombre y luego utilizarlo con su fila:

row[dt.Columns.IndexOf("ColumnName")] = columnValue; 
Cuestiones relacionadas