C# 当数据源绑定到EF5实体集合时筛选DataGridView行
我有一个DataGridView,它被数据绑定到BindingListC# 当数据源绑定到EF5实体集合时筛选DataGridView行,c#,entity-framework,datagridview,databound,C#,Entity Framework,Datagridview,Databound,我有一个DataGridView,它被数据绑定到BindingList private void InitGrid() { Ctx.MyEntitySet.Load(); dataGridView1.DataSource = Ctx.MyEntitySet.Local.ToBindingList(); dataGridView1.Columns["Id"].Visible = false; dataGridView1.Columns["UnwantedCol1"]
private void InitGrid()
{
Ctx.MyEntitySet.Load();
dataGridView1.DataSource = Ctx.MyEntitySet.Local.ToBindingList();
dataGridView1.Columns["Id"].Visible = false;
dataGridView1.Columns["UnwantedCol1"].Visible = false;
dataGridView1.Columns["UnwantedCol2"].Visible = false;
dataGridView1.Columns["UnwantedCol3"].Visible = false;
}
还有一个过滤文本框,处理的TextChanged事件如下
private void textBoxFilter_TextChanged(object sender, EventArgs e)
{
try
{
string filter = textBoxFilter.Text.Trim();
((DataView)dataGridView1.DataSource).RowFilter = filter;
textBoxFilter.BackColor = SystemColors.AppWorkspace;
}
catch (Exception)
{
textBoxFilter.BackColor = Color.Red;
ToolTip tip = new ToolTip();
tip.SetToolTip(textBoxFilter, ex.Message);
}
}
我运行代码时,数据显示正确,但当我尝试在筛选文本框中键入类似“%sometext%”之类的ColumnName
时,会出现一个异常,说明我无法将“System.data.Entity.Internal.ObservableBackedBindingList`1[MyEntity]”强制转换为“System.data.DataView”
谁能给我一个指针吗
谢谢,
F
已解决:
添加了一个通用扩展方法
public static class LocalExtensions
{
public static IEnumerable<T> Filter<T>(this IEnumerable<T> list, Func<T, bool> filterParam)
{
return list.Where(filterParam);
}
}
基本上,您不能将数据直接放入DataGridView中。您需要定义并将BindingList分配给此BindingSource。请尝试以下操作,看看是否有效:
Ctx.MyEntitySet.Load();
BindingSource yourBS = new BindingSource();
yourBS.DataSource = Ctx.MyEntitySet.Local.ToBindingList();
dataGridView1.DataSource = yourBS;
dataGridView1.Columns["Id"].Visible = false;
dataGridView1.Columns["UnwantedCol1"].Visible = false;
dataGridView1.Columns["UnwantedCol2"].Visible = false;
dataGridView1.Columns["UnwantedCol3"].Visible = false;
我希望它能起作用
注意。您必须创建一个经过筛选的新绑定列表。使用LINQ很容易。看
试试看
{
string filter=textBoxFilter.Text.Trim();
dataGridView1.DataSource=新绑定列表(Ctx.MyEntitySet.Local.ToBindingList()。其中(x=>x.EntityPropertyToSearchIn1.ToUpper()。包含(筛选器)).ToList());
textBoxFilter.BackColor=SystemColors.AppWorkspace;
}
下面是扩展方法的VB等价物:
Imports System.Runtime.CompilerServices
Module LocalExtensions
<Extension()> _
Public Function Filter(Of T)(list As IEnumerable(Of T), filterParam As Func(Of T, Boolean)) As IEnumerable(Of T)
Return list.Where(filterParam)
End Function
End Module
导入System.Runtime.CompilerServices
模块本地扩展
_
公共函数Filter(Of T)(列表为IEnumerable(Of T),filterParam为Func(Of T,Boolean))为IEnumerable(Of T)
返回列表。其中(filterParam)
端函数
端模块
首先,我可以告诉您类型不兼容。您正在绑定要用作DataView(DataGridView的类型)的BindingList,这是不允许的。绑定已在工作。数据过滤不起作用。如果我应用您的编辑,我会在TextChanged eventhandler中得到相同的异常(使用BindingSource而不是BindingList)
try
{
string filter = textBoxFilter.Text.Trim();
dataGridView1.DataSource = new BindingList<YOUR_ENTITY>(Ctx.MyEntitySet.Local.ToBindingList().Where(x => x.EntityPropertyToSearchIn1.ToUpper().Contains(filter)).ToList<YOUR_ENTITY>());
textBoxFilter.BackColor = SystemColors.AppWorkspace;
}
Imports System.Runtime.CompilerServices
Module LocalExtensions
<Extension()> _
Public Function Filter(Of T)(list As IEnumerable(Of T), filterParam As Func(Of T, Boolean)) As IEnumerable(Of T)
Return list.Where(filterParam)
End Function
End Module