Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 198 additions & 0 deletions knowledge-base/grid-custom-filtering-self-referencing-hierarchy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
---
title: Filtering Child Rows in Self-referencing Hierarchy While Keeping Parent Row Visible
description: Learn how to filter rows in a self-referencing hierarchical RadGridView while keeping parent rows visible when child rows match the filter condition.
type: how-to
page_title: Filtering Self-referencing Hierarchical RadGridView with Parent Row Visibility
meta_title: Filtering Self-referencing Hierarchical RadGridView with Parent Row Visibility
slug: grid-custom-filtering-self-referencing-hierarchy
tags: gridview, ui-for-winforms, filtering, custom-filtering, self-referencing-hierarchy
res_type: kb
ticketid: 1700615
---

## Environment

|Product Version|Product|Author|
|----|----|----|
|2025.3.812|RadGridView for WinForms|[Nadya Karaivanova](https://www.telerik.com/blogs/author/nadya-karaivanova)|

## Description

This knowledge base article shows how to filter rows in a self-referencing hierarchical RadGridView using custom filtering while keeping parent rows visible as long as any child rows match the filter condition.

## Solution

To achieve hierarchical filtering that retains parent rows when child rows match, use the **CustomFiltering** event and implement recursive filtering logic for the child rows. Follow these steps:

1. Subscribe to the **CustomFiltering** event of the RadGridView.
2. Implement a recursive method to evaluate each row and its child rows against the filter condition.
3. Set the filtering logic so that parent rows remain visible if any matching child rows are found.

### Example: Filtering Child Rows in Self-referencing Hierarchy While Keeping Parent Row Visible

````C#

public Form1()
{
InitializeComponent();

this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.DataSource = CreateDataSource();

this.radGridView1.Relations.AddSelfReference(this.radGridView1.MasterTemplate, "ID", "ParentID");

this.radGridView1.Columns["ID"].IsVisible = false;
this.radGridView1.Columns["ParentID"].IsVisible = false;
this.radGridView1.Columns["Size"].FormatString = "{0} MB";

this.radGridView1.EnableFiltering = true;
this.radGridView1.MasterTemplate.EnableFiltering = true;
this.radGridView1.EnableCustomFiltering = true;
this.radGridView1.CustomFiltering += new GridViewCustomFilteringEventHandler(radGridView1_CustomFiltering);
this.radTextBox1.TextChanged += RadTextBox1_TextChanged;
}

private void RadTextBox1_TextChanged(object sender, EventArgs e)
{
this.radGridView1.MasterTemplate.Refresh();
}

private void radGridView1_CustomFiltering(object sender, GridViewCustomFilteringEventArgs e)
{
string searchString = this.radTextBox1.Text;
if (string.IsNullOrEmpty(searchString))
{
e.Visible = true;
e.Row.IsVisible = true;
return;
}

string columnName_cellValue = e.Row.Cells["Name"].Value.ToString();
bool parentContains = false;
foreach (var childRow in e.Row.ChildRows)
{

string text = childRow.Cells["Name"].Value?.ToString() ?? "";
if (childRow.ChildRows.Count> 0)
{
foreach (var innerRow in childRow.ChildRows)
{
text = innerRow.Cells["Name"].Value?.ToString() ?? "";
if (text.Contains( searchString))
{
e.Visible = true;
e.Row.IsVisible = true;
parentContains = true;
}
else
{
e.Visible = false;
e.Row.IsVisible = false;
}
}
}
else
{
if (text.Contains(searchString))
{
e.Visible = true;
e.Row.IsVisible = true;
parentContains = true;
}
else
{
e.Visible = false;
e.Row.IsVisible = false;
}
}

}

if (!parentContains)
{
if (columnName_cellValue.Contains(searchString))
{

e.Visible = true;
e.Row.IsVisible = true;
}
else
{
e.Visible = false;
e.Row.IsVisible = false;
}
}

e.Handled = true;
}

private static DataTable CreateDataSource()
{
DataTable dataSource = new DataTable("fileSystem");
dataSource.Columns.Add("ID", typeof(int));
dataSource.Columns.Add("ParentID", typeof(int));
dataSource.Columns.Add("Name", typeof(string));
dataSource.Columns.Add("Date", typeof(DateTime));
dataSource.Columns.Add("Type", typeof(string));
dataSource.Columns.Add("Size", typeof(int));

dataSource.Rows.Add(1, null, "Program Files", DateTime.Now.AddDays(-100), "Folder", 5120);
dataSource.Rows.Add(2, 1, "Visual Studio 2010", DateTime.Now.AddDays(-100), "Folder", 3220);
dataSource.Rows.Add(3, 2, "bin", DateTime.Now.AddDays(-100), "Folder", 3220);
dataSource.Rows.Add(4, 2, "READEME.txt", DateTime.Now.AddDays(-100), "Text Document", 3);

dataSource.Rows.Add(5, 1, "Telerik RadControls", DateTime.Now.AddDays(-10), "Folder", 3120);
dataSource.Rows.Add(6, 5, "Telerik UI for Winforms", DateTime.Now.AddDays(-10), "Folder", 101);
dataSource.Rows.Add(7, 5, "Telerik UI for Silverlight", DateTime.Now.AddDays(-10), "Folder", 123);
dataSource.Rows.Add(8, 5, "Telerik UI for WPF", DateTime.Now.AddDays(-10), "Folder", 221);
dataSource.Rows.Add(9, 5, "Telerik UI for ASP.NET AJAX", DateTime.Now.AddDays(-10), "Folder", 121);

dataSource.Rows.Add(10, 1, "Microsoft Office 2010", DateTime.Now.AddDays(-120), "Folder", 1230);
dataSource.Rows.Add(11, 10, "Microsoft Word 2010", DateTime.Now.AddDays(-120), "Folder", 1230);
dataSource.Rows.Add(12, 10, "Microsoft Excel 2010", DateTime.Now.AddDays(-120), "Folder", 1230);
dataSource.Rows.Add(13, 10, "Microsoft Powerpoint 2010", DateTime.Now.AddDays(-120), "Folder", 1230);

dataSource.Rows.Add(14, 1, "Debug Diagnostic Tools v1.0", DateTime.Now.AddDays(-400), "Folder", 2120);
dataSource.Rows.Add(15, 1, "Designer's 3D Tools", DateTime.Now.AddDays(-500), "Folder", 1120);
dataSource.Rows.Add(16, 1, "Communication", DateTime.Now.AddDays(-700), "Folder", 120);

dataSource.Rows.Add(17, null, "My Documents", DateTime.Now.AddDays(-200), "Folder", 1024);
dataSource.Rows.Add(18, 17, "Salaries.xlsx", DateTime.Now.AddDays(-200), "Excel File", 1);
dataSource.Rows.Add(19, 18, "RecessionAnalysis.xlsx", DateTime.Now.AddDays(-200), "Excel File", 1);

dataSource.Rows.Add(20, null, "Windows", DateTime.Now.AddDays(-100), "Folder", 10240);

dataSource.Rows.Add(21, 20, "System32", DateTime.Now.AddDays(-220), "Folder", 510);
dataSource.Rows.Add(22, 20, "assembly", DateTime.Now.AddDays(-20), "Folder", 240);

dataSource.Rows.Add(23, 22, "System.Data.dll", DateTime.Now.AddDays(-20), "Assembly File", 4);
dataSource.Rows.Add(24, 22, "System.Core.dll", DateTime.Now.AddDays(-20), "Assembly File", 2);
dataSource.Rows.Add(25, 22, "System.Drawings.dll", DateTime.Now.AddDays(-20), "Assembly File", 3);
dataSource.Rows.Add(26, 22, "Telerik.WinControls.UI.dll", DateTime.Now.AddDays(-20), "Assembly File", 5);

dataSource.Rows.Add(27, null, "Users", DateTime.Now.AddDays(-100), "Folder", 5512);
dataSource.Rows.Add(28, 27, "Administrator", DateTime.Now.AddDays(-100), "Folder", 1512);
dataSource.Rows.Add(29, 27, "Guest", DateTime.Now.AddDays(-100), "Folder", 2512);
dataSource.Rows.Add(30, 27, "User1", DateTime.Now.AddDays(-100), "Folder", 3512);

dataSource.Rows.Add(31, null, "Share", DateTime.Now.AddDays(-50), "Folder", 15360);
dataSource.Rows.Add(32, 31, "Photos", DateTime.Now.AddDays(-50), "Folder", 360);
dataSource.Rows.Add(33, 32, "Flowers.JPG", DateTime.Now.AddDays(-50), "JPEG File", 1);
dataSource.Rows.Add(34, 32, "Panda.GIF", DateTime.Now.AddDays(-50), "GIF File", 3);
dataSource.Rows.Add(35, 32, "Landscape.png", DateTime.Now.AddDays(-50), "PNG File", 4);

dataSource.Rows.Add(36, null, "Music", DateTime.Now.AddDays(-2), "Folder", 0);
dataSource.Rows.Add(37, 36, "Mozart", DateTime.Now.AddDays(-3), "Folder", 0);
dataSource.Rows.Add(38, 36, "Pavarotti", DateTime.Now.AddDays(-40), "Folder", 0);
dataSource.Rows.Add(39, 36, "AC/DC", DateTime.Now.AddDays(-50), "Folder", 0);
dataSource.Rows.Add(40, 36, "Queen", DateTime.Now.AddDays(-8), "Folder", 0);

dataSource.Rows.Add(41, null, "Boot.ini", DateTime.Now.AddDays(-10), "INI File", 0);

return dataSource;
}

````

## See Also
* [Custom Filtering](https://docs.telerik.com/devtools/winforms/controls/gridview/features/filtering/custom-filtering)