在不更改Datasource / BindingList顺序的情况下对DataGridView进行排序

时间:2017-12-06 14:43:21

标签: c# forms datagridview bindinglist

我有一个C#自定义MySortableBindingList : BindingList<MyClass> 它实现了排序的所有内容(SupportsSortingCore, SortPropertyCore, ApplySortCore(...)等),其中MyClass : INotifyPropertyChanged

因此,我可以将此列表用于Forms DataGridView(myDataGridView1.DataSource = mySortableBindingList1),并根据列/属性在我的GUI中对DataGridView进行排序。

现在的问题是: 我是否可以定义用户界面DataGridViewMySortableBindingList的顺序的影响?

因为现在,对GridView进行排序也会对BindingList进行排序,但我需要保留内部(原始)顺序,因为我需要使用存储的索引来访问列表。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这与你的排序实现有关。我的建议是关注Chris Dogget's suggestion并下载开源BindingListView

用法很简单:

BindingList<Example> examples = new BindingList<Example>()
{
    new Example() { Foo = "foo1", Bar = "bar2" ),
    new Example() { Foo = "foo2", Bar = "bar4" ),
    new Example() { Foo = "foo3", Bar = "bar1" ),
    new Example() { Foo = "foo4", Bar = "bar3" ),
};

BindingListView blv = new BindingListView(examples);
dataGridView1.DataSource = blv;

烘焙排序并按原始顺序保留基础列表。使用以前的数据,我们可以遍历源和DataGridView并打印出结果,看它们是不同的。我们将使用for循环来演示您请求的索引:

BindingListView<Example> blv = this.dataGridView1.DataSource as BindingListView<Example>;
BindingList<Example> examples = examples.DataSource as BindingList<Example>;

Console.WriteLine("From BindingListView:");
for (int i = 0; i < examples.Count; i++)
{
    Example ex = examples[i];
    Console.WriteLine($"{ex.Foo} {ex.Bar}");
}

Console.WriteLine("\nFrom DataGridView:");

for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
    DataGridViewRow row = this.dataGridView1.Rows[i];
    Console.WriteLine($"{row.Cells["Foo"].Value} {row.Cells["Bar"].Value}");
}

DataGridView列对Bar进行排序时的输出:

/*
From BindingListView:
foo1 bar2
foo2 bar4
foo3 bar1
foo4 bar3

From DataGridView:
foo3 bar1
foo1 bar2
foo4 bar3
foo2 bar4
*/