2010-11-09 44 views
6

Visual Studio 2010 VB.NETDataGridView Sắp xếp không hoạt động

Tôi có một DataGridView.DataSource được đặt thành Bộ sưu tập các đối tượng tùy chỉnh. Các cột sử dụng các thuộc tính chỉ đọc từ đối tượng tùy chỉnh để hiển thị, hộp thoại này chỉ để hiển thị. Các thuộc tính đều trả về các đối tượng String. Tôi đặt tất cả các cột nhưng 2 trong số chúng để sắp xếp tự động (những cái không được đặt là một nút hoặc một hộp kiểm). Tuy nhiên, nó không phân loại. Tôi đã googled xung quanh và hầu hết mọi người sử dụng sql hoặc nguồn ràng buộc nhưng tôi đang sử dụng một bộ sưu tập vb tầm thường. Một số người nói tôi nên thực hiện IComparable nhưng không phải là String đã IComparable?

Mọi trợ giúp sẽ được đánh giá cao?

Thanx

Bodger

mỗi một yêu cầu đây là một số đoạn mã.

Phương pháp này xác định các cột chi tiết từ các cột mà tôi đã thiết kế trong thiết kế .

Tên cột được gọi là pSelected hoặc pCustomer và tương ứng với thuộc tính bằng cùng tên mà định nghĩa cột liên quan đến.


Protected Sub UpdateDGVUS() 
     If Not USColumnsInitted Then 
      USColumnsInitted = True 

      dgvUS.AutoGenerateColumns = False 
      dgvUS.Columns.Clear() 

      Dim iIdx As Integer 

      iIdx = 0 

      dgvUS.Columns.Insert(iIdx, Me.pSelected) 
      dgvUS.Columns("pSelected").DisplayIndex = iIdx 
      dgvUS.Columns("pSelected").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCustomer) 
      dgvUS.Columns("pCustomer").DisplayIndex = iIdx 
      dgvUS.Columns("pCustomer").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDetails) 
      dgvUS.Columns("pDetails").DisplayIndex = iIdx 
      dgvUS.Columns("pDetails").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pSelectCustomerInvoice) 
      dgvUS.Columns("pSelectCustomerInvoice").DisplayIndex = iIdx 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDate) 
      dgvUS.Columns("pDate").DisplayIndex = iIdx 
      dgvUS.Columns("pDate").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pAmount) 
      dgvUS.Columns("pAmount").DisplayIndex = iIdx 
      dgvUS.Columns("pAmount").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight 
      dgvUS.Columns("pAmount").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pName) 
      dgvUS.Columns("pName").DisplayIndex = iIdx 
      dgvUS.Columns("pName").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pPayment) 
      dgvUS.Columns("pPayment").DisplayIndex = iIdx 
      dgvUS.Columns("pPayment").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCompany) 
      dgvUS.Columns("pCompany").DisplayIndex = iIdx 
      dgvUS.Columns("pCompany").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pType) 
      dgvUS.Columns("pType").DisplayIndex = iIdx 
      dgvUS.Columns("pType").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDescription) 
      dgvUS.Columns("pDescription").DisplayIndex = iIdx 
      dgvUS.Columns("pDescription").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dataUpdatedUS() 
     End If 
    End Sub 

Đây là một đoạn của đối tượng tùy chỉnh mà là trong bộ sưu tập


Public Class ItemXact01 
    Public Property FirstName As String 
    Public Property LastName As String 
    Public Property Company As String 
    Public Property Type As String 
    Public Property Description As String 
    Public Property RefNumber As String 
    Public Property DownloadID As String 
    Public Property Selected As Boolean 
    Public Property RequestID As Integer 

    ... 

    Public ReadOnly Property pCompany As String 
     Get 
      pCompany = Company 
     End Get 
    End Property 

    Public ReadOnly Property pType As String 
     Get 
      pType = Type 
     End Get 
    End Property 

    Public ReadOnly Property pDescription As String 
     Get 
      pDescription = Description 
     End Get 
    End Property 

    Public ReadOnly Property pSelected As Boolean 
     Get 
      pSelected = Selected 
     End Get 
    End Property 

...

Dữ liệu được đặt vào đúng vị trí với mã này


    Private Sub dataUpdateDGV(ByRef dgv As DataGridView, ByRef myCollection As Collection) 
     myMain.Log("dataUpdatedDGV: 001 :" & dgv.RowCount & ":" & myCollection.Count & ":") 

