Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据源绑定到EF5实体集合时筛选DataGridView行_C#_Entity Framework_Datagridview_Databound - Fatal编程技术网

C# 当数据源绑定到EF5实体集合时筛选DataGridView行

C# 当数据源绑定到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"]

我有一个DataGridView,它被数据绑定到BindingList

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