2012-07-05 40 views
33

Tôi có một số mã mà đặt giá trị của các tế bào trong một DataRow theo tên cột tức làcó được chỉ số của cột DataTable với tên

row["ColumnName"] = someValue; 

Tôi muốn cũng thiết lập giá trị cho hàng này trong cột ngay cho bên phải của cái được tìm thấy ở trên. Rõ ràng nếu tôi đã nhận được các tế bào bằng chỉ số chứ không phải theo tên cột này sẽ được dễ dàng. Vậy là có một cách để nhận được các chỉ số cột từ tên cột do đó cho phép tôi làm:

row[index + 1] = someOtherValue; 

tức là tôi cần phải tạo ra một số loại từ điển của chỉ số cột và cột tên khi bảng được tạo ra ban đầu, hoặc tôi có thể lấy chỉ mục từ tên cột sau này mà không làm điều này không?

Trả lời

60

Bạn có thể sử dụng DataColumn.Ordinal để lấy chỉ mục của cột trong DataTable. Vì vậy, nếu bạn cần các cột tiếp theo như đã đề cập sử dụng Column.Ordinal + 1:

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

+1 chính xác những gì tôi cần - cảm ơn! – Andy

+2

Bạn không cần '+ 1' chỉ' hàng [row.Table.Columns ["ColumnName"]. Ordinal] = someOtherValue; 'sẽ làm. –

+3

@Piers: nhưng OP cần cột tiếp theo sau cột khác. –

28

Hãy thử điều này:

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

+1 mặc dù khi Tim đánh bại bạn với nó, tôi sẽ đánh dấu câu trả lời của anh ấy. – Andy

3

tôi đã viết một phương pháp mở rộng của DataRow mà được tôi đối tượng qua tên cột.

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

Và gọi nó như thế này:

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

Tiện ích mở rộng này có nên bỏ "ObjectNotFoundException" thay vì "ItemNotFoundException" không ?? http://msdn.microsoft.com/en-us/library/system.data.objectnotfoundexception%28v=vs.110%29.aspx –

+0

Khá đúng, tôi đã cập nhật câu trả lời. –

+0

-1 DataRow đã được xây dựng trong ví dụ của bạn nếu bạn đã viết hàng ["YourColumnName"], nó sẽ trả về nội dung của ô đó. Nếu cột không tồn tại nó ném System.ArguementException và đây là thông báo {"Cột 'YourColumnName' không thuộc bảng Table."} Vì vậy, trừ khi điều này có một số đạt được hiệu suất xin vui lòng xóa. Ngoài ra, điều này không trả lời câu hỏi về cách lấy chỉ mục. – DeadlyChambers

5

Bạn chỉ có thể sử dụng DataColumnCollection.IndexOf

Vì vậy mà bạn có thể nhận được các chỉ số của cột theo yêu cầu của tên sau đó sử dụng nó với hàng của bạn:

row[dt.Columns.IndexOf("ColumnName")] = columnValue; 
Các vấn đề liên quan