private void RecreateChildItems() { if (this.ListView != null && this.DataSource != null && this.childDataSources.Count > 0) { this.ApplySort(); if (this.ListView.InvokeRequired) { this.ListView.Invoke(new MethodInvoker(this.RecreateChildItems)); return; } this.ListView.BeginUpdate(); try { if (this.ChildrenItems.Count > 0) { if (this.ChildrenItems[0].IsInListView) { this.ListView.BackupItemsStates(); } this.ChildrenItems.Clear(); } foreach (object obj in this.childDataSources) { BindingSource bindingSource = (BindingSource)obj; foreach (object obj2 in bindingSource) { DataTreeListViewItem dataTreeListViewItem = this.ListView.InternalCreateListViewItemForRow(obj2); dataTreeListViewItem.ColumnMapping = (DataTreeListViewColumnMapping)this.dataSource2ColumnMapping[bindingSource]; dataTreeListViewItem.UpdateItem(); if (dataTreeListViewItem.ColumnMapping.ImageIndex < 0) { if (!string.IsNullOrEmpty(this.ListView.ImagePropertyName)) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj2); PropertyDescriptor propertyDescriptor = properties[this.ListView.ImagePropertyName]; if (propertyDescriptor != null) { dataTreeListViewItem.ImageKey = DataListView.GetPropertyValue(obj2, propertyDescriptor).ToString(); } } } else { dataTreeListViewItem.ImageIndex = dataTreeListViewItem.ColumnMapping.ImageIndex; } this.ChildrenItems.Add(dataTreeListViewItem); } } this.ListView.RaiseItemsForRowsCreated(EventArgs.Empty); } finally { this.ListView.EndUpdate(); } this.ListView.TrySelectItemBySpecifiedIdentity(); } }
private void ChildList_ListChanged(object sender, ListChangedEventArgs e) { if (this.ListView == null) { this.ChildrenItems.Clear(); this.IsExpanded = false; this.childDataSources.Clear(); return; } IList list = sender as IList; if (list != null) { switch (e.ListChangedType) { case ListChangedType.Reset: case ListChangedType.ItemDeleted: this.ListView.SelectedIndices.Clear(); this.ListView.RaiseSelectionChanged(); this.RecreateChildItems(); return; case ListChangedType.ItemChanged: { object row = list[e.NewIndex]; DataTreeListViewItem dataTreeListViewItem = this.ListView.GetItemFromRow(row) as DataTreeListViewItem; if (dataTreeListViewItem == null) { return; } if (this.ListView.InvokeRequired) { this.ListView.Invoke(new MethodInvoker(dataTreeListViewItem.UpdateItem)); return; } dataTreeListViewItem.UpdateItem(); return; } } this.RecreateChildItems(); } }