如何排序数据从DataGridView与自动生成的列从BindingList

本文关键字:DataGridView 自动生成 BindingList 数据 何排序 排序 | 更新日期: 2023-09-27 17:49:33

我有一个DataGridView接收一个BindingList

dataGrid.DataSource = new BindingList<Value>(ValueList);

之后我尝试设置SortMode

dataGrid.Columns.OfType<DataGridViewColumn>().ToList()
    .ForEach(c =>
    {
        c.SortMode = DataGridViewColumnSortMode.Automatic;
    });

断点停止在它,但我的DataGridView是不可排序的…我试着点击标题,但什么也没发生。

这些列是自动生成的,我能做些什么来排序数据?

如何排序数据从DataGridView与自动生成的列从BindingList

我认为问题在于您需要创建一个实现必要排序功能的自定义绑定列表,以便DataGridView知道如何对每个列进行排序。

这篇文章提供了很好的信息让排序工作:

http://xiaonanstechblog.blogspot.com/2009/03/how-to-enable-column-sorting-on.html

如果你想过滤和排序,你可能想做一个IBindingListView接口的自定义实现:

http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglistview.aspx

DataGridView绑定到数据源 (DataView, BindingSource, Table, DataSet+"tablename")在所有情况下,它指的是DataView。获取对该DataView的引用,并根据需要设置Sort(和Filter):

DataView dv = null;
CurrencyManager cm = (CurrencyManager)(dgv.BindingContext[dgv.DataSource, dgv.DataMember]);
if (cm.List is BindingSource)
{
    // In case of BindingSource it may be chain of BindingSources+relations
    BindingSource bs = (BindingSource)cm.List;
    while (bs.List is BindingSource)
    { bs = bs.List as BindingSource; }
    if (bs.List is DataView)
    { dv = bs.List as DataView; }
}
else if (cm.List is DataView)
{
    // dgv bind to the DataView, Table or DataSet+"tablename"
    dv = cm.List as DataView;
}
if (dv != null)
{
    dv.Sort = "somedate desc, firstname";
    // dv.Filter = "lastname = 'Smith' OR lastname = 'Doe'";
    //  You can Set the Glyphs something like this:
    int somedateColIdx = 5;    // somedate
    int firstnameColIdx = 3;   // firstname
    dgv.Columns[somedateColIdx].HeaderCell.SortGlyphDirection = SortOrder.Descending;
    dgv.Columns[firstnameColIdx].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
}

注意:在Sort和Filter中使用的列名对应于DataTable中的列名,DataGridView中的列名是用于在dgv中显示单元格的控件的名称。您可以像这样获取DataView中使用的列名:

string colName = dgv.Columns[colIdx].DataPropertyName

取决于你想如何跟踪排序列(colSequence, colName, asc/desc, dgvColIdx),你可以决定如何构建Sort和Filter表达式,并在dgv中设置SortGlyph(我为简单起见做了硬编码)。