首先,我现在有一个datagridview,其中填充了列表中的数据。
我想为用户简化排序和过滤过程,所以我开始使用ADGV。
它使用排序和过滤的类型,就像Excel一样。现在他们已经完成了所有方法,但是实际的排序/过滤是您需要自己做的事情。
我已经遵循了一些教程,但实际上它们并没有真正将List用作数据源。在tutorials中,他们使用“排序和筛选”方法,并且List不像在教程中那样接受。
是否可以像在视频here (4:45)中一样使用排序字符串/过滤字符串对linq列表进行排序/过滤。
答案 0 :(得分:1)
如果您正在寻找一种内置方法来支持使用List<T>
生成的FilterString
和SortString
对AdvancedDataGridView
进行排序和过滤,那么答案是:不,没有内置方法。过滤器是在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);
}
}