Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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# 数据源中特定对象的动态通用搜索_C#_Winforms_Linq_Generics_Entity Framework 4 - Fatal编程技术网

C# 数据源中特定对象的动态通用搜索

C# 数据源中特定对象的动态通用搜索,c#,winforms,linq,generics,entity-framework-4,C#,Winforms,Linq,Generics,Entity Framework 4,我有一个使用实体框架和LINQ的windows窗体应用程序 有很多表单我使用BindingNavigator来浏览数据,我想在navigator中添加一个文本框来搜索特定的项目并导航到它,就像我为其中一个表单所做的那样,但现在我必须对其他表单执行相同的步骤,并在每个表单中添加相同的事件和代码,因此,我决定制作一个自定义ToolStripTextBox,并在每个表单中使用它,但我必须使其通用,因为每个表单使用不同的对象或实体,这就是我想到的: class ToolStripSearchBox<

我有一个使用实体框架和LINQ的windows窗体应用程序 有很多表单我使用BindingNavigator来浏览数据,我想在navigator中添加一个文本框来搜索特定的项目并导航到它,就像我为其中一个表单所做的那样,但现在我必须对其他表单执行相同的步骤,并在每个表单中添加相同的事件和代码,因此,我决定制作一个自定义ToolStripTextBox,并在每个表单中使用它,但我必须使其通用,因为每个表单使用不同的对象或实体,这就是我想到的:

class ToolStripSearchBox<T> : ToolStripTextBox
{
    BindingSource dataSource;
    int currentIndex;

    public ToolStripSearchBox()
        : base()
    {
        KeyUp += new KeyEventHandler(ToolStripSearchBox_KeyUp);
    }

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F4)
        {
            string patern = Text;
            List<T> TList = dataSource.List.Cast<T>().ToList();
            int res = 0;
            T foundT = default(T);

            if (int.TryParse(patern, out res))
            {
                foundT = TList.Where(j => j. == res).First();

            }
            else
            {
                foundT = TList.First(j => (j.FirstName + " " + j.LastName).Contains(patern));
            }
            if (foundT == null)
            {
                return;
            }

            dataSource.Position = dataSource.IndexOf(foundT);
        }
    }
}
类ToolStripSearchBox:ToolStripTextBox
{
绑定源数据源;
int-currentIndex;
公共ToolStripSearchBox()
:base()
{
KeyUp+=新的KeyEventHandler(ToolStripSearchBox\u KeyUp);
}
void ToolStripSearchBox_KeyUp(对象发送方,KeyEventArgs e)
{
if(e.KeyCode==Keys.F4)
{
字符串patern=文本;
List TList=dataSource.List.Cast().ToList();
int res=0;
T foundT=默认值(T);
if(内锥虫(外型,外型)
{
foundT=TList.Where(j=>j.==res.First();
}
其他的
{
foundT=TList.First(j=>(j.FirstName+“”+j.LastName).Contains(patern));
}
if(foundT==null)
{
返回;
}
dataSource.Position=dataSource.IndexOf(foundT);
}
}
}
但问题是每个实体都有不同的属性可供过滤,我曾想过使用字符串参数来传递对象属性名称,但我没有找到将其用于LINQ的方法

对不起,如果听写有错误,但英语不是我的第一语言
提前感谢我在您的代码中看到的“每个实体都有不同的属性要过滤”,您指的是像
FirstName
LastName
等属性

如果是这种情况,非常简单,您可以定义一个通用函数对象作为匹配器。您可以在构造时或初始化期间指定此选项。(我不太喜欢使用无参数构造函数的组件。)

也就是说,您的代码有很多问题:请记住,
First()
扩展方法在没有找到元素时会抛出异常;使用
FirstOrDefault()
。我看到您也在使用
foundT==null
。。我甚至怀疑那会不会编译。改为执行
foundT==default(T)

class ToolStripSearchBox<T> {

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        ...
            foundT = TList.FirstOrDefault(this.Matcher(j, patern));
        ...
    }
}
类ToolStripSearchBox{
void ToolStripSearchBox_KeyUp(对象发送方,KeyEventArgs e)
{
...
foundT=TList.FirstOrDefault(this.Matcher(j,paten));
...
}
}

非常感谢我想这就是我想要的,你对FirstOrDefault()和foundT==null的看法是正确的是,它不会编译,我会尝试一下
ToolStripSearchBox<Foo> fooSearchBox = new ToolStripSearchBox<Foo>();
fooSearchBox.Matcher = (j, pattern) => (j.Second + " " + j.Second).Contains(pattern);
class ToolStripSearchBox<T> {

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        ...
            foundT = TList.FirstOrDefault(this.Matcher(j, patern));
        ...
    }
}