【发布时间】:2014-11-05 10:07:45
【问题描述】:
我创建了一个简单的 wmi 查询,然后创建了一个自定义集合。 我添加了一个过滤器,该过滤器从文本更改事件的文本框中获取字符串。 它按预期工作,但有一个主要缺点,每次您尝试过滤它实际上都是在进行查询。我想要它做的是本地存储集合并对该本地变量进行操作,而不是一遍又一遍地进行 wmi 查询。 我已经尝试了多种方法,但到目前为止还没有运气。 任何帮助将不胜感激! :)
这是我尝试过的一种方法...
主要cs:
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;
namespace myfilter
{
public partial class FilteringSample : Window
{
public FilteringSample()
{
InitializeComponent();
myProcesses items = new myProcesses();
lvUsers.ItemsSource = items.GetProcesses;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
view.Filter = UserFilter;
}
private bool UserFilter(object item)
{
if (String.IsNullOrEmpty(txtFilter.Text))
return true;
else
return ((item as myProcess).Name.IndexOf(txtFilter.Text, StringComparison.OrdinalIgnoreCase) >= 0);
}
private void txtFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
CollectionViewSource.GetDefaultView(lvUsers.ItemsSource).Refresh();
}
}
}
类cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;
namespace myfilter
{
class myProcesses
{
public IEnumerable<myProcess> GetProcesses
{
get
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process");
ManagementObjectCollection processList = searcher.Get();
myProcess myproc;
foreach (ManagementObject obj in processList)
{
if (obj != null)
{
myproc = new myProcess();
try
{
myproc.Name = obj["Name"].ToString();
}
catch { }
try
{
myproc.ID = obj["ProcessId"].ToString();
}
catch { }
yield return myproc;
}
}
}
}
}
class myProcess
{
public string Name { get; set; }
public string ID { get; set; }
}
}
XAML:
<Window x:Class="myfilter.FilteringSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FilteringSample" Height="200" Width="300">
<DockPanel Margin="10">
<TextBox DockPanel.Dock="Top" Margin="0,0,0,10" Name="txtFilter" TextChanged="txtFilter_TextChanged" />
<DataGrid Name="lvUsers">
</DataGrid>
</DockPanel>
</Window
>
【问题讨论】:
标签: c# wpf datagrid filter collectionview