' for some reason the not equal to does not show in the next line 

     If dgv.RowCount myCollection.Count Then 
      myMain.Log("dataUpdatedDGV: 002") 

      dgv.DataSource = Nothing 
      If myCollection.Count > 0 Then 
       myMain.Log("dataUpdatedDGV: 003") 

       dgv.DataSource = myCollection 
      End If 
     End If 

     myMain.Log("dataUpdatedDGV: 004") 

     dgv.Invalidate() 
     dgv.Update() 
     dgv.Refresh() 

     myMain.Log("dataUpdatedDGV: OUT") 
    End Sub 
+0

Bạn có thể đăng mã mà bạn sử dụng để xác định 'DataGridView' hay không. – ChrisF

+0

Tôi sử dụng trình thiết kế cho hộp thoại. Nó có một bộ điều khiển tab với một số các tab chứa datagridviews. Ở đây tôi có thể đặt một số đoạn tôi giả sử: – Bodger

Trả lời

1

Nếu tôi nhớ chính xác, bạn có thể đặt nguồn ràng buộc giữa bộ sưu tập của bạn và chế độ xem dữ liệu và nguồn ràng buộc sẽ cung cấp một loạt chức năng. Tôi nghĩ nó cũng cho phép bạn sắp xếp. Đây là tất cả chỉ cần ra khỏi đầu của tôi như tôi không thể kiểm tra nó ngay bây giờ.

+1

Tôi tìm thấy một lớp SortableBindingList trong ether và nó hoạt động. – Bodger

0

Nếu điều này hoàn toàn dành cho mục đích chỉ đọc và bạn không cần người dùng có thể phân loại động, thì tôi khuyên bạn nên rt bộ sưu tập trong mã của bạn trước khi thiết lập nguồn dữ liệu.

Ví dụ:

myDataGridView.DataSource = null; 
myCollection.Sort(); 
myDataGridView.DataSource = myCollection; 

Điều đó có thể giúp bạn có được mặc định sắp xếp. Nếu sau đó bạn cần triển khai phân loại động, Tôi khuyên bạn nên sử dụng lại phương thức myCollection.Sort() của mình, chẳng hạn như tạo bảng điều khiển mới được gắn trên chế độ xem dữ liệu với các nút để sắp xếp từng cột. Liên kết sự kiện nhấp chuột trong các nút đó với phương thức .Sort() của bạn và thêm tham số vào phương thức để biết cột nào sắp xếp.

Đó là một chút công việc, nhưng tôi nghĩ bạn sẽ có nhiều may mắn hơn khi triển khai một kịch bản sắp xếp tùy chỉnh hơn là đưa các thành phần Microsoft của bạn uốn cong theo ý muốn của bạn.

+0

Cảm ơn bạn đã phản hồi, nhưng tôi không cần nó được sắp xếp tùy chỉnh, tôi chỉ muốn nó được sắp xếp theo cột được chọn. Không có gì xảy ra khi tôi nhấp vào tiêu đề cột. – Bodger

4

Điều quan trọng ở đây là DataGridView không chịu trách nhiệm phân loại; nguồn dữ liệu cơ bản (tức là .DataSource của DataSource) là.

bạn có thể triển khai một cái gì đó như SortableBindingList này (dành cho Windows.Biểu mẫu) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

+0

Bạn nói đúng, nhưng phải nói đó là một thiết kế tai hại. Cách sắp xếp lưới được phân loại rõ ràng là vấn đề trình bày và cần được kiểm soát bởi bộ điều khiển. Và thẳng thắn rất khó để thấy lý do tại sao nó sẽ khó làm, miễn là các giá trị bị ràng buộc trong một cột là cùng loại (thường là trường hợp) và triển khai IComparable (như tất cả các kiểu dữ liệu cơ bản). Một tác dụng phụ của phương pháp winforms này là bạn không thể liên kết danh sách với nhiều chế độ xem, bởi vì * datasource * theo dõi thứ tự và mục đã chọn, v.v. Hình ảnh một chế độ xem với nhiều số lượng và danh sách thả xuống các đơn vị tiền tệ được liên kết với mỗi số tiền. –

+0

Việc sắp xếp được áp dụng cho một lưới cụ thể là trong DataGridView. Phương thức ** để phân loại thực tế nằm trong DataSource. –

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