Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

Tree Traversal

  • 5 minutes to read

This topic explains how to traverse vertical and property grid’s rows that are organized into a tree.

#Enumerate All Rows

Follow the steps below to enumerate grid rows and perform a custom operation on each row.

  • Specify the operation performed on rows.

    • Inherit from the RowOperation abstract class. This class specifies an operation performed on rows.
    • Override the RowOperation.Execute method. This method is called each time a row is enumerated and accepts the row as a parameter.
    public class MyOperation : RowOperation {
        public override void Execute(BaseRow row) {
            //Do something.
        }
    }
    
  • Enumerate rows and perform the specified operation on each row.

    vGridControl1.RowsIterator.DoOperation(new MyOperation());
    

#Enumerate Specific Rows

You can also override the operation’s following properties and methods:

#How to: Count Rows

The following example shows how to count rows:

  • Implement a count operation.

    public class CountOperation : RowOperation {
       int totalRows;
       public CountOperation() : base() {
          totalRows = 0;
       }
       public override void Execute(BaseRow row) {
          totalRows++;
       }
       public int TotalRows { get { return totalRows; } }
    }
    
  • Invoke the operation.

    CountOperation operation = new CountOperation();
    vGridControl1.RowsIterator.DoOperation(operation);
    int totalRows = operation.TotalRows;
    

#How to: Obtain Rows at Specific Level

This following example shows how to obtain a collection of rows at the specified level.

public class GetRowsAtLevelOperation : RowOperation {
   int level;
   ArrayList rows;
//The row level
//is initialized in the constructor.
   public GetRowsAtLevelOperation(int level) : base() {
      this.level = level;
      rows = new ArrayList();
   }
//Add a row to the collection
//if it is at the specified level.
   public override void Execute(BaseRow row) {
      if (row.Level == level)
         rows.Add(row);
   }
//Do not enumerate rows
//at higher levels
//to improve performance.
   public override bool NeedsVisitChildren(BaseRow row) {
      if (row.Level == level) 
         return false;
      return true;
   }
   public ArrayList Rows { get { return rows; } }
}

The code below prohibits users to resize rows at the first level.

GetRowsAtLevelOperation operation = new GetRowsAtLevelOperation(1);
vGridControl1.RowsIterator.DoOperation(operation);
foreach (object rowObject in operation.Rows) {
   BaseRow row = rowObject as BaseRow;
   row.Options &= ~VGridOptionsRow.AllowSize;
}

#How to: Collapse Specific Rows

The following example shows how to collapse all rows except for the specified row’s parents.

public class CollapseExceptSpecifiedOperation : RowOperation {
   BaseRow visibleRow;
//Specify the row
//in the constructor.
   public CollapseExceptSpecifiedOperation(BaseRow visibleRow) : base() {
      this.visibleRow = visibleRow;
   }
//Collapse a row if it is not
//the specified row's parent.
   public override void Execute(BaseRow row) {
      if (!row.HasAsChild(visibleRow))
         row.Expanded = false;
   }
//Do not enumerate rows
//that have no child rows
//to improve performance.
   public override bool NeedsFullIteration { get { return false; } }
}

The code below collapses all rows except for the focused row’s parents.

vGridControl1.RowsIterator.DoOperation(new CollapseExceptSpecifiedOperation(vGridControl1.FocusedRow));