// expand row public bool ExpandRow(int row) { // sanity if (row < Rows.Fixed || row >= Rows.Count) { return(false); } // check that the row is not already expanded C1FlexDataTree childGrid = Rows[row].UserData as C1FlexDataTree; if (childGrid != null) { return(false); } // check that we have a data source for this row object dataSource = _colChild != null? _colChild[row] : null; if (!(dataSource is IBindingList)) { return(false); } // add node row (unbound) to display child Rows.InsertNode(row + 1, -1); // make new row non-editable (it's just a placeholder) Rows[row + 1].AllowEditing = false; // create child grid childGrid = new C1FlexDataTree(); childGrid.Visible = false; childGrid.ScrollBars = ScrollBars.Horizontal; // attach child grid to parent, set data source Controls.Add(childGrid); childGrid.DataSource = dataSource; // save references: // child grid Tag property contains a reference to the parent row // parent row UserData contains a reference to the child grid childGrid.Tag = Rows[row]; Rows[row].UserData = childGrid; // make child grid visible, move it into position childGrid.Visible = true; childGrid.UpdatePosition(); childGrid.Focus(); // done return(true); }
// update size/position of all child grids and of this grid within this parent. // this is called when the grid scrolls, when it's size changes, and when // rows or columns are added, removed, or resized. private void UpdateChildren() { // update position of all children for (int row = 0; row < Rows.Count; row++) { C1FlexDataTree child = Rows[row].UserData as C1FlexDataTree; if (child != null) { child.UpdatePosition(); } } // and update position of this grid within its parent UpdatePosition(); }