Home > Back-end >  VB.net - Sorting only one column in datagridview
VB.net - Sorting only one column in datagridview

Time:08-12

I'm populating a DataGridView from an Excel file, and trying to sort only ONE column of my choice, other columns should remain as-is. How can it be achieved? Should the component be changed to something else, in case it is not possible in DataGridView?

CodePudding user response:

I Created a List of my custom class, and this class will handle the sorting based on my preference (Randomization in this case)

Public Class Mylist
    Implements IComparable(Of Mylist)

    Private p_name As String
    Private r_id As Integer

    Public Property Pname() As String    'This will hold the contents of DGV that I want sorted
        Get
            Return p_name
        End Get
        Set(value As String)
            p_name = value
        End Set
    End Property

    Public Property Rid() As Integer    'This will be the basis of sort
        Get
            Return r_id
        End Get
        Set(value As Integer)
            r_id = value
        End Set
    End Property

    Private Function IComparable_CompareTo(other As Mylist) As Integer Implements IComparable(Of Mylist).CompareTo
        If other Is Nothing Then
            Return 1
        Else
            Return Me.Rid.CompareTo(other.Rid)
        End If
    End Function
End Class

Then a Button which will sort the contents:

            Dim selcol = xlView.CurrentCell.ColumnIndex
            Dim rand = New Random()
            Dim x As Integer = 0
            Dim plist As New List(Of Mylist)

            Do While x < xlView.Rows.Count
                plist.Add(New Mylist() With {
                .Pname = xlView.Rows(x).Cells(selcol).Value,
                .Rid = rand.Next()
                })
                x  = 1
            Loop
            plist.Sort()
            x = 0
            Do While x < xlView.Rows.Count
                xlView.Rows(x).Cells(selcol).Value = plist.ElementAt(x).Pname
                x  = 1
            Loop
            xlView.Update()
            plist.Clear()

I'm open to any changes to code, as long as it achieves the same result.

CodePudding user response:

Here is the simpler version. Pass the column index will do like Call SortSingleColum(0)

 Private Sub SortSingleColumn(x As Integer)

        Dim DataCollection As New List(Of String)

        For i = 0 To dgvImport.RowCount - 2
            DataCollection.Add(dgvImport.Item(x, i).Value)
        Next

        Dim t As Integer = 0
        For Each item As String In DataCollection.OrderBy(Function(z) z.ToString)
            dgvImport.Item(x, t).Value = item
            t = t   1
        Next



    End Sub
  • Related