2012-07-05 17 views
33

mam jakiś kod, który ustawia wartość komórki w DataRow przez nazwę kolumny tjuzyskać indeks DataTable kolumnie z nazwą

row["ColumnName"] = someValue; 

Chcę też od razu ustawić wartość tego wiersza w kolumnie do prawo od powyższego. Najwyraźniej, jeśli pobierałbym komórkę według indeksu zamiast nazwy kolumny, byłoby to łatwe. Więc czy jest jakiś sposób na uzyskanie indeksu kolumny z nazwą kolumny co pozwala mi robić:

row[index + 1] = someOtherValue; 

czyli muszę stworzyć pewnego rodzaju słownika nazw indeks kolumny i kolumn, gdy stół jest początkowo tworzony, lub czy mogę uzyskać indeks z nazwy kolumny później bez robienia tego?

Odpowiedz

60

Możesz użyć DataColumn.Ordinal, aby uzyskać indeks kolumny w kolumnie DataTable. Więc jeśli potrzebujesz kolejną kolumnę jak wspomniano wykorzystania Column.Ordinal + 1:

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

+1 dokładnie to, czego potrzebowałem - dzięki! – Andy

+2

Nie potrzebujesz '+ 1' po prostu' wiersz [wiersz.Tabela.kolumny ["nazwa kolumny"] .Zwykle] = someOtherValue; 'zrobi. –

+3

@Piers: ale OP potrzebował następnej kolumny za kolejną kolumną. –

28

Spróbuj tego:

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

+1, chociaż Tim cię pobił, oznaczę to jako odpowiedź. – Andy

3

napisałem metodę rozszerzenia z DataRow który pobiera mi obiektu poprzez nazwę kolumny.

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

A jego nazwie tak:

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

Czy to rozszerzenie powinno generować "ObjectNotFoundException" zamiast "ItemNotFoundException"? http://msdn.microsoft.com/en-us/library/system.data.objectnotfoundexception%28v=vs.110%29.aspx –

+0

Całkiem dobrze, zaktualizowałem odpowiedź. –

+0

-1 DataRow ma już zbudowany w twoim przykładzie, jeśli zrobiłeś wiersz ["YourColumnName"], to zwróci zawartość tej komórki. Jeśli kolumna nie istnieje, generuje wyjątek System.ArguementException i jest to komunikat {"Kolumna" TwojaNazwaKolumny "nie należy do Tabeli tabeli.}} Jeśli nie ma to pewnej poprawy wydajności, usuń ją. Również to nie odpowiada na pytanie, jak uzyskać indeks. – DeadlyChambers

5

można po prostu użyć DataColumnCollection.IndexOf

Więc czemu można uzyskać indeks wymaganej kolumny według nazwy następnie używać go z rzędu:

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