2009-07-30 36 views
13

Tôi đang bối rối trên DataTable.DefaultView.Sort. Đây là đoạn mã tôi muốn sử dụng.DataTable.DefaultView.Sort Không sắp xếp

actionLogDT.DefaultView.Sort = "StartDate"; 

foreach (CustomerService.ActionLogStartEndRow logRow in actionLogDT) 
{ 
    // code here 
} 

Mẫu tôi đã thấy không sử dụng vòng lặp foreach và do đó làm tôi khó hiểu về cách xử lý. Nó không phân loại như tôi nghĩ.

Tôi thấy điều đó .DefaultView trả về chế độ xem và .Table cung cấp lỗi biên dịch.

+0

câu hỏi/nhầm lẫn của bạn là gì? bạn đang gặp phải lỗi biên dịch nào? – shahkalpesh

+1

Nó không phải là phân loại. –

+2

Khi sắp xếp theo cột ngày, cột đó phải được định nghĩa là một DateTime trong DataTable. Khác nó có thể được coi là một chuỗi và được sắp xếp theo thứ tự không mong muốn. – DOK

Trả lời

7

Tôi đã phải mất một cách tiếp cận hơi khác nhau. This post là số gần nhất tôi có thể tìm thấy để mã của tôi hoạt động. Đây là kết quả hoạt động:

actionLogDT.DefaultView.Sort = "StartDate"; 
DataView dv = actionLogDT.DefaultView; 

foreach (DataRowView logRow in dv) { . . . } 

Từ đó tôi chỉ phải truyền giá trị trở lại vào loại phù hợp.

(string)logRow["Status"].ToString() 
+0

Truyền là dự phòng ... '.ToString()' là đủ. – vapcguy

10

Sắp xếp chế độ xem sẽ không thay đổi thứ tự sắp xếp của dữ liệu trong bảng, chỉ theo thứ tự trong chế độ xem. Nó sẽ hoạt động nếu bạn thực hiện foreach trên chế độ xem thay vào đó, chuyển hàng từ DataRowView trở lại hàng được nhập mạnh mẽ của bạn.

foreach (DataRowView logRowView in actionLogDT.DefaultView) 
{ 
    CustomerService.ActionLogStartEndRow logRow = logRowView.Row as CustomerService.ActionLogStartEndRow; 
    // code here 
} 
+0

Làm điều đó mang lại cho tôi một "Không thể truyền đối tượng thuộc loại 'System.Data.DataRowView' để nhập 'ActionLogStartEndRow'." lỗi. –

+0

Liệu 'ActionLogStartEndRow' có xuất phát từ DataRow không? –

+0

@Jeromy - Tôi chắc chắn là vậy. Tôi đang sử dụng lớp dữ liệu .XSD để thực hiện tất cả điều này. –

3
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... } 
0

Chỉ cần tò mò: Tại sao bạn sử dụng DataRowView?

tức

foreach (DataRow row in actionLogDT.Rows) 
{ 
    Console.WriteLine(row["Status"]); 
} 
+1

Tôi không hiểu câu hỏi của bạn. –

+1

Bởi vì câu hỏi là về sắp xếp một datatable. Để liệt kê các dữ liệu được sắp xếp bạn cần liệt kê khung nhìn, không phải bảng. –

1

Vui lòng thử này:

actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc"; 
+0

Tôi sẽ thử lần sau khi gặp sự cố này. –

22
actionLogDT.DefaultView.Sort = "StartDate"; 

actionLogDT = actionLogDT.DefaultView.ToTable(); 
+1

Cảm ơn bạn! Đúng thứ tôi cần.Có được một bảng, sắp xếp nó, và sử dụng nó trong khi nó được sắp xếp theo một cách nào đó. – Lukas

+0

Kịch bản/triệu chứng hơi khác với tôi, nhưng .toTable() đã giải quyết vấn đề này cho tôi. Cảm ơn. Trong trường hợp của tôi, tôi đã áp dụng các biểu thức DefaultView.Sort tốt và nhìn thấy các loại có hiệu lực cho DropDownList, nhưng nó đã không có hiệu lực cho một DataGrid. YMMV: DataGrid mà chúng tôi đang áp dụng này là một bảng chỉ đọc rất cơ bản không cung cấp phân loại động, v.v. – storsoc

0

Nếu bạn cần một DataTable trở lại sau đó bạn có thể làm một cái gì đó như:

var dv = actionLogDT.DefaultView; 
dv.Sort = "StartDate"; 

actionLogDT = dv.ToTable(); 
3

Bên cạnh đó, Vì nó có vẻ như bạn muốn lặp lại hồ sơ, bạn chỉ có thể lặp qua các đối tượng dataRowView trong DefaultView.

foreach (DataRowView drv in table.DefaultView) 
{ 
    string strValue = drv["ColumnName"].ToString(); 
    // its also worth mentioning that a DataRowView has a Row 
    strValue = drv.Row["ColumnName"].ToString(); 
}