将项目插入SortableBindingList

时间:2019-04-04 17:21:36

标签: c# datagridview bindinglist

我有一个WinForms DataGridView绑定到SortableBindlingList(非常类似于this example)。

默认情况下,添加项目时,它们将出现在DataGridView的底部。在示例中,我遇到了人们希望新项目以正确的排序位置显示的情况,在添加项目后,他们将其称为DataGridView.Sort。

如果您有大量的数据集合并且经常添加项目,这对我来说似乎相当昂贵。在SortableBindingList中添加以下方法似乎是个好主意吗?关于如何使其更快或更强大的任何想法?

public int InsertSorted(T newItem)
{
    PropertyDescriptor prop = sortPropertyValue;
    ListSortDirection direction = sortDirectionValue;
    Type interfaceType = prop.PropertyType.GetInterface("IComparable");

    if (interfaceType == null && prop.PropertyType.IsValueType)
    {
        Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);

        if (underlyingType != null)
        {
            interfaceType = underlyingType.GetInterface("IComparable");
        }
    }

    if (interfaceType != null)
    {
        IComparable comparer = (IComparable)prop.GetValue(newItem);

        IList<T> query = base.Items;
        int idx = 0;
        if (direction == ListSortDirection.Ascending)
        {
            for (idx = 0; idx < query.Count - 1; idx++)
            {
                if (comparer.CompareTo(prop.GetValue(query[idx])) < 0)
                {
                    break;
                }
            }
        }
        else
        {
            for (idx = 0; idx < query.Count - 1; idx++)
            {
                if (comparer.CompareTo(prop.GetValue(query[idx])) > 0)
                {
                    break;
                }
            }
        }

        this.InsertItem(idx, newItem);
        return idx;
    }
    else
    {
        throw new NotSupportedException("Cannot sort by " + prop.Name +
            ". This" + prop.PropertyType.ToString() +
            " does not implement IComparable");
    }
}

0 个答案:

没有答案