C# 如何通过3个不同的参数搜索我的列表
我在WPF中将文章列表作为C# 如何通过3个不同的参数搜索我的列表,c#,wpf,lambda,datagrid,expression,C#,Wpf,Lambda,Datagrid,Expression,我在WPF中将文章列表作为ItemsSource用于我的DataGrid,在同一窗口上,除了DataGrid。xaml我有一个文本框,可以在其中键入一些字母或数字并过滤我的DataGrid,现在我通过以下方式实现了搜索: 文章标题 文章捷径 现在我想实现按文章代码搜索,一篇文章可以包含几个不同的文章代码,现在我创建了按标题和快捷方式搜索,它看起来是这样的(我甚至不知道这样做是不是好方法(一直设置DataGrid源代码): 这是我的文章课: public class Article { p
ItemsSource
用于我的DataGrid
,在同一窗口上,除了DataGrid
。xaml我有一个文本框,可以在其中键入一些字母或数字并过滤我的DataGrid
,现在我通过以下方式实现了搜索:
文章标题
文章捷径
现在我想实现按文章代码搜索,一篇文章可以包含几个不同的文章代码,现在我创建了按标题和快捷方式搜索,它看起来是这样的(我甚至不知道这样做是不是好方法(一直设置DataGrid源代码):
这是我的文章课:
public class Article
{
public Article();
public List<ArticleCodes> ArticleCode { get; set; }
public string Title { get; set; }
public string Shortcut { get; set; }
}
所以lambda表达式mm8write应该如下所示:
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
string searchParameter = txtSearch.Text.Trim().ToLower();
var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Value) && code.Value.Contains(searchParameter)));
dtgArtikli.ItemsSource = matchingvalues;
}
但不幸的是,当我在txtSearch
textbox中键入“123321123321”时,没有结果,这是我们忘记的..hm
谢谢
干杯我建议您不要使用文本更改事件背后的代码,而是采用MVVM方法,将CLR属性与文本框的文本属性绑定,并为通过设置updatesourcetrigger=“Propertychanged”所做的每一次更改订阅它。您可以在该属性的setter中编写ArtialList筛选器逻辑,您就完成了 如果您在此实施过程中需要任何帮助,请告诉我 XAML
虚拟机
private observeCollection文章列表;
公共可观察收集文章列表
{
获取{return articleList;}
设置
{
articleList=价值;
//这里是INPC方法
}
}
私有字符串搜索参数;
公共字符串搜索参数
{
得到
{
返回搜索参数;
}
设置
{
搜索参数=值;
//ArtialList ItemSource的过滤逻辑如下
//这里是INPC方法
}
}
在这里,每当搜索文本框中的文本发生更改时,将调用SearchParameter CLR属性的set方法,它将调用您将编写的筛选器逻辑。尝试此操作,并用您要比较的ArticleCodes
类的属性的实际名称替换“Code”:
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
string searchParameter = txtSearch.Text.Trim().ToLower();
var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
|| (stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Code) && code.Code.ToLower().Contains(searchParameter))));
dtgArtikli.ItemsSource = matchingvalues;
}
伙计,请检查我的编辑。文章对象的ArticleCode集合是否填充了任何项目?你是对的,我没有返回ArticlesCode表单数据库,我记得我避免了,因为性能原因,如果我加载1000篇文章,每个文章上有10个ArticlesCode,这将是大量数据,因此我在dtgArticles Sel上实现了逻辑如果要获取我所选文章的代码,无论如何,我都必须在db上创建join,以便在表单加载时也返回articleCodes,我猜您编写的lambda表达式将用作charm:):)
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
string searchParameter = txtSearch.Text.Trim().ToLower();
var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Value) && code.Value.Contains(searchParameter)));
dtgArtikli.ItemsSource = matchingvalues;
}
<TextBox Text="{Binding SearchParameter,UpdateSourceTrigger=PropertyChanged}"
Height="30" Width="150" Margin="10">
</TextBox>
<DataGrid Name="ArticaldgGrid" ItemsSource="{Binding ArticleList}"
Height="300" Width="300">
</DataGrid>
private ObservableCollection<Article> articleList;
public ObservableCollection<Article> ArticleList
{
get { return articleList; }
set
{
articleList = value;
//INPC method here
}
}
private string searchParameter;
public string SearchParameter
{
get
{
return searchParameter;
}
set
{
searchParameter = value;
//Filter Logic for ArticalList ItemSource goes here
//INPC method here
}
}
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
string searchParameter = txtSearch.Text.Trim().ToLower();
var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
|| stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
|| (stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Code) && code.Code.ToLower().Contains(searchParameter))));
dtgArtikli.ItemsSource = matchingvalues;
}