我有一个C#自定义MySortableBindingList : BindingList<MyClass>
它实现了排序的所有内容(SupportsSortingCore, SortPropertyCore, ApplySortCore(...)
等),其中MyClass : INotifyPropertyChanged
因此,我可以将此列表用于Forms DataGridView(myDataGridView1.DataSource = mySortableBindingList1
),并根据列/属性在我的GUI中对DataGridView进行排序。
现在的问题是: 我是否可以定义用户界面DataGridView
对MySortableBindingList
的顺序的影响?
因为现在,对GridView进行排序也会对BindingList进行排序,但我需要保留内部(原始)顺序,因为我需要使用存储的索引来访问列表。
提前谢谢!
答案 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
*/