2012-07-05 8 views
33

Ho qualche codice che imposta il valore di cellule in un DataRow per nome colonna cioèottenere l'indice di colonna DataTable con nome

row["ColumnName"] = someValue; 

voglio impostare anche il valore di questa riga nella colonna subito a diritto di quello trovato sopra. Chiaramente se stavo ottenendo la cella per indice piuttosto che per nome di colonna questo sarebbe facile. Quindi non v'è un modo di ottenere l'indice di colonna dal nome della colonna permettendo così che io faccia:

row[index + 1] = someOtherValue; 

cioè ho bisogno di creare una sorta di dizionario di nomi di indici colonna e colonna quando la tabella viene inizialmente creato, o posso ottenere l'indice dal nome della colonna in seguito senza farlo?

risposta

60

È possibile utilizzare DataColumn.Ordinal per ottenere l'indice della colonna nel DataTable. Quindi, se avete bisogno della colonna successiva come l'uso menzionato Column.Ordinal + 1:

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

+1 esattamente ciò di cui avevo bisogno - grazie! – Andy

+2

Non hai bisogno di '+ 1' solo' riga [row.Table.Columns ["ColumnName"]. Ordinal] = someOtherValue; 'farà. –

+3

@Piers: ma OP aveva bisogno della colonna successiva dopo un'altra colonna. –

28

Prova questa:

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

+1 anche se, come Tim vi ha battuto, segnerò la sua come risposta. – Andy

3

Ho scritto un metodo di estensione di DataRow che mi ottiene l'oggetto tramite il nome della colonna.

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)); 
} 

E la sua chiamata in questo modo:

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

Questa estensione genera "ObjectNotFoundException" anziché "ItemNotFoundException" ?? http://msdn.microsoft.com/en-us/library/system.data.objectnotfoundexception%28v=vs.110%29.aspx –

+0

Giusto, ho aggiornato la risposta. –

+0

-1 DataRow ha già incorporato nel tuo esempio se hai fatto row ["YourColumnName"] restituirà il contenuto di quella cella. Se la colonna non esiste getta System.ArguementException e questo è il messaggio {"Column 'YourColumnName' non appartiene alla tabella Table."} Quindi, a meno che questo non abbia un guadagno di prestazioni, per favore cancella. Anche questo non risponde alla domanda su come ottenere l'indice. – DeadlyChambers

5

si può semplicemente utilizzare DataColumnCollection.IndexOf

In modo che si può ottenere l'indice della colonna richiesta dal nome quindi utilizzarlo con la riga:

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