Example #1
0
 public static void BindDataSource(this BetterListViewItem item, TaskListViewSourceItem source,
                                   BetterListView owner)
 {
     item.Tag = source;
     Refresh(item, owner);
     item.Group = source.Group;
 }
Example #2
0
        private static void Refresh(BetterListViewItem item, BetterListView owner)
        {
            TaskListViewSourceItem source = item.DataSource();
            object dataObject             = source.DataObject;

            IEnumerable <BetterListViewColumnHeader> columns = owner.Columns;
            Dictionary <string, PropertyInfo>        props   = GetDataObjectProps(dataObject);

            int colCount = columns.Count(), subCount = item.SubItems.Count, subDiff = colCount - subCount;

            if (subDiff > 0)
            {
                List <BetterListViewSubItem> subItems = new List <BetterListViewSubItem>(subDiff);
                for (int i = 0; i < subDiff; i++)
                {
                    subItems.Add(new BetterListViewSubItem());
                }
                item.SubItems.AddRange(subItems);
            }

            int idx = -1;

            foreach (BetterListViewColumnHeader column in columns)
            {
                idx++;
                if (column.DisplayMember == string.Empty ||
                    !props.TryGetValue(column.DisplayMember, out var propertyInfo))
                {
                    continue;
                }

                BetterListViewSubItem subItem = item.SubItems[idx];
                object displayValue           = propertyInfo.GetValue(dataObject);
                string displayString          = displayValue?.ToString();
                if (subItem.Text != displayString)
                {
                    subItem.Text = displayString;
                }

                if (column.ValueMember != string.Empty &&
                    props.TryGetValue(column.ValueMember, out propertyInfo))
                {
                    subItem.Key = (IComparable)propertyInfo.GetValue(dataObject);
                }
                else
                {
                    subItem.Key = (IComparable)displayValue;
                }
            }
        }
Example #3
0
        public void RebindItems()
        {
            BeginUpdate();

            HashSet <object> setItems = _sourceItems != null
                ? new HashSet <object>(_sourceItems)
                : new HashSet <object>();

            BetterListViewItem[] toDelete = Items.
                                            Where(i => !setItems.Contains(i.DataObject())).
                                            ToArray();
            foreach (BetterListViewItem item in toDelete)
            {
                Items.Remove(item);
            }

            BetterListViewItem[] toUpdate = Items.
                                            Where(i => setItems.Contains(i.DataObject())).
                                            ToArray();
            foreach (BetterListViewItem item in toUpdate)
            {
                item.Refresh();
            }

            IEnumerable <object>      toAdd      = setItems.Except(Items.Select(i => i.DataObject()));
            List <BetterListViewItem> itemsToAdd = new List <BetterListViewItem>();

            foreach (object dataObject in toAdd)
            {
                BetterListViewItem     item   = new BetterListViewItem();
                TaskListViewSourceItem source = new TaskListViewSourceItem(dataObject, _funcItemFindGroup);
                item.BindDataSource(source, this);
                itemsToAdd.Add(item);
            }
            Items.AddRange(itemsToAdd);

            EndUpdate();
        }