Gets or sets a value indicating whether this Row is filtered.

Namespace: Dapfor.Wpf.Controls
Assembly: Dapfor.Wpf (in Dapfor.Wpf.dll) Version: 4.1.0.26317 (4.1.0.26317)

Syntax

C#
public bool Filtered { get; set; }
Visual Basic
Public Property Filtered As Boolean
	Get
	Set
Visual C++
public:
property bool Filtered {
	bool get ();
	void set (bool value);
}
F#
member Filtered : bool with get, set

Property Value

Type: Boolean
true if filtered; otherwise, false.

Remarks

Simply put, data filtration is managing visibility of rows in the grid. Row invisibility in the grid means that the row is still in the grid, but it is invisible together with its children. It's important to say that this row can be accessed only via GridControl.Nodes / Row.Children collection properties. In the GridControl.Rows property invisible rows are absent, as it shows only visible rows. Filtration is particularly important when data is grouped. If there are no visible rows, the whole group becomes invisible (but is not removed!). If a filtered row should be made visible again, it takes certain position according to the sorting rules if any.

Wpf GridControl presents two ways of data filtration:

  • Setting boolean in the Filtered property
  • Implementing the IFilter interface and setting it with the GridControl.Filter property

The first way is the easiest to use, however, we recommend you to favor the second one that provides definite advantages.

The IFilter interface has only one property IFilter.IsFiltered. This method is invoked when data is inserted into the data grid. It is also invoked every time Row.Update and GridControl.FilterRefresh methods are called. Therefore, grid rows always meed the filtration criteria. However, when IFilter interface is not implemented, the invocation of Row.Update does not result in data filtration and newly added data is always visible in the grid until the Row.Filtered call. Besides, when filtering conditions are changed, invocation of GridControl.FilterRefresh does not make the row visible the programmer should iterate through every row in the data grid via GridControl.Nodes and Row.Children collections to verify new conditions. There is an important thing to add regarding multi-threaded applications. Invocation of IFilter.IsFiltered method occurs regularly in the GUI thread, and it should be considered during development of multi-threaded applications. Please note that Row.Update method is thread-safe and can be invoked in any thread.

Data filtration implemented via IFilter interface of non-event-driven model consists in the Row.Update method call:

 Copy imageCopy
public class CustomFilter : IFilter
{
    public bool IsFiltered(Row row)
    {
        //There are three ways to get cell's value: 
        //1. Via Cell.Value property: double value = (double)row["Price"].Value
        //2. Via IDataAccessor and IDataField: double value = (double) row.DataAccessor["Price"].Value
        //3. Directly from the data object: double value = (double)((IList)row.DataObject)[2];

        if ((double)row["Price"].Value < 30000)
        {
            //Filter the row
            return true;
        }

        //The row is not filtered
        return false;
    }
}

public void FilterUsing(GridControl grid)
{
    //Initialize the grid
    grid.Headers.Add(new Header());
    grid.Headers[0].Add(new Column("Name"));
    grid.Headers[0].Add(new Column("Color"));
    grid.Headers[0].Add(new Column("Price"));

    //Set filter
    grid.Filter = new CustomFilter();

    //Populate the grid
    Row row1 = grid.Rows.Add(new object[] { "Mercedes", Colors.Black, 25000d});
    Debug.Assert(row1.Visible);

    Row row2 = grid.Rows.Add(new object[] { "BMW", Colors.White, 35000d });
    Debug.Assert(row2.Visible);

    //Set a new price for "Mercedes"
    row1["Price"].Value = 32000d;
    Debug.Assert(row1.Visible);
}

See Also