private void FillStructure() { _InFillStructure = true; if (!(_DataSource == null || string.IsNullOrEmpty(_ValueMember) || string.IsNullOrEmpty(_DisplayMember) || string.IsNullOrEmpty(_ParentLinkMember) || string.IsNullOrEmpty(_IsSelectableMember))) { this.BeginUpdate(); this.Nodes.Clear(); ValueIndex.Clear(); CheckedNodes = new List <gTreeNode>(); // TODO: Implement Sorting //_DataSource.DefaultView.Sort = _SortByMember; // ================================================ foreach (var DataItem in _DataSource) { Object parentLinkValue = DataItem.GetType().GetProperty(_ParentLinkMember).GetValue(DataItem, null); if (parentLinkValue == null || Convert.ToInt32(parentLinkValue) == 0) { Font nodeFont = default(System.Drawing.Font); if (!(bool)DataItem.GetType().GetProperty(_IsSelectableMember).GetValue(DataItem, null)) { nodeFont = new System.Drawing.Font(this.Font, FontStyle.Italic); } else { nodeFont = new System.Drawing.Font(this.Font, FontStyle.Regular); } gTreeNode newNode = new gTreeNode(DataItem.GetType().GetProperty(_DisplayMember).GetValue(DataItem, null) as string, DataItem.GetType().GetProperty(_ValueMember).GetValue(DataItem, null), DataItem, (bool)DataItem.GetType().GetProperty(_IsSelectableMember).GetValue(DataItem, null), nodeFont); this.Nodes.Add(newNode); ValueIndex.Add(newNode.Key, newNode.FullPath); } } bool NodesAdded = false; do { NodesAdded = false; foreach (var DataItem in _DataSource) { Object parentLinkValue = DataItem.GetType().GetProperty(_ParentLinkMember).GetValue(DataItem, null); if (parentLinkValue != null && ValueIndex.ContainsKey(parentLinkValue)) { Font nodeFont = default(System.Drawing.Font); if (!(bool)DataItem.GetType().GetProperty(_IsSelectableMember).GetValue(DataItem, null)) { nodeFont = new System.Drawing.Font(this.Font, FontStyle.Italic); } else { nodeFont = new System.Drawing.Font(this.Font, FontStyle.Regular); } gTreeNode newNode = new gTreeNode(DataItem.GetType().GetProperty(_DisplayMember).GetValue(DataItem, null) as string, DataItem.GetType().GetProperty(_ValueMember).GetValue(DataItem, null), DataItem, (bool)DataItem.GetType().GetProperty(_IsSelectableMember).GetValue(DataItem, null), nodeFont); if (!ValueIndex.ContainsKey(newNode.Key)) { FindGTreeNode(ValueIndex[DataItem.GetType().GetProperty(_ParentLinkMember).GetValue(DataItem, null)]).Nodes.Add(newNode); ValueIndex.Add(newNode.Key, newNode.FullPath); NodesAdded = true; } } } } while (NodesAdded); this.EndUpdate(); } else { this.Nodes.Clear(); } this.SelectedNode = null; _InFillStructure = false; }