(NugetPackage)AdvancedDataGridView对列表进行排序/筛选

时间:2018-06-21 12:29:33

标签: c# winforms datagridview

首先,我现在有一个datagridview,其中填充了列表中的数据。

我想为用户简化排​​序和过滤过程,所以我开始使用ADGV

它使用排序和过滤的类型,就像Excel一样。现在他们已经完成了所有方法,但是实际的排序/过滤是您需要自己做的事情。

我已经遵循了一些教程,但实际上它们并没有真正将List用作数据源。在tutorials中,他们使用“排序和筛选”方法,并且List不像在教程中那样接受。

是否可以像在视频here (4:45)中一样使用排序字符串/过滤字符串对linq列表进行排序/过滤。

4 个答案:

答案 0 :(得分:1)

如果您正在寻找一种内置方法来支持使用List<T>生成的FilterStringSortStringAdvancedDataGridView进行排序和过滤,那么答案是:不,没有内置方法。过滤器是在ADGVFilterMenu中生成的,据我所知,没有办法覆盖过滤器的生成。

但是您可以将List<T>转换为DataTable并仅使用这些字符串进行排序和过滤。例如:

private void Form1_Load(object sender, EventArgs e)
{
    var list = db.Products.ToList();
    this.productBindingSource.DataSource = list.ToDataTable(); 
}
private void advancedDataGridView1_SortStringChanged(object sender, EventArgs e)
{
    this.productBindingSource.Sort = advancedDataGridView1.SortString;
}
private void advancedDataGridView1_FilterStringChanged(object sender, EventArgs e)
{
    this.productBindingSource.Filter = advancedDataGridView1.FilterString;
}

在上面的示例中,我使用了this post中的ToDataTable扩展方法:

public static class EnumerableExtensions
{
    public static DataTable ToDataTable<T>(this IEnumerable<T> data)
    {
        PropertyDescriptorCollection properties =
            TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, 
                Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }
}

答案 1 :(得分:1)

我有一个对我有用的替代答案。

尽管上述答案很好,并且可以工作,因为您正在复制列表中的所有数据,如果这样做,则会失去数据绑定的好处。

例如,如果列表在应用程序中的其他位置发生更改,或者用户编辑了网格中的任何数据,则更改不会反映出来。这就是我遇到的问题。

因此,另一种可能的解决方案是使用动态linq并在FilterStringChanged事件处理程序中自己过滤对象列表。我为此写了一个解决方案,可以在这里找到:

https://github.com/davidegironi/advanceddatagridview/issues/24

这只是外面人们的另一种选择。

答案 2 :(得分:0)

    private void advancedDataGridView1_FilterStringChanged(object sender, Zuby.ADGV.AdvancedDataGridView.FilterEventArgs e)
    {
        advancedDataGridView1.DataSource = MyTable.Select(advancedDataGridView1.FilterString).CopyToDataTable();
    }

答案 3 :(得分:0)

    private void advancedDataGridView1_SortStringChanged(object sender, Zuby.ADGV.AdvancedDataGridView.SortEventArgs e)
    {
        if (e.SortString.Length == 0)
        {
            return;
        }
        string[] strtok = e.SortString.Split(',');
        foreach (string str in strtok)
        {
            string[] columnorder = str.Split(']');
            ListSortDirection lds = ListSortDirection.Ascending;
            if (columnorder[1].Trim().Equals("DESC"))
            {
                lds = ListSortDirection.Descending;
            }
            advancedDataGridView1.Sort(advancedDataGridView1.Columns[columnorder[0].Replace('[', ' ').Trim()], lds);
        }
    }