2010-12-16 30 views
18

Tôi có một DataGridView được liên kết với một BindingSource.Cách sắp xếp DataGridView khi được liên kết với nguồn ràng buộc được liên kết với EF4 Entity

My BindingSource được liên kết với một danh sách IQueryable của đơn vị:

public void BindTo(IQueryable elements) 
    { 
     BindingSource source = new BindingSource(); 
     source.DataSource = elements; 

     bindingNavigator1.BindingSource = source; 
     dataGridView1.DataSource = source; 

    } 

Tôi muốn người dùng của tôi để có thể nhấp vào tiêu đề lưới điện để sắp xếp dữ liệu - đấu tranh để có được điều này để làm việc. Có thể không? Nếu vậy, làm thế nào để làm điều đó?

+0

Lưu ý: DataGridView có vẻ là WindowsForms, không phải WPF. Chỉ dành cho những người hy vọng tìm được giải pháp cho vấn đề phân loại WPF DataGrid của họ. – OneWorld

Trả lời

11

Gần đây tôi đã gặp khó khăn với cùng một vấn đề này; có vẻ như giao diện IQueryable không cung cấp đủ thông tin cho DataViewGrid để biết cách sắp xếp dữ liệu tự động; do đó, bạn phải đóng gói lại bộ sưu tập của mình từ nguồn Thực thể bằng cách sử dụng thứ gì đó có thể sử dụng hoặc làm những gì tôi đã làm và xử lý chức năng sắp xếp theo cách thủ công:

 private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
    DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex]; 

    _isSortAscending = (_sortColumn == null || _isSortAscending == false); 

    string direction = _isSortAscending ? "ASC" : "DESC"; 

    myBindingSource.DataSource = _context.MyEntities.OrderBy(
     string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList(); 

    if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None; 
    column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending; 
    _sortColumn = column; 
    } 

Tôi hy vọng điều đó sẽ hữu ích.

+0

Có cách nào để thực hiện việc này trong khi cho phép cập nhật không? Nếu bạn sử dụng ToList(), bạn sẽ chỉ có thể ghi vào danh sách tạm thời, và nếu bạn không sử dụng ToList, DataGridView dường như vô hiệu hóa thêm bản ghi nếu nó được liên kết với một IOrderedEnumerable ... –

+1

Tôi nhận ra rằng tôi cần để gọi ObjectQuery.OrderBy và không phải IEnumerable.OrderBy để duy trì liên kết có thể cập nhật. –

0

VB.NET

Nếu bạn đang sử dụng một BindingSource với cú pháp LINQ bạn có thể sắp xếp dữ liệu của bạn như thế này

Trong trường hợp này Khi tải một bindningsource liên kết với một datagridview từ thực thể framwork đối tượng "NCFile "với việc có một cột nước ngoài tham gia danh sách 'NCFilePartSet'

bsFileSections.DataSource = From ncfps In NCFile.NCFilePartSet Order By ncfps.Sort Select ncfps 

hay như thế này

bsFileSections.DataSource = NCFile.NCFilePartSet.OrderBy(Function(ncfps) ncfps.Sort) 

nơi "Sắp xếp" là một cột trong NCFilePartSet

cập nhật trên các đơn vị tiếp tục làm việc và phản ánh trở lại cơ sở dữ liệu

+2

OP muốn "[cho] người dùng của tôi ... nhấp vào tiêu đề lưới để sắp xếp dữ liệu". Câu trả lời của bạn hoạt động nếu bạn hardcode cột sắp xếp, nhưng làm thế nào để bạn xử lý databinding khi người dùng muốn thay đổi cột sắp xếp và không mất bất kỳ dữ liệu mà cô/anh ấy đã chỉnh sửa/thêm? Tôi nghĩ đó là thách thức thực sự ở đây. – Pat

0

Vâng, nó thể dễ dàng có một DGV sắp xếp được khi liên kết với EF dữ liệu. Sử dụng số BindingListView từ số BLW library (cũng có thể xem How do I implement automatic sorting of DataGridView?).

public void BindTo(IQueryable elements) 
{ 
    BindingSource source = new BindingSource(); 
    source.DataSource = new BindingListView(elements.ToList()); 

    bindingNavigator1.BindingSource = source; 
    dataGridView1.DataSource = source; 

} 

Trong các thử nghiệm của tôi, ngay cả khi .ToList() được gọi trong các nhà xây dựng (như trên), những thay đổi đã được tuyên truyền để các DB, mà làm tôi ngạc nhiên.

Các vấn đề liên quan