GridView Grouping By Data Instead Of Column

7 posts, 0 answers
  1. Brandon
    Brandon avatar
    21 posts
    Member since:
    Jan 2019

    Posted 30 Jan 2019 Link to this post

    Let's say we have 5 items and we want to group them by either 'Outdoor' or 'Indoor' respectively.

    1) Lawn Mower - Outdoor

    2) Cabinet - Indoor

    3) Fence - Outdoor

    4) Table - Indoor

    5) Couch - Indoor

     

    There isn't a column dedicated to whether these are Indoor or Outdoor items, but I still want to group them based on that "Indoor/Outdoor" data that I have for them.

    I can do this with a ListView fairly easily by just dynamically creating a group and adding the items I want to this group.  What I need to know is how I can create a group in a GridView based off of data not present in the columns.

  2. Dimitar
    Admin
    Dimitar avatar
    2892 posts

    Posted 31 Jan 2019 Link to this post

    Hello Brandon,

    You can use custom groping to create such custom groups. You will still need to add a valid sort descriptor and this is why you can use the ShowGroupedColumns property to show the column that is used for the descriptor. I have attached a small project that demonstrates how you can implement this. 

    I hope this helps. Should you have any other questions do not hesitate to ask.
     
    Regards,
    Dimitar
    Progress Telerik
    Get quickly onboard and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  3. Brandon
    Brandon avatar
    21 posts
    Member since:
    Jan 2019

    Posted 31 Jan 2019 Link to this post

    That works.  Thank you. 

    Last question I think.  How do I dictate what order the groups are in?  I don't want them in alphabetical order necessarily.  I want to position specifically two groups at the top, and the order doesn't matter for the rest.

     

    I also want to Color the group header text as well, but I imagine I can find an example of coloring them elsewhere.

  4. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3759 posts

    Posted 01 Feb 2019 Link to this post

    Hello, Brandon,       

    By default, when you perform grouping, RadGridView sorts the created group rows alphabetically. You can change this sort order by using a group comparer. It is necessary to create a class that implements the IComparer interface where you should return an integer number in the implemented Compare method. A sample approach is demonstrated in the following help article: https://docs.telerik.com/devtools/winforms/controls/gridview/grouping/sorting-group-rows

    As to the style of the group rows, it is suitable to use the ViewCellFormatting event. You can find below a sample code snippet: 
    private void radGridView1_ViewCellFormatting(object sender, CellFormattingEventArgs e)
    {
        GridGroupContentCellElement groupCell = e.CellElement as GridGroupContentCellElement;
        if (groupCell != null)
        {
            e.CellElement.DrawFill = true;
            e.CellElement.BackColor = Color.Yellow;
            e.CellElement.GradientStyle = Telerik.WinControls.GradientStyles.Solid;
        }
        else
        {
            e.CellElement.ResetValue(LightVisualElement.DrawFillProperty, ValueResetFlags.Local);
            e.CellElement.ResetValue(LightVisualElement.BackColorProperty, ValueResetFlags.Local);
            e.CellElement.ResetValue(LightVisualElement.GradientStyleProperty, ValueResetFlags.Local);
        }
    }


    I hope this information helps. If you need any further assistance please don't hesitate to contact me. 

    Regards,
    Dess | Tech Support Engineer, Sr.
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  5. Brandon
    Brandon avatar
    21 posts
    Member since:
    Jan 2019

    Posted 01 Feb 2019 in reply to Dess | Tech Support Engineer, Sr. Link to this post

    Thank you for your response.  Are you able to give an example of how to order the grouping based off of what the string value is?  I can't seem to get a real understanding of how the comparison works.  I just want to say:

     

    Group Name = Position 1 (At the top)

    Group Description = Position 2 (Directly underneath the top)

    Any other group = Alphabetically, or in any order, really.  Doesn't matter. 3, 4, 5, 6, 7, 8

  6. Brandon
    Brandon avatar
    21 posts
    Member since:
    Jan 2019

    Posted 01 Feb 2019 in reply to Dess | Tech Support Engineer, Sr. Link to this post

    Here is what I have tried.  You'll see that "Pump" and "Pump Down" are manually added to the list in position 0 and 1, respectively.  The rest are just thrown in.  I can't see what I'm doing wrong here.

     

    Public Class GroupComparer
        Implements IComparer(Of Group(Of GridViewRowInfo))
        Public Function [Compare](x As Group(Of GridViewRowInfo), y As Group(Of GridViewRowInfo)) As Integer _
        Implements IComparer(Of Group(Of GridViewRowInfo)).[Compare]
     
            Dim XVal As Integer = 0
            Dim YVal As Integer = 0
     
            Dim Items As New List(Of String)
            Items.Add("Pump")
            Items.Add("Pump Down")
     
            Dim data As DataSet = Grid.lvEquip.Tag
            If RecHasData(data) Then
                For i As Integer = 0 To data.Tables(0).Rows.Count - 1
                    If Data.Tables(0).Rows(i).Item(1) <> "Pump" And Data.Tables(0).Rows(i).Item(1) <> "Pump Down" Then
                        Items.Add(Data.Tables(0).Rows(i).Item(1))
                    End If
                Next
            End If
     
            For I As Integer = 0 To Items.Count - 1
                If Items(I) = x.Key Then XVal = I
                If Items(I) = y.Key Then YVal = I
            Next
     
            Dim Result As Integer = XVal.CompareTo(YVal)
     
            Dim xGroup As DataGroup = TryCast(x, DataGroup)
            If xGroup IsNot Nothing Then
                If xGroup.GroupDescriptor.GroupNames.First().Direction = ListSortDirection.Descending Then
                    Result *= -1
                End If
            End If
            Return Result
     
        End Function
    End Class

  7. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3759 posts

    Posted 05 Feb 2019 Link to this post

    Hello, Brandon,        
     
    Your question has already been answered in the support thread you have opened on the same topic. Please, see our answer there for more information. Feel free to continue the communication regarding the groups order in the relevant thread. Thus, it would be easier for you to track the different case.

    However, I am posting the answer here as well in order the community to benefit from it. Note that if you use custom grouping, you can define the GroupKey in the CustomGrouping event and add a number indicating the desired order. Then, in the GroupSummaryEvaluate event you can trim the number and display the text only. You can find below a sample code demonstrating how to force USA to be displayed as first group when grouping by ShipCountry:

    Private Sub RadForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.OrdersTableAdapter.Fill(Me.NwindDataSet.Orders)
        Me.RadGridView1.BestFitColumns(Telerik.WinControls.UI.BestFitColumnMode.AllCells)
      
        Me.RadGridView1.EnableCustomGrouping = True
        Dim descriptor As New GroupDescriptor("ShipCountry")
        Me.RadGridView1.GroupDescriptors.Add(descriptor)
    End Sub
      
    Private Sub RadGridView1_CustomGrouping(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.GridViewCustomGroupingEventArgs) Handles RadGridView1.CustomGrouping
        Dim country As String = e.Row.Cells("ShipCountry").Value.ToString()
        Select Case country
            Case "USA"
                e.GroupKey = "1. USA"
                Exit Select
            Case "Japan"
                e.GroupKey = "2. Belgium"
                Exit Select
            Case "Germany"
                e.GroupKey = "3. Germany"
                Exit Select
            Case Else
                e.GroupKey = "Other country"
                Exit Select
        End Select
    End Sub


    I hope this information helps. If you need any further assistance please don't hesitate to contact me. 

    Regards,
    Dess | Tech Support Engineer, Sr.
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top