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.
6 Answers, 1 is accepted
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.
Dimitar
Progress Telerik
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.
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
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
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 FunctionEnd ClassYour 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 SelectEnd SubI 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

