【发布时间】:2015-01-19 19:09:56
【问题描述】:
我有一个大约 2500 个条目的 DataGrid。我希望用户能够进行搜索,并且对于不包含搜索词的行进行隐藏。
这是我的伪代码策略,我是 C#、.Net 和 WPF 的新手,因此请随意推荐替代方法。
for each Row in DataGrid
for each Column in Row
if Cell doesn't contains SearchQuery
hide Row
break
在 C# 中:
List<int> rowsWithoutMatch = new List<int>();
for (int i = 0; i < dataGrid.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dataGrid.
ItemContainerGenerator.ContainerFromIndex(i);
if (row != null)
{
for (int j = 0; j < dataGrid.Columns.Count; j++)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
if (presenter != null)
{
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(j);
if (cell != null)
{
TextBlock tb = cell.Content as TextBlock;
string content = tb.Text;
if (!(content).Contains(columnFilters[j]))
{
row.Visibility = Visibility.Collapsed;
break;
}
}
}
}
}
}
我遇到了这个奇怪的错误,row != null 仅在前 24 次迭代中,之后它全部为空,因此它停止遍历行。
我从this SO question 中了解到,这是因为 DataGrid 中只有 24 行可见,并且不在屏幕上的行都是空的。
我通过将标签VirtualizingStackPanel.IsVirtualizing="False" 放入DataGrid XMAL 解决了这个问题,但现在它一次加载所有行并且速度非常慢。与添加dataGrid.UpdateLayout();
dataGrid.ScrollIntoView(dataGrid.Items[i]); 相同,但也有更多错误。
我也试过这个,速度更快
dataGrid.DataContext = dt.AsDataView();
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow dr = dt.Rows[i];
for (int j = 0; j < columnFilters.Length; j++)
{
if (! dr[j].ToString().Contains( columnFilters[j] ))
{
dr.Delete();
break ;
}
}
}
dataGrid.DataContext = dt.AsDataView();
但是我有一个连接到 DataGrid 的 SQL 数据库,删除行成为一个大问题。另外,切换可见性似乎比乱用 DataTable 更好。
我怎样才能让它更快?甚至,什么是完全不同/更好的方法来做我想做的事情?对于这类事情,windows 窗体似乎有更多选择,但从 WPF 改回来为时已晚。
非常感谢。
【问题讨论】:
-
只需绑定到 LINQ 查询输出
-
@Blam 你能说得更详细些吗?我是 C# 新手,不熟悉 LINQ
-
您不应循环显示列表。您的 SQL 查询应该在您的模型中填充一个 DataTable,并且您的视图应该在该表上有 DataView,只显示您需要的字段和您需要的行
-
这应该让你开始msdn.microsoft.com/en-us/library/bb546190(v=vs.110).aspx我也有collectionviewsource
标签: c# wpf datagrid datatable wpfdatagrid