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